From 9e80f0954d45465dfba261c5b5a501e77eb595c9 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Mon, 30 Jul 2012 20:48:03 +0200 Subject: [PATCH 001/481] Add loading of routes in OC_Router --- lib/router.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/router.php b/lib/router.php index f037ecdfef..4b6b076e21 100644 --- a/lib/router.php +++ b/lib/router.php @@ -16,6 +16,19 @@ class OC_Router { protected $collections = array(); protected $collection = null; + /** + * loads the api routes + */ + public function loadRoutes(){ + // TODO cache + foreach(OC_APP::getEnabledApps() as $app){ + $file = OC_App::getAppPath($app).'/appinfo/routes.php'; + if(file_exists($file)){ + require_once($file); + } + } + } + public function useCollection($name) { if (!isset($this->collections[$name])) { $this->collections[$name] = new RouteCollection(); From 3e8b6e816a3f89ac20f22fdde630946058e5d184 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Mon, 30 Jul 2012 20:50:32 +0200 Subject: [PATCH 002/481] Create OC_Router in OC::init --- lib/base.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/base.php b/lib/base.php index 5041f43648..29a3502e35 100644 --- a/lib/base.php +++ b/lib/base.php @@ -62,6 +62,10 @@ class OC{ * requested file of app */ public static $REQUESTEDFILE = ''; + /* + * OC router + */ + public static $router = null; /** * check if owncloud runs in cli mode */ @@ -354,6 +358,8 @@ class OC{ OC_User::useBackend(new OC_User_Database()); OC_Group::useBackend(new OC_Group_Database()); + OC::$router = new OC_Router(); + // Load Apps // This includes plugins for users and filesystems as well global $RUNTIME_NOAPPS; From ca1454ab1a9a20f51544d8822b4c16ef00c35264 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 31 Jul 2012 22:33:11 +0200 Subject: [PATCH 003/481] Routing: Method needs to be uppercase --- lib/route.php | 10 +++++----- lib/router.php | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/route.php b/lib/route.php index 0d3339add6..df3a18e844 100644 --- a/lib/route.php +++ b/lib/route.php @@ -10,27 +10,27 @@ use Symfony\Component\Routing\Route; class OC_Route extends Route { public function method($method) { - $this->setRequirement('_method', $method); + $this->setRequirement('_method', strtoupper($method)); return $this; } public function post() { - $this->method('post'); + $this->method('POST'); return $this; } public function get() { - $this->method('get'); + $this->method('GET'); return $this; } public function put() { - $this->method('put'); + $this->method('PUT'); return $this; } public function delete() { - $this->method('delete'); + $this->method('DELETE'); return $this; } diff --git a/lib/router.php b/lib/router.php index 4b6b076e21..5dd51e7915 100644 --- a/lib/router.php +++ b/lib/router.php @@ -49,7 +49,7 @@ class OC_Router { if (isset($parameters['action'])) { $action = $parameters['action']; if (!is_callable($action)) { - var_dump($action); + var_dump($action); throw new Exception('not a callable action'); } unset($parameters['action']); From 3722928c46d0e4ec1935e4da4087b76aee24dd5d Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 2 Aug 2012 17:47:38 +0200 Subject: [PATCH 004/481] Change access to router object to getter function --- lib/base.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/base.php b/lib/base.php index 29a3502e35..43588944d0 100644 --- a/lib/base.php +++ b/lib/base.php @@ -62,14 +62,14 @@ class OC{ * requested file of app */ public static $REQUESTEDFILE = ''; - /* - * OC router - */ - public static $router = null; /** * check if owncloud runs in cli mode */ public static $CLI = false; + /* + * OC router + */ + protected static $router = null; /** * SPL autoload */ @@ -275,6 +275,14 @@ class OC{ } } + public static function getRouter() { + if (!isset(OC::$router)) { + OC::$router = new OC_Router(); + } + + return OC::$router; + } + public static function init(){ // register autoloader spl_autoload_register(array('OC','autoload')); @@ -358,8 +366,6 @@ class OC{ OC_User::useBackend(new OC_User_Database()); OC_Group::useBackend(new OC_Group_Database()); - OC::$router = new OC_Router(); - // Load Apps // This includes plugins for users and filesystems as well global $RUNTIME_NOAPPS; From 72b2324b68c51baf140c6fab7957b59c31de4832 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 2 Aug 2012 17:59:18 +0200 Subject: [PATCH 005/481] Move loading of routes to OC::getRouter function --- lib/base.php | 1 + lib/router.php | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index 43588944d0..0d9ececc0c 100644 --- a/lib/base.php +++ b/lib/base.php @@ -278,6 +278,7 @@ class OC{ public static function getRouter() { if (!isset(OC::$router)) { OC::$router = new OC_Router(); + OC::$router->loadRoutes(); } return OC::$router; diff --git a/lib/router.php b/lib/router.php index 5dd51e7915..a721255f29 100644 --- a/lib/router.php +++ b/lib/router.php @@ -16,10 +16,15 @@ class OC_Router { protected $collections = array(); protected $collection = null; + public function __construct() { + // TODO cache + $this->loadRoutes(); + } + /** * loads the api routes */ - public function loadRoutes(){ + public function loadRoutes() { // TODO cache foreach(OC_APP::getEnabledApps() as $app){ $file = OC_App::getAppPath($app).'/appinfo/routes.php'; From f63b9b44d8ac62a136d4cd6844e72af7a8044703 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 2 Aug 2012 21:51:31 +0200 Subject: [PATCH 006/481] Routing: combine all routes into one set --- lib/router.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/router.php b/lib/router.php index a721255f29..3ba2125465 100644 --- a/lib/router.php +++ b/lib/router.php @@ -15,30 +15,34 @@ use Symfony\Component\Routing\Exception\ResourceNotFoundException; class OC_Router { protected $collections = array(); protected $collection = null; - - public function __construct() { - // TODO cache - $this->loadRoutes(); - } + protected $root = null; /** * loads the api routes */ public function loadRoutes() { // TODO cache + $this->root = $this->getCollection('root'); foreach(OC_APP::getEnabledApps() as $app){ $file = OC_App::getAppPath($app).'/appinfo/routes.php'; if(file_exists($file)){ + $this->useCollection($app); require_once($file); + $collection = $this->getCollection($app); + $this->root->addCollection($collection, '/apps/'.$app); } } } - public function useCollection($name) { + protected function getCollection($name) { if (!isset($this->collections[$name])) { $this->collections[$name] = new RouteCollection(); } - $this->collection = $this->collections[$name]; + return $this->collections[$name]; + } + + public function useCollection($name) { + $this->collection = $this->getCollection($name); } public function create($name, $pattern, array $defaults = array(), array $requirements = array()) { @@ -49,7 +53,7 @@ class OC_Router { public function match($url) { $context = new RequestContext($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']); - $matcher = new UrlMatcher($this->collection, $context); + $matcher = new UrlMatcher($this->root, $context); $parameters = $matcher->match($url); if (isset($parameters['action'])) { $action = $parameters['action']; From 87d1cdb94567d5514e0a2988f69935d932b58ff6 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 11 Aug 2012 00:04:43 +0200 Subject: [PATCH 007/481] Fix for running doing routing in lib/ocs.php --- lib/ocs.php | 7 ++++++- lib/route.php | 4 +++- lib/router.php | 8 +++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/ocs.php b/lib/ocs.php index d7a7951fab..1df08df9fa 100644 --- a/lib/ocs.php +++ b/lib/ocs.php @@ -23,6 +23,9 @@ * */ +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\Exception\MethodNotAllowedException; + /** * Class to handle open collaboration services API requests * @@ -93,7 +96,7 @@ class OC_OCS { $format = self::readData($method, 'format', 'text', ''); $router = new OC_Router(); - $router->useCollection('ocs'); + $router->useCollection('root'); // CONFIG $router->create('config', '/config.{format}') ->defaults(array('format' => $format)) @@ -247,6 +250,8 @@ class OC_OCS { $txt='Invalid query, please check the syntax. API specifications are here: http://www.freedesktop.org/wiki/Specifications/open-collaboration-services. DEBUG OUTPUT:'."\n"; $txt.=OC_OCS::getdebugoutput(); echo(OC_OCS::generatexml($format,'failed',999,$txt)); + } catch (MethodNotAllowedException $e) { + OC_Response::setStatus(405); } exit(); } diff --git a/lib/route.php b/lib/route.php index df3a18e844..772446e561 100644 --- a/lib/route.php +++ b/lib/route.php @@ -50,7 +50,9 @@ class OC_Route extends Route { if (isset($requirements['_method'])) { $method = $requirements['_method']; } - $this->method($method); + if ($method) { + $this->method($method); + } return $this; } diff --git a/lib/router.php b/lib/router.php index 3ba2125465..dbcaff4026 100644 --- a/lib/router.php +++ b/lib/router.php @@ -10,19 +10,21 @@ use Symfony\Component\Routing\Matcher\UrlMatcher; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RouteCollection; //use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; class OC_Router { protected $collections = array(); protected $collection = null; protected $root = null; + public function __construct() { + // TODO cache + $this->root = $this->getCollection('root'); + } + /** * loads the api routes */ public function loadRoutes() { - // TODO cache - $this->root = $this->getCollection('root'); foreach(OC_APP::getEnabledApps() as $app){ $file = OC_App::getAppPath($app).'/appinfo/routes.php'; if(file_exists($file)){ From 1763de08d0a4e8374cd21bf71d825b92426509f1 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 11 Aug 2012 00:57:46 +0200 Subject: [PATCH 008/481] Routing: Fix construction of RequestContext --- lib/router.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/router.php b/lib/router.php index dbcaff4026..eca59d6dc3 100644 --- a/lib/router.php +++ b/lib/router.php @@ -54,7 +54,11 @@ class OC_Router { } public function match($url) { - $context = new RequestContext($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']); + $baseUrl = OC_Helper::linkTo('', 'index.php'); + $method = $_SERVER['REQUEST_METHOD']; + $host = OC_Request::serverHost(); + $schema = OC_Request::serverProtocol(); + $context = new RequestContext($baseUrl, $method, $host, $schema); $matcher = new UrlMatcher($this->root, $context); $parameters = $matcher->match($url); if (isset($parameters['action'])) { From 1025e451a7610a9e5b50e7e99e808cb2d1915236 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 11 Aug 2012 01:00:26 +0200 Subject: [PATCH 009/481] Add router match to OC::handleRequest --- lib/base.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/base.php b/lib/base.php index b276cf5924..a05d84fbae 100644 --- a/lib/base.php +++ b/lib/base.php @@ -421,6 +421,15 @@ class OC{ header('location: '.OC_Helper::linkToRemote('webdav')); return; } + try { + OC::getRouter()->match(OC_Request::getPathInfo()); + return; + } catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) { + //header('HTTP/1.0 404 Not Found'); + } catch (Symfony\Component\Routing\Exception\MethodNotAllowedException $e) { + OC_Response::setStatus(405); + return; + } // Handle app css files if(substr(OC::$REQUESTEDFILE,-3) == 'css') { self::loadCSSFile(); From 8c024947440e2f15a9effe5fe6d91e60e8571a07 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sun, 12 Aug 2012 16:16:22 +0200 Subject: [PATCH 010/481] Routing: Prepare load funtions to be called from OC_Router --- lib/base.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/base.php b/lib/base.php index a05d84fbae..0d7e224d35 100644 --- a/lib/base.php +++ b/lib/base.php @@ -430,9 +430,12 @@ class OC{ OC_Response::setStatus(405); return; } + $app = OC::$REQUESTEDAPP; + $file = OC::$REQUESTEDFILE; + $param = array('app' => $app, 'file' => $file); // Handle app css files - if(substr(OC::$REQUESTEDFILE,-3) == 'css') { - self::loadCSSFile(); + if(substr($file,-3) == 'css') { + self::loadCSSFile($param); return; } // Someone is logged in : @@ -442,14 +445,12 @@ class OC{ OC_User::logout(); header("Location: ".OC::$WEBROOT.'/'); }else{ - $app = OC::$REQUESTEDAPP; - $file = OC::$REQUESTEDFILE; if(is_null($file)) { - $file = 'index.php'; + $param['file'] = 'index.php'; } - $file_ext = substr($file, -3); + $file_ext = substr($param['file'], -3); if ($file_ext != 'php' - || !self::loadAppScriptFile($app, $file)) { + || !self::loadAppScriptFile($param)) { header('HTTP/1.0 404 Not Found'); } } @@ -459,7 +460,9 @@ class OC{ self::handleLogin(); } - protected static function loadAppScriptFile($app, $file) { + public static function loadAppScriptFile($param) { + $app = $param['app']; + $file = $param['file']; $app_path = OC_App::getAppPath($app); $file = $app_path . '/' . $file; unset($app, $app_path); @@ -470,9 +473,9 @@ class OC{ return false; } - protected static function loadCSSFile() { - $app = OC::$REQUESTEDAPP; - $file = OC::$REQUESTEDFILE; + public static function loadCSSFile($param) { + $app = $param['app']; + $file = $param['file']; $app_path = OC_App::getAppPath($app); if (file_exists($app_path . '/' . $file)) { $app_web_path = OC_App::getAppWebPath($app); From db4111f6d50d5bf2195d4a082ffc9dcea1d911ce Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sun, 12 Aug 2012 16:52:36 +0200 Subject: [PATCH 011/481] Routing: Add some core routes --- core/routes.php | 19 +++++++++++++++++++ lib/base.php | 3 ++- lib/router.php | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 core/routes.php diff --git a/core/routes.php b/core/routes.php new file mode 100644 index 0000000000..04b42d2059 --- /dev/null +++ b/core/routes.php @@ -0,0 +1,19 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +$this->create('app_css', '/apps/{app}/{file}') + ->requirements(array('file' => '.*.css')) + ->action('OC', 'loadCSSFile'); +$this->create('app_index_script', '/apps/{app}/') + ->defaults(array('file' => 'index.php')) + //->requirements(array('file' => '.*.php')) + ->action('OC', 'loadAppScriptFile'); +$this->create('app_script', '/apps/{app}/{file}') + ->defaults(array('file' => 'index.php')) + ->requirements(array('file' => '.*.php')) + ->action('OC', 'loadAppScriptFile'); diff --git a/lib/base.php b/lib/base.php index 0d7e224d35..3abfdb3566 100644 --- a/lib/base.php +++ b/lib/base.php @@ -440,8 +440,8 @@ class OC{ } // Someone is logged in : if(OC_User::isLoggedIn()) { - OC_App::loadApps(); if(isset($_GET["logout"]) and ($_GET["logout"])) { + OC_App::loadApps(); OC_User::logout(); header("Location: ".OC::$WEBROOT.'/'); }else{ @@ -461,6 +461,7 @@ class OC{ } public static function loadAppScriptFile($param) { + OC_App::loadApps(); $app = $param['app']; $file = $param['file']; $app_path = OC_App::getAppPath($app); diff --git a/lib/router.php b/lib/router.php index eca59d6dc3..65fc51aff2 100644 --- a/lib/router.php +++ b/lib/router.php @@ -34,6 +34,8 @@ class OC_Router { $this->root->addCollection($collection, '/apps/'.$app); } } + $this->useCollection('root'); + require_once('core/routes.php'); } protected function getCollection($name) { From 16dacba4900ce2bbb4f26040f6f5c2b698eae5da Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sun, 12 Aug 2012 16:53:00 +0200 Subject: [PATCH 012/481] Routing: And start using them from php --- lib/helper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/helper.php b/lib/helper.php index 8c362747a2..3cdb3e53c2 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -42,8 +42,8 @@ class OC_Helper { // Check if the app is in the app folder if( $app_path && file_exists( $app_path.'/'.$file )){ if(substr($file, -3) == 'php' || substr($file, -3) == 'css'){ - $urlLinkTo = OC::$WEBROOT . '/?app=' . $app; - $urlLinkTo .= ($file!='index.php')?'&getfile=' . urlencode($file):''; + $urlLinkTo = OC::$WEBROOT . '/index.php/apps/' . $app; + $urlLinkTo .= ($file!='index.php') ? '/' . $file : ''; }else{ $urlLinkTo = OC_App::getAppWebPath($app) . '/' . $file; } From 4954e46bb2ba36c749b638111dc90500e12cedf7 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 15 Aug 2012 17:38:55 +0200 Subject: [PATCH 013/481] Use core routes in js too --- core/js/js.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/js/js.js b/core/js/js.js index 7bded8e141..6881090f62 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -54,9 +54,9 @@ OC={ var isCore=OC.coreApps.indexOf(app)!=-1; var link=OC.webroot; if((file.substring(file.length-3) == 'php' || file.substring(file.length-3) == 'css') && !isCore){ - link+='/?app=' + app; + link+='/index.php/apps/' + app; if (file != 'index.php') { - link+='&getfile='; + link+='/'; if(type){ link+=encodeURI(type + '/'); } From ddfb9de14747b363bfcb70df00cea34b47abc0a3 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 15 Aug 2012 18:13:08 +0200 Subject: [PATCH 014/481] Fix linkTo calls for new routing --- apps/contacts/js/contacts.js | 2 +- apps/contacts/lib/search.php | 2 +- apps/files/index.php | 4 ++-- apps/files/js/fileactions.js | 2 +- apps/files/js/filelist.js | 2 +- apps/files_archive/js/archive.js | 4 ++-- apps/gallery/lib/tiles.php | 4 ++-- apps/gallery/templates/index.php | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index 35637de050..2e62b5cf13 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -1477,7 +1477,7 @@ OC.Contacts={ } var contact = params.data ? $('
  • ' + params.data.displayname+'
  • ') diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php index 53aa2b4849..c86bc12c5b 100644 --- a/apps/contacts/lib/search.php +++ b/apps/contacts/lib/search.php @@ -11,7 +11,7 @@ class OC_Search_Provider_Contacts extends OC_Search_Provider{ $vcards = OC_Contacts_VCard::all($addressbook['id']); foreach($vcards as $vcard){ if(substr_count(strtolower($vcard['fullname']), strtolower($query)) > 0) { - $link = OCP\Util::linkTo('contacts', 'index.php').'&id='.urlencode($vcard['id']); + $link = OCP\Util::linkTo('contacts', 'index.php').'?id='.urlencode($vcard['id']); $results[]=new OC_Search_Result($vcard['fullname'], '', $link, (string)$l->t('Contact'));//$name,$text,$link,$type } } diff --git a/apps/files/index.php b/apps/files/index.php index 79bed8e357..ffe9493272 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -75,11 +75,11 @@ foreach( explode( '/', $dir ) as $i ){ // make breadcrumb und filelist markup $list = new OCP\Template( 'files', 'part.list', '' ); $list->assign( 'files', $files, false ); -$list->assign( 'baseURL', OCP\Util::linkTo('files', 'index.php').'&dir=', false); +$list->assign( 'baseURL', OCP\Util::linkTo('files', 'index.php').'?dir=', false); $list->assign( 'downloadURL', OCP\Util::linkTo('files', 'download.php').'?file=', false); $breadcrumbNav = new OCP\Template( 'files', 'part.breadcrumb', '' ); $breadcrumbNav->assign( 'breadcrumb', $breadcrumb, false ); -$breadcrumbNav->assign( 'baseURL', OCP\Util::linkTo('files', 'index.php').'&dir=', false); +$breadcrumbNav->assign( 'baseURL', OCP\Util::linkTo('files', 'index.php').'?dir=', false); $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index b6f4d0b089..cecfddbf1c 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -168,7 +168,7 @@ FileActions.register('all','Rename',function(){return OC.imagePath('core','actio }); FileActions.register('dir','Open','',function(filename){ - window.location=OC.linkTo('files', 'index.php') + '&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); + window.location=OC.linkTo('files', 'index.php') + '?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); }); FileActions.setDefault('dir','Open'); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index a414c5f830..0bfc810baf 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -41,7 +41,7 @@ FileList={ html = $('').attr({ "data-type": "dir", "data-size": size, "data-file": name}); td = $('').attr({"class": "filename", "style": 'background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')' }); td.append(''); - var link_elem = $('').attr({ "class": "name", "href": OC.linkTo('files', 'index.php')+"&dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/') }); + var link_elem = $('').attr({ "class": "name", "href": OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/') }); link_elem.append($('').addClass('nametext').text(name)); link_elem.append($('').attr({'class': 'uploadtext', 'currentUploads': 0})); td.append(link_elem); diff --git a/apps/files_archive/js/archive.js b/apps/files_archive/js/archive.js index 9fb9853e29..48ec031be6 100644 --- a/apps/files_archive/js/archive.js +++ b/apps/files_archive/js/archive.js @@ -8,11 +8,11 @@ $(document).ready(function() { if(typeof FileActions!=='undefined'){ FileActions.register('application/zip','Open','',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); + window.location=OC.linkTo('files', 'index.php')+'?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); }); FileActions.setDefault('application/zip','Open'); FileActions.register('application/x-gzip','Open','',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); + window.location=OC.linkTo('files', 'index.php')+'?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); }); FileActions.setDefault('application/x-gzip','Open'); } diff --git a/apps/gallery/lib/tiles.php b/apps/gallery/lib/tiles.php index e36d26d319..3903d2dde7 100644 --- a/apps/gallery/lib/tiles.php +++ b/apps/gallery/lib/tiles.php @@ -95,11 +95,11 @@ class TileSingle extends TileBase { public function get($extra = '') { // !HACK! file path needs to be encoded twice because files app decode twice url, so any special chars like + or & in filename // !HACK! will result in failing of opening them - return ''; + return ''; } public function getMiniatureSrc() { - return \OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath()); + return \OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'?filepath='.urlencode($this->getPath()); } public function getPath() { diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php index b2efd5342f..b0f2203603 100644 --- a/apps/gallery/templates/index.php +++ b/apps/gallery/templates/index.php @@ -18,7 +18,7 @@ $(document).ready(function() { for ($i = 0; $i < count($paths); $i++) { $path .= urlencode($paths[$i]).'/'; $classess = 'crumb'.($i == count($paths)-1?' last':''); - echo ''; + echo ''; } } From 3b9fac8f81b76af988ea620a207e6c65fa665589 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 15 Aug 2012 19:55:26 +0200 Subject: [PATCH 015/481] Fix gallery image view --- apps/gallery/lib/tiles.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/gallery/lib/tiles.php b/apps/gallery/lib/tiles.php index 3903d2dde7..54fb613a8b 100644 --- a/apps/gallery/lib/tiles.php +++ b/apps/gallery/lib/tiles.php @@ -93,9 +93,7 @@ class TileSingle extends TileBase { } public function get($extra = '') { - // !HACK! file path needs to be encoded twice because files app decode twice url, so any special chars like + or & in filename - // !HACK! will result in failing of opening them - return ''; + return ''; } public function getMiniatureSrc() { From ceec5e593c677ed9e9339739d0a66a28e4f25d12 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 7 Sep 2012 16:19:08 +0200 Subject: [PATCH 016/481] Remove redundant loadApps --- lib/base.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index fc682fecfc..6af558ae9d 100644 --- a/lib/base.php +++ b/lib/base.php @@ -465,7 +465,6 @@ class OC{ OC_App::loadApps(); OC_User::setupBackends(); if(isset($_GET["logout"]) and ($_GET["logout"])) { - OC_App::loadApps(); OC_User::logout(); header("Location: ".OC::$WEBROOT.'/'); }else{ From 3efe1d3b24e65ed76d521c24b0cfe4e0ff2e7af5 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 12 Sep 2012 18:00:33 +0200 Subject: [PATCH 017/481] Add linkToRoute functionality --- lib/helper.php | 14 ++++++++++++++ lib/router.php | 29 +++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/helper.php b/lib/helper.php index ed4bf53250..269327b531 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -28,6 +28,20 @@ class OC_Helper { private static $mimetypes=array(); private static $tmpFiles=array(); + /** + * @brief Creates an url using a defined route + * @param $route + * @param $parameters + * @param $args array with param=>value, will be appended to the returned url + * @returns the url + * + * Returns a url to the given app and file. + */ + public static function linkToRoute( $route, $parameters = array() ) { + $urlLinkTo = OC::getRouter()->generate($route, $parameters); + return $urlLinkTo; + } + /** * @brief Creates an url * @param $app app diff --git a/lib/router.php b/lib/router.php index 65fc51aff2..da491e217f 100644 --- a/lib/router.php +++ b/lib/router.php @@ -7,6 +7,7 @@ */ use Symfony\Component\Routing\Matcher\UrlMatcher; +use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RouteCollection; //use Symfony\Component\Routing\Route; @@ -16,7 +17,14 @@ class OC_Router { protected $collection = null; protected $root = null; + protected $generator= null; + public function __construct() { + $baseUrl = OC_Helper::linkTo('', 'index.php'); + $method = $_SERVER['REQUEST_METHOD']; + $host = OC_Request::serverHost(); + $schema = OC_Request::serverProtocol(); + $this->context = new RequestContext($baseUrl, $method, $host, $schema); // TODO cache $this->root = $this->getCollection('root'); } @@ -56,12 +64,7 @@ class OC_Router { } public function match($url) { - $baseUrl = OC_Helper::linkTo('', 'index.php'); - $method = $_SERVER['REQUEST_METHOD']; - $host = OC_Request::serverHost(); - $schema = OC_Request::serverProtocol(); - $context = new RequestContext($baseUrl, $method, $host, $schema); - $matcher = new UrlMatcher($this->root, $context); + $matcher = new UrlMatcher($this->root, $this->context); $parameters = $matcher->match($url); if (isset($parameters['action'])) { $action = $parameters['action']; @@ -77,4 +80,18 @@ class OC_Router { throw new Exception('no action available'); } } + + public function getGenerator() + { + if (null !== $this->generator) { + return $this->generator; + } + + return $this->generator = new UrlGenerator($this->root, $this->context); + } + + public function generate($name, $parameters = array(), $absolute = false) + { + return $this->getGenerator()->generate($name, $parameters, $absolute); + } } From ffe04182a86a326861763a5e6afa3577c52e07a5 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 17 Sep 2012 16:01:25 +0200 Subject: [PATCH 018/481] Added methods OC_DB::insertIfNotExist() and OCP\DB::insertIfNotExist(). --- lib/db.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++ lib/public/db.php | 21 ++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/lib/db.php b/lib/db.php index 4d8e5a1a86..8598f659ca 100644 --- a/lib/db.php +++ b/lib/db.php @@ -512,6 +512,55 @@ class OC_DB { return true; } + /** + * @brief Insert a row if a matching row doesn't exists. + * @returns true/false + * + */ + public static function insertIfNotExist($table, $input) { + self::connect(); + $prefix = OC_Config::getValue( "dbtableprefix", "oc_" ); + $table = str_replace( '*PREFIX*', $prefix, $table ); + + if(is_null(self::$type)) { + self::$type=OC_Config::getValue( "dbtype", "sqlite" ); + } + $type = self::$type; + + $query = ''; + // differences in escaping of table names ('`' for mysql) and getting the current timestamp + if( $type == 'sqlite' || $type == 'sqlite3' ) { + $query = 'REPLACE OR INSERT INTO "' . $table . '" ("' + . implode('","', array_keys($input)) . '") VALUES("' + . implode('","', array_values($input)) . '")'; + } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql') { + $query = 'INSERT INTO `' .$table . '` (' + . implode(',', array_keys($input)) . ') SELECT \'' + . implode('\',\'', array_values($input)) . '\' FROM ' . $table . ' WHERE '; + + foreach($input as $key => $value) { + $query .= $key . " = '" . $value . '\' AND '; + } + $query = substr($query, 0, strlen($query) - 5); + $query .= ' HAVING COUNT(*) = 0'; + } + // TODO: oci should be use " (quote) instead of ` (backtick). + //OC_Log::write('core', __METHOD__ . ', type: ' . $type . ', query: ' . $query, OC_Log::DEBUG); + + try { + $result=self::$connection->prepare($query); + } catch(PDOException $e) { + $entry = 'DB Error: "'.$e->getMessage().'"
    '; + $entry .= 'Offending command was: '.$query.'
    '; + OC_Log::write('core', $entry,OC_Log::FATAL); + error_log('DB error: '.$entry); + die( $entry ); + } + + $result = new PDOStatementWrapper($result); + $result->execute(); + } + /** * @brief does minor chages to query * @param $query Query string diff --git a/lib/public/db.php b/lib/public/db.php index 6ce62b27ca..b9e56985e9 100644 --- a/lib/public/db.php +++ b/lib/public/db.php @@ -45,6 +45,27 @@ class DB { return(\OC_DB::prepare($query,$limit,$offset)); } + /** + * @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') + * ); + * @returns true/false + * + */ + public static function insertIfNotExist($table, $input) { + return(\OC_DB::insertIfNotExist($table, $input)); + } + /** * @brief gets last value of autoincrement * @param $table string The optional table name (will replace *PREFIX*) and add sequence suffix From b1a6acde30232367f4e8d66372fedfd1065c5d5a Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 17 Sep 2012 16:03:15 +0200 Subject: [PATCH 019/481] Added separate table for OC_VCategories and category/object (event/contact etc.) relations. --- db_structure.xml | 138 ++++++++++++++++++ lib/vcategories.php | 339 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 430 insertions(+), 47 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index 2256dff943..5576db1ab8 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -661,4 +661,142 @@ + + + *dbprefix*vcategory + + + + + id + integer + 0 + true + 1 + true + 4 + + + + uid + text + + true + 64 + + + + type + text + + true + 64 + + + + category + text + + true + 255 + + + + uid_index + + uid + ascending + + + + + type_index + + type + ascending + + + + + category_index + + category + ascending + + + + + uid_type_category_index + true + + uid + ascending + + + type + ascending + + + category + ascending + + + + +
    + + + + *dbprefix*vcategory_to_object + + + + + objid + integer + 0 + true + true + 4 + + + + categoryid + integer + 0 + true + true + 4 + + + + type + text + + true + 64 + + + + true + true + category_object_index + + categoryid + ascending + + + objid + ascending + + + type + ascending + + + + + +
    + diff --git a/lib/vcategories.php b/lib/vcategories.php index 6b1d6a316f..08faa0d903 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -28,52 +28,187 @@ * 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 an app, and + * 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. - * NOTE: There is a limitation in that the the configvalue field in the - * preferences table is a varchar(255). */ class OC_VCategories { - const PREF_CATEGORIES_LABEL = 'extra_categories'; + /** * Categories */ private $categories = array(); + + /** + * Used for storing objectid/categoryname pairs while rescanning. + */ + private static $relations = array(); - private $app = null; + private $type = null; private $user = null; + private static $category_table = '*PREFIX*vcategory'; + private static $relation_table = '*PREFIX*vcategory_to_object'; + + const FORMAT_LIST = 0; + const FORMAT_MAP = 1; /** * @brief Constructor. - * @param $app The application identifier e.g. 'contacts' or 'calendar'. + * @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($app, $user=null, $defcategories=array()) { - $this->app = $app; + public function __construct($type, $user=null, $defcategories=array()) { + $this->type = $type; $this->user = is_null($user) ? OC_User::getUser() : $user; - $categories = trim(OC_Preferences::getValue($this->user, $app, self::PREF_CATEGORIES_LABEL, '')); - if ($categories) { - $categories = @unserialize($categories); + + $this->loadCategories(); + OCP\Util::writeLog('core', __METHOD__ . ', categories: ' + . print_r($this->categories, true), + OCP\Util::DEBUG + ); + + if($defcategories && count($this->categories) === 0) { + $this->add($defcategories, true); } - $this->categories = is_array($categories) ? $categories : $defcategories; } + /** + * @brief Load categories from db. + */ + private function loadCategories() { + $this->categories = array(); + $result = null; + $sql = 'SELECT `id`, `category` FROM `*PREFIX*vcategory` ' + . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`'; + try { + $stmt = OCP\DB::prepare($sql); + $result = $stmt->execute(array($this->user, $this->type)); + } 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']; + } + } + } + + + /** + * @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 `*PREFIX*vcategory` ' + . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`'; + try { + $stmt = OCP\DB::prepare($sql); + $result = $stmt->execute(array($user, $type)); + 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() { - //OC_Log::write('core','OC_VCategories::categories: '.print_r($this->categories, true), OC_Log::DEBUG); + public function categories($format = null) { if(!$this->categories) { return array(); } - usort($this->categories, 'strnatcasecmp'); // usort to also renumber the keys - return $this->categories; + $categories = array_values($this->categories); + uasort($categories, 'strnatcasecmp'); + if($format == self::FORMAT_MAP) { + $catmap = array(); + foreach($categories as $category) { + $catmap[] = array( + 'id' => $this->array_searchi($category, $this->categories), + 'name' => $category + ); + } + return $catmap; + } + return $categories; } + /** + * @brief Get the a list if items belonging to $category. + * @param string|integer $category Category id or name. + * @param string $table The name of table to query. + * @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. + */ + 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)); + } catch(Exception $e) { + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::ERROR); + } + + 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. @@ -90,16 +225,21 @@ class OC_VCategories { * @param $sync bool When true, save the categories * @returns bool Returns false on error. */ - public function add($names, $sync=false) { + public function add($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 != '') { + 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); + } } if(count($newones) > 0) { $this->categories = array_merge($this->categories, $newones); @@ -114,8 +254,8 @@ class OC_VCategories { * @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($vobject, $sync=false) { - $this->add($vobject->getAsArray('CATEGORIES'), $sync); + public function loadFromVObject($id, $vobject, $sync=false) { + $this->add($vobject->getAsArray('CATEGORIES'), $sync, $id); } /** @@ -128,23 +268,54 @@ class OC_VCategories { * $result = $stmt->execute(); * $objects = array(); * if(!is_null($result)) { - * while( $row = $result->fetchRow()) { - * $objects[] = $row['carddata']; + * while( $row = $result->fetchRow()){ + * $objects[] = array($row['id'], $row['carddata']); * } * } * $categories->rescan($objects); */ public function rescan($objects, $sync=true, $reset=true) { - if($reset === true) { + + if($reset === true) { + $result = null; + // Find all objectid/categoryid pairs. + try { + $stmt = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*vcategory` ' + . 'WHERE `uid` = ? AND `type` = ?'); + $result = $stmt->execute(array($this->user, $this->type)); + } 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 `*PREFIX*vcategory_to_object` ' + . 'WHERE `categoryid` = ? AND `type`= ?'); + while( $row = $result->fetchRow()) { + $stmt->execute(array($row['id'], $this->type)); + } + } + try { + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory` ' + . 'WHERE `uid` = ? AND `type` = ?'); + $result = $stmt->execute(array($this->user, $this->type)); + } 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) { - //OC_Log::write('core','OC_VCategories::rescan: '.substr($object, 0, 100).'(...)', OC_Log::DEBUG); - $vobject = OC_VObject::parse($object); + $vobject = OC_VObject::parse($object[1]); if(!is_null($vobject)) { - $this->loadFromVObject($vobject, $sync); + // Load the categories + $this->loadFromVObject($object[0], $vobject, $sync); } else { - OC_Log::write('core','OC_VCategories::rescan, unable to parse. ID: '.', '.substr($object, 0, 100).'(...)', OC_Log::DEBUG); + OC_Log::write('core', __METHOD__ . ', unable to parse. ID: ' . ', ' + . substr($object, 0, 100) . '(...)', OC_Log::DEBUG); } } $this->save(); @@ -155,15 +326,58 @@ class OC_VCategories { */ private function save() { if(is_array($this->categories)) { - usort($this->categories, 'strnatcasecmp'); // usort to also renumber the keys - $escaped_categories = serialize($this->categories); - OC_Preferences::setValue($this->user, $this->app, self::PREF_CATEGORIES_LABEL, $escaped_categories); - OC_Log::write('core','OC_VCategories::save: '.print_r($this->categories, true), OC_Log::DEBUG); + foreach($this->categories as $category) { + OCP\DB::insertIfNotExist('*PREFIX*vcategory', + array( + 'uid' => $this->user, + 'type' => $this->type, + 'category' => $category, + )); + } + // 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) { + OCP\DB::insertIfNotExist('*PREFIX*vcategory_to_object', + array( + 'objid' => $relation['objid'], + 'categoryid' => $catid, + 'type' => $this->type, + )); + } + } + self::$relations = array(); // reset } else { - OC_Log::write('core','OC_VCategories::save: $this->categories is not an array! '.print_r($this->categories, true), OC_Log::ERROR); + OC_Log::write('core', __METHOD__.', $this->categories is not an array! ' + . print_r($this->categories, true), OC_Log::ERROR); } } - + + /** + * @brief Delete category/object relations from the db + * @param $id The id of the object + * @param $type The type of object (event/contact/task/journal). + * Defaults to the type set in the instance + */ + public function purgeObject($id, $type = null) { + $type = is_null($type) ? $this->type : $type; + try { + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory_to_object` ' + . 'WHERE `objid` = ? AND `type`= ?'); + $stmt->execute(array($id, $type)); + } catch(Exception $e) { + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::ERROR); + } + } + /** * @brief Delete categories from the db and from all the vobject supplied * @param $names An array of categories to delete @@ -173,37 +387,65 @@ class OC_VCategories { if(!is_array($names)) { $names = array($names); } - OC_Log::write('core','OC_VCategories::delete, before: '.print_r($this->categories, true), OC_Log::DEBUG); + //OC_Log::write('core', __METHOD__ . ', before: ' + // . print_r($this->categories, true), OC_Log::DEBUG); foreach($names as $name) { - OC_Log::write('core','OC_VCategories::delete: '.$name, OC_Log::DEBUG); + //OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG); if($this->hasCategory($name)) { - //OC_Log::write('core','OC_VCategories::delete: '.$name.' got it', OC_Log::DEBUG); unset($this->categories[$this->array_searchi($name, $this->categories)]); } + try { + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory` WHERE ' + . '`uid` = ? AND `type` = ? AND `category` = ?'); + $result = $stmt->execute(array($this->user, $this->type, $name)); + } catch(Exception $e) { + OCP\Util::writeLog('core', __METHOD__ . ', exception: ' + . $e->getMessage(), OCP\Util::ERROR); + } } - $this->save(); - OC_Log::write('core','OC_VCategories::delete, after: '.print_r($this->categories, true), OC_Log::DEBUG); + //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)) { - $categories = $vobject->getAsArray('CATEGORIES'); - //OC_Log::write('core','OC_VCategories::delete, before: '.$key.': '.print_r($categories, true), OC_Log::DEBUG); + $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); - //OC_Log::write('core','OC_VCategories::delete, loop: '.$name.', '.print_r($idx, true), OC_Log::DEBUG); if($idx !== false) { - OC_Log::write('core','OC_VCategories::delete, unsetting: '.$categories[$this->array_searchi($name, $categories)], OC_Log::DEBUG); + OC_Log::write('core', __METHOD__ + .', unsetting: ' + . $categories[$this->array_searchi($name, $categories)], + OC_Log::DEBUG); unset($categories[$this->array_searchi($name, $categories)]); - //unset($categories[$idx]); } } - //OC_Log::write('core','OC_VCategories::delete, after: '.$key.': '.print_r($categories, true), OC_Log::DEBUG); - $vobject->setString('CATEGORIES', implode(',', $categories)); + $object->setString('CATEGORIES', implode(',', $categories)); + if($vobject !== $object) { + $vobject[$componentname] = $object; + } $value[1] = $vobject->serialize(); $objects[$key] = $value; } else { - OC_Log::write('core','OC_VCategories::delete, unable to parse. ID: '.$value[0].', '.substr($value[1], 0, 50).'(...)', OC_Log::DEBUG); + OC_Log::write('core', __METHOD__ + .', unable to parse. ID: ' . $value[0] . ', ' + . substr($value[1], 0, 50) . '(...)', OC_Log::DEBUG); } } } @@ -222,7 +464,10 @@ class OC_VCategories { if(!is_array($haystack)) { return false; } - return array_search(strtolower($needle),array_map('strtolower',$haystack)); + return array_search( + strtolower($needle), + array_map('strtolower', $haystack) + ); } } From dbdf3bde7ccf721cfc1efa4d13262bd6f444de73 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 28 Sep 2012 22:19:37 +0200 Subject: [PATCH 020/481] Implement route for download in OC_Search_Provider_File --- apps/files/appinfo/routes.php | 12 ++++++++++++ lib/route.php | 5 +++++ lib/search/provider/file.php | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 apps/files/appinfo/routes.php diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php new file mode 100644 index 0000000000..e1ab560803 --- /dev/null +++ b/apps/files/appinfo/routes.php @@ -0,0 +1,12 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +$this->create('download', 'download{file}') + ->requirements(array('file' => '.*')) + ->actionInclude('files/download.php'); + diff --git a/lib/route.php b/lib/route.php index 772446e561..ba9d1724d1 100644 --- a/lib/route.php +++ b/lib/route.php @@ -64,4 +64,9 @@ class OC_Route extends Route { $this->setDefault('action', $action); return $this; } + + public function actionInclude($file) { + $function = create_function('$param', 'unset($param["_route"]);$_GET=$param;unset($param);require_once "'.$file.'";'); + $this->action($function); + } } diff --git a/lib/search/provider/file.php b/lib/search/provider/file.php index 21fae0c1ce..e4e976ed7f 100644 --- a/lib/search/provider/file.php +++ b/lib/search/provider/file.php @@ -10,12 +10,11 @@ class OC_Search_Provider_File extends OC_Search_Provider{ $name = basename($path); $text = ''; - $path = urlencode($path); if($mime=='httpd/unix-directory') { $link = OC_Helper::linkTo( 'files', 'index.php', array('dir' => $path)); $type = 'Files'; }else{ - $link = OC_Helper::linkTo( 'files', 'download.php', array('file' => $path)); + $link = OC_Helper::linkToRoute( 'download', array('file' => $path)); $mimeBase = $fileData['mimepart']; switch($mimeBase) { case 'audio': From d0bd2bbf2728cdf472044d76aea97f0d4809774a Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 28 Sep 2012 23:15:19 +0200 Subject: [PATCH 021/481] Convert menu entries of settings pages to use router --- core/routes.php | 15 +++++++++++++++ lib/app.php | 18 ++++++++++++------ settings/admin.php | 2 +- settings/apps.php | 2 +- settings/help.php | 3 +-- settings/personal.php | 2 +- settings/settings.php | 2 +- settings/users.php | 4 ++-- 8 files changed, 34 insertions(+), 14 deletions(-) diff --git a/core/routes.php b/core/routes.php index 04b42d2059..9a84eb64a3 100644 --- a/core/routes.php +++ b/core/routes.php @@ -6,6 +6,21 @@ * See the COPYING-README file. */ +// Core settings pages +$this->create('settings_help', '/settings/help') + ->actionInclude('settings/help.php'); +$this->create('settings_personal', '/settings/personal') + ->actionInclude('settings/personal.php'); +$this->create('settings_settings', '/settings') + ->actionInclude('settings/settings.php'); +$this->create('settings_users', '/settings/users') + ->actionInclude('settings/users.php'); +$this->create('settings_apps', '/settings/apps') + ->actionInclude('settings/apps.php'); +$this->create('settings_admin', '/settings/admin') + ->actionInclude('settings/admin.php'); + +// Not specifically routed $this->create('app_css', '/apps/{app}/{file}') ->requirements(array('file' => '.*.css')) ->action('OC', 'loadCSSFile'); diff --git a/lib/app.php b/lib/app.php index 7889339e42..71add88380 100755 --- a/lib/app.php +++ b/lib/app.php @@ -282,33 +282,33 @@ class OC_App{ // by default, settings only contain the help menu if(OC_Config::getValue('knowledgebaseenabled', true)==true) { $settings = array( - array( "id" => "help", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "help.php" ), "name" => $l->t("Help"), "icon" => OC_Helper::imagePath( "settings", "help.svg" )) + array( "id" => "help", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_help" ), "name" => $l->t("Help"), "icon" => OC_Helper::imagePath( "settings", "help.svg" )) ); } // if the user is logged-in if (OC_User::isLoggedIn()) { // personal menu - $settings[] = array( "id" => "personal", "order" => 1, "href" => OC_Helper::linkTo( "settings", "personal.php" ), "name" => $l->t("Personal"), "icon" => OC_Helper::imagePath( "settings", "personal.svg" )); + $settings[] = array( "id" => "personal", "order" => 1, "href" => OC_Helper::linkToRoute( "settings_personal" ), "name" => $l->t("Personal"), "icon" => OC_Helper::imagePath( "settings", "personal.svg" )); // if there are some settings forms if(!empty(self::$settingsForms)) // settings menu - $settings[]=array( "id" => "settings", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "settings.php" ), "name" => $l->t("Settings"), "icon" => OC_Helper::imagePath( "settings", "settings.svg" )); + $settings[]=array( "id" => "settings", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_settings" ), "name" => $l->t("Settings"), "icon" => OC_Helper::imagePath( "settings", "settings.svg" )); //SubAdmins are also allowed to access user management if(OC_SubAdmin::isSubAdmin($_SESSION["user_id"]) || OC_Group::inGroup( $_SESSION["user_id"], "admin" )) { // admin users menu - $settings[] = array( "id" => "core_users", "order" => 2, "href" => OC_Helper::linkTo( "settings", "users.php" ), "name" => $l->t("Users"), "icon" => OC_Helper::imagePath( "settings", "users.svg" )); + $settings[] = array( "id" => "core_users", "order" => 2, "href" => OC_Helper::linkToRoute( "settings_users" ), "name" => $l->t("Users"), "icon" => OC_Helper::imagePath( "settings", "users.svg" )); } // if the user is an admin if(OC_Group::inGroup( $_SESSION["user_id"], "admin" )) { // admin apps menu - $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php" ).'?installed', "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); + $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkToRoute( "settings_apps" ).'?installed', "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); - $settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "admin.php" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); + $settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_admin" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); } } @@ -485,6 +485,12 @@ class OC_App{ public static function getCurrentApp() { $script=substr($_SERVER["SCRIPT_NAME"], strlen(OC::$WEBROOT)+1); $topFolder=substr($script, 0, strpos($script, '/')); + if (empty($topFolder)) { + $path_info = OC_Request::getPathInfo(); + if ($path_info) { + $topFolder=substr($path_info, 1, strpos($path_info, '/', 1)-1); + } + } if($topFolder=='apps') { $length=strlen($topFolder); return substr($script, $length+1, strpos($script, '/', $length+1)-$length-1); diff --git a/settings/admin.php b/settings/admin.php index a36f219038..9cb70353f9 100755 --- a/settings/admin.php +++ b/settings/admin.php @@ -5,8 +5,8 @@ * See the COPYING-README file. */ -require_once '../lib/base.php'; OC_Util::checkAdminUser(); +OC_App::loadApps(); OC_Util::addStyle( "settings", "settings" ); OC_Util::addScript( "settings", "admin" ); diff --git a/settings/apps.php b/settings/apps.php index a1c1bf6aa5..8134b44143 100644 --- a/settings/apps.php +++ b/settings/apps.php @@ -21,8 +21,8 @@ * */ -require_once '../lib/base.php'; OC_Util::checkAdminUser(); +OC_App::loadApps(); // Load the files we need OC_Util::addStyle( "settings", "settings" ); diff --git a/settings/help.php b/settings/help.php index 9157308dd5..69a5ec9c14 100644 --- a/settings/help.php +++ b/settings/help.php @@ -5,9 +5,8 @@ * See the COPYING-README file. */ -require_once '../lib/base.php'; OC_Util::checkLoggedIn(); - +OC_App::loadApps(); // Load the files we need OC_Util::addStyle( "settings", "settings" ); diff --git a/settings/personal.php b/settings/personal.php index 4f92985c79..ce9065247d 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -5,8 +5,8 @@ * See the COPYING-README file. */ -require_once '../lib/base.php'; OC_Util::checkLoggedIn(); +OC_App::loadApps(); // Highlight navigation entry OC_Util::addScript( 'settings', 'personal' ); diff --git a/settings/settings.php b/settings/settings.php index 24099ef574..1e05452ec4 100644 --- a/settings/settings.php +++ b/settings/settings.php @@ -5,8 +5,8 @@ * See the COPYING-README file. */ -require_once '../lib/base.php'; OC_Util::checkLoggedIn(); +OC_App::loadApps(); OC_Util::addStyle( 'settings', 'settings' ); OC_App::setActiveNavigationEntry( 'settings' ); diff --git a/settings/users.php b/settings/users.php index e76505cc78..6eaae47453 100644 --- a/settings/users.php +++ b/settings/users.php @@ -5,8 +5,8 @@ * See the COPYING-README file. */ -require_once '../lib/base.php'; OC_Util::checkSubAdminUser(); +OC_App::loadApps(); // We have some javascript foo! OC_Util::addScript( 'settings', 'users' ); @@ -57,4 +57,4 @@ $tmpl->assign( 'subadmins', $subadmins); $tmpl->assign( 'numofgroups', count($accessiblegroups)); $tmpl->assign( 'quota_preset', $quotaPreset); $tmpl->assign( 'default_quota', $defaultQuota); -$tmpl->printPage(); \ No newline at end of file +$tmpl->printPage(); From 210ea4d9d9a3488918c898beb6d6508c60686ad1 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 29 Sep 2012 18:03:34 +0200 Subject: [PATCH 022/481] fix actioninclude --- lib/route.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/route.php b/lib/route.php index ba9d1724d1..c5a8bd2aa3 100644 --- a/lib/route.php +++ b/lib/route.php @@ -66,7 +66,7 @@ class OC_Route extends Route { } public function actionInclude($file) { - $function = create_function('$param', 'unset($param["_route"]);$_GET=$param;unset($param);require_once "'.$file.'";'); + $function = create_function('$param', 'unset($param["_route"]);$_GET=array_merge($_GET,$param);unset($param);require_once "'.$file.'";'); $this->action($function); } } From bb136b9adf021cb154ff05222d3439373312bbc5 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 29 Sep 2012 18:08:54 +0200 Subject: [PATCH 023/481] Make the settings ajax calls use the router --- core/js/js.js | 7 +++- core/routes.php | 14 +------ settings/ajax/apps/ocs.php | 3 -- settings/ajax/changepassword.php | 2 - settings/ajax/creategroup.php | 2 - settings/ajax/createuser.php | 2 - settings/ajax/disableapp.php | 2 - settings/ajax/enableapp.php | 2 - settings/ajax/getlog.php | 3 -- settings/ajax/lostpassword.php | 2 - settings/ajax/openid.php | 3 -- settings/ajax/removegroup.php | 3 -- settings/ajax/removeuser.php | 3 -- settings/ajax/setlanguage.php | 3 -- settings/ajax/setloglevel.php | 1 - settings/ajax/setquota.php | 3 -- settings/ajax/togglegroups.php | 3 -- settings/ajax/togglesubadmins.php | 5 +-- settings/ajax/userlist.php | 4 +- settings/js/users.js | 2 +- settings/routes.php | 62 +++++++++++++++++++++++++++++++ 21 files changed, 72 insertions(+), 59 deletions(-) create mode 100644 settings/routes.php diff --git a/core/js/js.js b/core/js/js.js index 39a58a2459..ffe3507a4e 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -88,7 +88,12 @@ var OC={ } link+=file; }else{ - link+='/'; + if (app == 'settings' && type == 'ajax') { + link+='/index.php/'; + } + else { + link+='/'; + } if(!isCore){ link+='apps/'; } diff --git a/core/routes.php b/core/routes.php index 9a84eb64a3..b0f41dd286 100644 --- a/core/routes.php +++ b/core/routes.php @@ -6,19 +6,7 @@ * See the COPYING-README file. */ -// Core settings pages -$this->create('settings_help', '/settings/help') - ->actionInclude('settings/help.php'); -$this->create('settings_personal', '/settings/personal') - ->actionInclude('settings/personal.php'); -$this->create('settings_settings', '/settings') - ->actionInclude('settings/settings.php'); -$this->create('settings_users', '/settings/users') - ->actionInclude('settings/users.php'); -$this->create('settings_apps', '/settings/apps') - ->actionInclude('settings/apps.php'); -$this->create('settings_admin', '/settings/admin') - ->actionInclude('settings/admin.php'); +require_once('settings/routes.php'); // Not specifically routed $this->create('app_css', '/apps/{app}/{file}') diff --git a/settings/ajax/apps/ocs.php b/settings/ajax/apps/ocs.php index fb78cc8924..4d6f1116e7 100644 --- a/settings/ajax/apps/ocs.php +++ b/settings/ajax/apps/ocs.php @@ -6,9 +6,6 @@ * See the COPYING-README file. */ -// Init owncloud -require_once '../../../lib/base.php'; - OC_JSON::checkAdminUser(); $l = OC_L10N::get('settings'); diff --git a/settings/ajax/changepassword.php b/settings/ajax/changepassword.php index b251fea504..200fdec26d 100644 --- a/settings/ajax/changepassword.php +++ b/settings/ajax/changepassword.php @@ -1,7 +1,5 @@ OC_Preferences::getValue($user, 'files', 'quota', 'default')); } } -OC_JSON::success(array('data' => $users)); \ No newline at end of file +OC_JSON::success(array('data' => $users)); diff --git a/settings/js/users.js b/settings/js/users.js index 20bd94993b..81a3181ba5 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -130,7 +130,7 @@ var UserList={ if (typeof UserList.offset === 'undefined') { UserList.offset = $('tbody tr').length; } - $.get(OC.filePath('settings', 'ajax', 'userlist.php'), { offset: UserList.offset }, function(result) { + $.get(OC.filePath('settings', 'ajax', 'userlist'), { offset: UserList.offset }, function(result) { if (result.status === 'success') { $.each(result.data, function(index, user) { var tr = UserList.add(user.name, user.groups, user.subadmin, user.quota, false); diff --git a/settings/routes.php b/settings/routes.php new file mode 100644 index 0000000000..b64a357be0 --- /dev/null +++ b/settings/routes.php @@ -0,0 +1,62 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +// Settings pages +$this->create('settings_help', '/settings/help') + ->actionInclude('settings/help.php'); +$this->create('settings_personal', '/settings/personal') + ->actionInclude('settings/personal.php'); +$this->create('settings_settings', '/settings') + ->actionInclude('settings/settings.php'); +$this->create('settings_users', '/settings/users') + ->actionInclude('settings/users.php'); +$this->create('settings_apps', '/settings/apps') + ->actionInclude('settings/apps.php'); +$this->create('settings_admin', '/settings/admin') + ->actionInclude('settings/admin.php'); +// Settings ajax actions +// users +$this->create('settings_admin', '/settings/ajax/userlist') + ->actionInclude('settings/ajax/userlist.php'); +$this->create('settings_ajax_createuser', '/settings/ajax/createuser.php') + ->actionInclude('settings_ajax_createuser'); +$this->create('settings_ajax_removeuser', '/settings/ajax/removeuser.php') + ->actionInclude('settings/ajax/removeuser.php'); +$this->create('settings_ajax_setquota', '/settings/ajax/setquota.php') + ->actionInclude('settings/ajax/setquota.php'); +$this->create('settings_ajax_creategroup', '/settings/ajax/creategroup.php') + ->actionInclude('settings_ajax_creategroup'); +$this->create('settings_ajax_togglegroups', '/settings/ajax/togglegroups.php') + ->actionInclude('settings/ajax/togglegroups.php'); +$this->create('settings_ajax_togglesubadmins', '/settings/ajax/togglesubadmins.php') + ->actionInclude('settings/ajax/togglesubadmins.php'); +$this->create('settings_ajax_removegroup', '/settings/ajax/removegroup.php') + ->actionInclude('settings/ajax/removegroup.php'); +$this->create('settings_ajax_changepassword', '/settings/ajax/changepassword.php') + ->actionInclude('settings/ajax/changepassword.php'); +// personel +$this->create('settings_ajax_lostpassword', '/settings/ajax/lostpassword.php') + ->actionInclude('settings/ajax/lostpassword.php'); +$this->create('settings_ajax_setlanguage', '/settings/ajax/setlanguage.php') + ->actionInclude('settings/ajax/setlanguage.php'); +// apps +$this->create('settings_ajax_apps_ocs', '/settings/ajax/apps/ocs.php') + ->actionInclude('settings/ajax/apps/ocs.php'); +$this->create('settings_ajax_enableapp', '/settings/ajax/enableapp.php') + ->actionInclude('settings/ajax/enableapp.php'); +$this->create('settings_ajax_disableapp', '/settings/ajax/disableapp.php') + ->actionInclude('settings/ajax/disableapp.php'); +// admin +$this->create('settings_ajax_getlog', '/settings/ajax/getlog.php') + ->actionInclude('settings/ajax/getlog.php'); +$this->create('settings_ajax_setloglevel', '/settings/ajax/setloglevel.php') + ->actionInclude('settings/ajax/setloglevel.php'); + +// apps/user_openid +$this->create('settings_ajax_openid', '/settings/ajax/openid.php') + ->actionInclude('settings/ajax/openid.php'); From de1bfe9d6b50c37c6999ff652a31535b0a2faf41 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 2 Oct 2012 21:57:51 +0200 Subject: [PATCH 024/481] Make the core ajax calls use the router --- core/ajax/appconfig.php | 1 - core/ajax/requesttoken.php | 1 - core/ajax/share.php | 1 - core/ajax/translations.php | 3 --- core/ajax/vcategories/add.php | 1 - core/ajax/vcategories/delete.php | 1 - core/ajax/vcategories/edit.php | 1 - core/js/js.js | 2 +- core/routes.php | 21 +++++++++++++++++++++ 9 files changed, 22 insertions(+), 10 deletions(-) diff --git a/core/ajax/appconfig.php b/core/ajax/appconfig.php index 1b43afa74f..4f26dedc79 100644 --- a/core/ajax/appconfig.php +++ b/core/ajax/appconfig.php @@ -5,7 +5,6 @@ * See the COPYING-README file. */ -require_once "../../lib/base.php"; OC_Util::checkAdminUser(); OCP\JSON::callCheck(); diff --git a/core/ajax/requesttoken.php b/core/ajax/requesttoken.php index 96d5402e62..84089de8b9 100644 --- a/core/ajax/requesttoken.php +++ b/core/ajax/requesttoken.php @@ -26,7 +26,6 @@ * @return json: success/error state indicator including a fresh request token * @author Christian Reiner */ -require_once '../../lib/base.php'; // don't load apps or filesystem for this task $RUNTIME_NOAPPS = TRUE; diff --git a/core/ajax/share.php b/core/ajax/share.php index 446d4cc32e..b6f96bfd34 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -18,7 +18,6 @@ * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . */ -require_once '../../lib/base.php'; OC_JSON::checkLoggedIn(); OCP\JSON::callCheck(); diff --git a/core/ajax/translations.php b/core/ajax/translations.php index 75679da2c0..e22cbad470 100644 --- a/core/ajax/translations.php +++ b/core/ajax/translations.php @@ -21,9 +21,6 @@ * */ -// Init owncloud -require_once '../../lib/base.php'; - $app = $_POST["app"]; $l = OC_L10N::get( $app ); diff --git a/core/ajax/vcategories/add.php b/core/ajax/vcategories/add.php index 81fa06dbf1..8d31275dbf 100644 --- a/core/ajax/vcategories/add.php +++ b/core/ajax/vcategories/add.php @@ -14,7 +14,6 @@ function debug($msg) { OC_Log::write('core', 'ajax/vcategories/add.php: '.$msg, OC_Log::DEBUG); } -require_once '../../../lib/base.php'; OC_JSON::checkLoggedIn(); $category = isset($_GET['category'])?strip_tags($_GET['category']):null; $app = isset($_GET['app'])?$_GET['app']:null; diff --git a/core/ajax/vcategories/delete.php b/core/ajax/vcategories/delete.php index cd46a25b79..74b0220870 100644 --- a/core/ajax/vcategories/delete.php +++ b/core/ajax/vcategories/delete.php @@ -15,7 +15,6 @@ function debug($msg) { OC_Log::write('core', 'ajax/vcategories/delete.php: '.$msg, OC_Log::DEBUG); } -require_once '../../../lib/base.php'; OC_JSON::checkLoggedIn(); $app = isset($_POST['app'])?$_POST['app']:null; $categories = isset($_POST['categories'])?$_POST['categories']:null; diff --git a/core/ajax/vcategories/edit.php b/core/ajax/vcategories/edit.php index a0e67841c5..caeebcaa94 100644 --- a/core/ajax/vcategories/edit.php +++ b/core/ajax/vcategories/edit.php @@ -15,7 +15,6 @@ function debug($msg) { OC_Log::write('core', 'ajax/vcategories/edit.php: '.$msg, OC_Log::DEBUG); } -require_once '../../../lib/base.php'; OC_JSON::checkLoggedIn(); $app = isset($_GET['app'])?$_GET['app']:null; diff --git a/core/js/js.js b/core/js/js.js index ffe3507a4e..8f3b5a6af1 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -88,7 +88,7 @@ var OC={ } link+=file; }else{ - if (app == 'settings' && type == 'ajax') { + if ((app == 'settings' || app == 'core') && type == 'ajax') { link+='/index.php/'; } else { diff --git a/core/routes.php b/core/routes.php index b0f41dd286..d396ddd647 100644 --- a/core/routes.php +++ b/core/routes.php @@ -8,6 +8,27 @@ require_once('settings/routes.php'); +// Core ajax actions +// AppConfig +$this->create('core_ajax_appconfig', '/core/ajax/appconfig.php') + ->actionInclude('core/ajax/appconfig.php'); +// RequestToken +$this->create('core_ajax_requesttoken', '/core/ajax/requesttoken.php') + ->actionInclude('core/ajax/requesttoken.php'); +// Share +$this->create('core_ajax_share', '/core/ajax/share.php') + ->actionInclude('core/ajax/share.php'); +// Translations +$this->create('core_ajax_translations', '/core/ajax/translations.php') + ->actionInclude('core/ajax/translations.php'); +// VCategories +$this->create('core_ajax_vcategories_add', '/core/ajax/vcategories/add.php') + ->actionInclude('core/ajax/vcategories/add.php'); +$this->create('core_ajax_vcategories_delete', '/core/ajax/vcategories/delete.php') + ->actionInclude('core/ajax/vcategories/delete.php'); +$this->create('core_ajax_vcategories_edit', '/core/ajax/vcategories/edit.php') + ->actionInclude('core/ajax/vcategories/edit.php'); + // Not specifically routed $this->create('app_css', '/apps/{app}/{file}') ->requirements(array('file' => '.*.css')) From 6bfb2ca2a8ca18fe45997d720b1adc7781d51d2a Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 2 Oct 2012 22:46:37 +0200 Subject: [PATCH 025/481] Added post_deleteUser hook to VCategories. Added methods for adding/removing object/category relations. --- lib/vcategories.php | 116 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 110 insertions(+), 6 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 08faa0d903..499fffad3f 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -21,6 +21,7 @@ * */ +OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_VCategories', 'post_deleteUser'); /** * Class for easy access to categories in VCARD, VEVENT, VTODO and VJOURNAL. @@ -147,7 +148,7 @@ class OC_VCategories { /** * @brief Get the a list if items belonging to $category. * @param string|integer $category Category id or name. - * @param string $table The name of table to query. + * @param array $tableinfo Array in the form {'tablename' => table, 'fields' => ['field1', 'field2']} * @param int $limit * @param int $offset * @@ -327,7 +328,7 @@ class OC_VCategories { private function save() { if(is_array($this->categories)) { foreach($this->categories as $category) { - OCP\DB::insertIfNotExist('*PREFIX*vcategory', + OCP\DB::insertIfNotExist(self::$category_table, array( 'uid' => $this->user, 'type' => $this->type, @@ -345,7 +346,7 @@ class OC_VCategories { $catid = $this->array_searchi($relation['category'], $categories); OC_Log::write('core', __METHOD__ . 'catid, ' . $relation['category'] . ' ' . $catid, OC_Log::DEBUG); if($catid) { - OCP\DB::insertIfNotExist('*PREFIX*vcategory_to_object', + OCP\DB::insertIfNotExist(self::$relation_table, array( 'objid' => $relation['objid'], 'categoryid' => $catid, @@ -360,22 +361,125 @@ class OC_VCategories { } } + /** + * @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 `*PREFIX*vcategory` ' + . 'WHERE `uid` = ?'); + $result = $stmt->execute(array($arguments['uid'])); + } 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 `*PREFIX*vcategory_to_object` ' + . '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 `*PREFIX*vcategory` ' + . 'WHERE `uid` = ? AND'); + $result = $stmt->execute(array($arguments['uid'])); + } catch(Exception $e) { + OCP\Util::writeLog('core', __METHOD__ . ', exception: ' + . $e->getMessage(), OCP\Util::ERROR); + } + } + /** * @brief Delete category/object relations from the db - * @param $id The id of the object - * @param $type The type of object (event/contact/task/journal). + * @param int $id 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 purgeObject($id, $type = null) { $type = is_null($type) ? $this->type : $type; try { - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory_to_object` ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::$relation_table . '` ' . 'WHERE `objid` = ? AND `type`= ?'); $stmt->execute(array($id, $type)); } catch(Exception $e) { OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + return false; } + return true; + } + + /** + * @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 + */ + public function createRelation($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 { + 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 removeRelation($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; } /** From 167e9c1cc025ce920e48032ff5331fcb4f84de3d Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 5 Oct 2012 09:41:27 +0200 Subject: [PATCH 026/481] Fix route name --- settings/routes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/routes.php b/settings/routes.php index b64a357be0..4f4f83e454 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -21,7 +21,7 @@ $this->create('settings_admin', '/settings/admin') ->actionInclude('settings/admin.php'); // Settings ajax actions // users -$this->create('settings_admin', '/settings/ajax/userlist') +$this->create('settings_ajax_userlist', '/settings/ajax/userlist') ->actionInclude('settings/ajax/userlist.php'); $this->create('settings_ajax_createuser', '/settings/ajax/createuser.php') ->actionInclude('settings_ajax_createuser'); From f3a211c03c3dd017e263ac5226a52eb62562d198 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 5 Oct 2012 09:42:36 +0200 Subject: [PATCH 027/481] Implement routing on javascript side --- core/js/router.js | 73 ++++++++++++++++++++++++++++++++++++++++++++ core/routes.php | 3 ++ lib/base.php | 1 + lib/router.php | 18 +++++++++++ settings/js/users.js | 2 +- 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 core/js/router.js diff --git a/core/js/router.js b/core/js/router.js new file mode 100644 index 0000000000..8b66f5a05c --- /dev/null +++ b/core/js/router.js @@ -0,0 +1,73 @@ +OC.router_base_url = OC.webroot + '/index.php/', +OC.Router = { + routes_request: $.ajax(OC.router_base_url + 'core/routes.json', { + dataType: 'json', + success: function(jsondata) { + if (jsondata.status == 'success') { + OC.Router.routes = jsondata.data; + } + } + }), + generate:function(name, opt_params) { + if (!('routes' in this)) { + if(this.routes_request.state() != 'resolved') { + alert('wait');// wait + } + } + if (!(name in this.routes)) { + throw new Error('The route "' + name + '" does not exist.'); + } + var route = this.routes[name]; + var params = opt_params || {}; + var unusedParams = $.extend(true, {}, params); + var url = ''; + var optional = true; + $(route.tokens).each(function(i, token) { + if ('text' === token[0]) { + url = token[1] + url; + optional = false; + + return; + } + + if ('variable' === token[0]) { + if (false === optional || !(token[3] in route.defaults) + || ((token[3] in params) && params[token[3]] != route.defaults[token[3]])) { + var value; + if (token[3] in params) { + value = params[token[3]]; + delete unusedParams[token[3]]; + } else if (token[3] in route.defaults) { + value = route.defaults[token[3]]; + } else if (optional) { + return; + } else { + throw new Error('The route "' + name + '" requires the parameter "' + token[3] + '".'); + } + + var empty = true === value || false === value || '' === value; + + if (!empty || !optional) { + url = token[1] + encodeURIComponent(value).replace(/%2F/g, '/') + url; + } + + optional = false; + } + + return; + } + + throw new Error('The token type "' + token[0] + '" is not supported.'); + }); + if (url === '') { + url = '/'; + } + + unusedParams = $.param(unusedParams); + if (unusedParams.length > 0) { + url += '?'+unusedParams; + } + + return OC.router_base_url + url; + } +}; diff --git a/core/routes.php b/core/routes.php index d396ddd647..8d83681626 100644 --- a/core/routes.php +++ b/core/routes.php @@ -28,6 +28,9 @@ $this->create('core_ajax_vcategories_delete', '/core/ajax/vcategories/delete.php ->actionInclude('core/ajax/vcategories/delete.php'); $this->create('core_ajax_vcategories_edit', '/core/ajax/vcategories/edit.php') ->actionInclude('core/ajax/vcategories/edit.php'); +// Routing +$this->create('core_ajax_routes', '/core/routes.json') + ->action('OC_Router', 'JSRoutes'); // Not specifically routed $this->create('app_css', '/apps/{app}/{file}') diff --git a/lib/base.php b/lib/base.php index 2d82d5a40f..f7967329c2 100644 --- a/lib/base.php +++ b/lib/base.php @@ -253,6 +253,7 @@ class OC{ OC_Util::addScript( "config" ); //OC_Util::addScript( "multiselect" ); OC_Util::addScript('search', 'result'); + OC_Util::addScript('router'); if( OC_Config::getValue( 'installed', false )) { if( OC_Appconfig::getValue( 'core', 'backgroundjobs_mode', 'ajax' ) == 'ajax' ) { diff --git a/lib/router.php b/lib/router.php index da491e217f..04a3d41006 100644 --- a/lib/router.php +++ b/lib/router.php @@ -94,4 +94,22 @@ class OC_Router { { return $this->getGenerator()->generate($name, $parameters, $absolute); } + + public static function JSRoutes() + { + // TODO: http caching + $routes = array(); + $router = OC::getRouter(); + $root = $router->getCollection('root'); + foreach($root->all() as $name => $route) { + $compiled_route = $route->compile(); + $defaults = $route->getDefaults(); + unset($defaults['action']); + $routes[$name] = array( + 'tokens' => $compiled_route->getTokens(), + 'defaults' => $defaults, + ); + } + OCP\JSON::success ( array( 'data' => $routes ) ); + } } diff --git a/settings/js/users.js b/settings/js/users.js index 81a3181ba5..1474ebcdd8 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -130,7 +130,7 @@ var UserList={ if (typeof UserList.offset === 'undefined') { UserList.offset = $('tbody tr').length; } - $.get(OC.filePath('settings', 'ajax', 'userlist'), { offset: UserList.offset }, function(result) { + $.get(OC.Router.generate('settings_ajax_userlist', { offset: UserList.offset }), function(result) { if (result.status === 'success') { $.each(result.data, function(index, user) { var tr = UserList.add(user.name, user.groups, user.subadmin, user.quota, false); From c2b4e534534e083147bbad9b564179832cfa2912 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 5 Oct 2012 17:42:42 +0200 Subject: [PATCH 028/481] Add API description to OC_Route and OC_Router --- lib/route.php | 40 ++++++++++++++++++++++++++++++++++++++++ lib/router.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/lib/route.php b/lib/route.php index c5a8bd2aa3..89af829d3d 100644 --- a/lib/route.php +++ b/lib/route.php @@ -9,31 +9,53 @@ use Symfony\Component\Routing\Route; class OC_Route extends Route { + /** + * Specify the method when this route is to be used + * + * @param string $method HTTP method (uppercase) + */ public function method($method) { $this->setRequirement('_method', strtoupper($method)); return $this; } + /** + * Specify POST as the method to use with this route + */ public function post() { $this->method('POST'); return $this; } + /** + * Specify GET as the method to use with this route + */ public function get() { $this->method('GET'); return $this; } + /** + * Specify PUT as the method to use with this route + */ public function put() { $this->method('PUT'); return $this; } + /** + * Specify DELETE as the method to use with this route + */ public function delete() { $this->method('DELETE'); return $this; } + /** + * Defaults to use for this route + * + * @param array $defaults The defaults + */ public function defaults($defaults) { $action = $this->getDefault('action'); $this->setDefaults($defaults); @@ -44,6 +66,11 @@ class OC_Route extends Route { return $this; } + /** + * Requirements for this route + * + * @param array $requirements The requirements + */ public function requirements($requirements) { $method = $this->getRequirement('_method'); $this->setRequirements($requirements); @@ -56,6 +83,14 @@ class OC_Route extends Route { return $this; } + /** + * The action to execute when this route matches + * @param string|callable $class the class or a callable + * @param string $function the function to use with the class + * + * This function is called with $class set to a callable or + * to the class with $function + */ public function action($class, $function = null) { $action = array($class, $function); if (is_null($function)) { @@ -65,6 +100,11 @@ class OC_Route extends Route { return $this; } + /** + * The action to execute when this route matches, includes a file like + * it is called directly + * @param $file + */ public function actionInclude($file) { $function = create_function('$param', 'unset($param["_route"]);$_GET=array_merge($_GET,$param);unset($param);require_once "'.$file.'";'); $this->action($function); diff --git a/lib/router.php b/lib/router.php index 04a3d41006..a471a06802 100644 --- a/lib/router.php +++ b/lib/router.php @@ -53,16 +53,34 @@ class OC_Router { return $this->collections[$name]; } + /** + * Sets the collection to use for adding routes + * + * @param string $name Name of the colletion to use. + */ public function useCollection($name) { $this->collection = $this->getCollection($name); } + /** + * Create a OC_Route. + * + * @param string $name Name of the route to create. + * @param string $pattern The pattern to match + * @param array $defaults An array of default parameter values + * @param array $requirements An array of requirements for parameters (regexes) + */ public function create($name, $pattern, array $defaults = array(), array $requirements = array()) { $route = new OC_Route($pattern, $defaults, $requirements); $this->collection->add($name, $route); return $route; } + /** + * Find the route matching $url. + * + * @param string $url The url to find + */ public function match($url) { $matcher = new UrlMatcher($this->root, $this->context); $parameters = $matcher->match($url); @@ -81,6 +99,10 @@ class OC_Router { } } + /** + * Get the url generator + * + */ public function getGenerator() { if (null !== $this->generator) { @@ -90,11 +112,20 @@ class OC_Router { return $this->generator = new UrlGenerator($this->root, $this->context); } + /** + * Generate url based on $name and $parameters + * + * @param string $name Name of the route to use. + * @param array $parameters Parameters for the route + */ public function generate($name, $parameters = array(), $absolute = false) { return $this->getGenerator()->generate($name, $parameters, $absolute); } + /** + * Generate JSON response for routing in javascript + */ public static function JSRoutes() { // TODO: http caching From 44287d680bd0e8799724a7595db43c0fafcaff40 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 17 Oct 2012 14:06:25 +0200 Subject: [PATCH 029/481] Check for file exists before loading app version file --- lib/app.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/app.php b/lib/app.php index 594f057709..cb68ea3ddd 100755 --- a/lib/app.php +++ b/lib/app.php @@ -390,9 +390,8 @@ class OC_App{ */ public static function getAppVersion($appid) { $file= self::getAppPath($appid).'/appinfo/version'; - $version=@file_get_contents($file); - if($version) { - return trim($version); + if(is_file($file) && $version = trim(file_get_contents($file))) { + return $version; }else{ $appData=self::getAppInfo($appid); return isset($appData['version'])? $appData['version'] : ''; From b2b84f3a6f3c98005f80c6c7c558a33b4ea36193 Mon Sep 17 00:00:00 2001 From: Susinthiran Sithamparanathan Date: Wed, 17 Oct 2012 12:25:34 +0200 Subject: [PATCH 030/481] Update Sabre to version 1.7.1 --- 3rdparty/Sabre.includes.php | 26 - 3rdparty/Sabre/CalDAV/Backend/Abstract.php | 182 +++--- .../Sabre/CalDAV/Backend/BackendInterface.php | 231 +++++++ .../CalDAV/Backend/NotificationSupport.php | 47 ++ 3rdparty/Sabre/CalDAV/Backend/PDO.php | 337 +++++++++- .../Sabre/CalDAV/Backend/SharingSupport.php | 238 +++++++ 3rdparty/Sabre/CalDAV/Calendar.php | 63 +- 3rdparty/Sabre/CalDAV/CalendarObject.php | 22 +- 3rdparty/Sabre/CalDAV/CalendarQueryParser.php | 12 +- .../Sabre/CalDAV/CalendarQueryValidator.php | 28 +- 3rdparty/Sabre/CalDAV/CalendarRootNode.php | 13 +- .../CalDAV/Exception/InvalidComponentType.php | 32 + 3rdparty/Sabre/CalDAV/ICSExportPlugin.php | 6 +- 3rdparty/Sabre/CalDAV/ICalendar.php | 21 +- 3rdparty/Sabre/CalDAV/ICalendarObject.php | 0 3rdparty/Sabre/CalDAV/IShareableCalendar.php | 48 ++ 3rdparty/Sabre/CalDAV/ISharedCalendar.php | 22 + .../Sabre/CalDAV/Notifications/Collection.php | 169 +++++ .../CalDAV/Notifications/ICollection.php | 22 + 3rdparty/Sabre/CalDAV/Notifications/INode.php | 38 ++ .../Notifications/INotificationType.php | 43 ++ 3rdparty/Sabre/CalDAV/Notifications/Node.php | 188 ++++++ .../Notifications/Notification/Invite.php | 276 ++++++++ .../Notification/InviteReply.php | 216 +++++++ .../Notification/SystemStatus.php | 179 ++++++ 3rdparty/Sabre/CalDAV/Plugin.php | 587 +++++++++++++++--- .../Sabre/CalDAV/Principal/Collection.php | 0 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php | 0 .../Sabre/CalDAV/Principal/ProxyWrite.php | 0 3rdparty/Sabre/CalDAV/Principal/User.php | 0 .../CalDAV/Property/AllowedSharingModes.php | 72 +++ 3rdparty/Sabre/CalDAV/Property/Invite.php | 173 ++++++ .../Property/ScheduleCalendarTransp.php | 99 +++ .../SupportedCalendarComponentSet.php | 0 .../CalDAV/Property/SupportedCalendarData.php | 0 .../CalDAV/Property/SupportedCollationSet.php | 0 3rdparty/Sabre/CalDAV/Schedule/IMip.php | 18 +- 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php | 0 3rdparty/Sabre/CalDAV/Schedule/Outbox.php | 10 +- 3rdparty/Sabre/CalDAV/Server.php | 68 -- 3rdparty/Sabre/CalDAV/ShareableCalendar.php | 72 +++ 3rdparty/Sabre/CalDAV/SharedCalendar.php | 98 +++ 3rdparty/Sabre/CalDAV/SharingPlugin.php | 475 ++++++++++++++ 3rdparty/Sabre/CalDAV/UserCalendars.php | 64 +- 3rdparty/Sabre/CalDAV/Version.php | 2 +- 3rdparty/Sabre/CalDAV/includes.php | 25 +- 3rdparty/Sabre/CardDAV/AddressBook.php | 4 +- .../Sabre/CardDAV/AddressBookQueryParser.php | 0 3rdparty/Sabre/CardDAV/AddressBookRoot.php | 0 3rdparty/Sabre/CardDAV/Backend/Abstract.php | 0 3rdparty/Sabre/CardDAV/Backend/PDO.php | 0 3rdparty/Sabre/CardDAV/Card.php | 16 +- 3rdparty/Sabre/CardDAV/IAddressBook.php | 0 3rdparty/Sabre/CardDAV/ICard.php | 0 3rdparty/Sabre/CardDAV/IDirectory.php | 0 3rdparty/Sabre/CardDAV/Plugin.php | 55 +- .../CardDAV/Property/SupportedAddressData.php | 0 3rdparty/Sabre/CardDAV/UserAddressBooks.php | 0 3rdparty/Sabre/CardDAV/VCFExportPlugin.php | 107 ++++ 3rdparty/Sabre/CardDAV/Version.php | 2 +- 3rdparty/Sabre/CardDAV/includes.php | 1 + .../Sabre/DAV/Auth/Backend/AbstractBasic.php | 0 .../Sabre/DAV/Auth/Backend/AbstractDigest.php | 0 3rdparty/Sabre/DAV/Auth/Backend/Apache.php | 0 3rdparty/Sabre/DAV/Auth/Backend/File.php | 0 3rdparty/Sabre/DAV/Auth/Backend/PDO.php | 0 3rdparty/Sabre/DAV/Auth/IBackend.php | 0 3rdparty/Sabre/DAV/Auth/Plugin.php | 0 .../Sabre/DAV/Browser/GuessContentType.php | 0 .../Sabre/DAV/Browser/MapGetToPropFind.php | 0 3rdparty/Sabre/DAV/Browser/Plugin.php | 2 +- 3rdparty/Sabre/DAV/Browser/assets/favicon.ico | Bin .../DAV/Browser/assets/icons/addressbook.png | Bin .../DAV/Browser/assets/icons/calendar.png | Bin .../Sabre/DAV/Browser/assets/icons/card.png | Bin .../DAV/Browser/assets/icons/collection.png | Bin .../Sabre/DAV/Browser/assets/icons/file.png | Bin .../Sabre/DAV/Browser/assets/icons/parent.png | Bin .../DAV/Browser/assets/icons/principal.png | Bin 3rdparty/Sabre/DAV/Client.php | 69 +- 3rdparty/Sabre/DAV/Collection.php | 6 +- 3rdparty/Sabre/DAV/Directory.php | 17 - 3rdparty/Sabre/DAV/Exception.php | 0 3rdparty/Sabre/DAV/Exception/BadRequest.php | 0 3rdparty/Sabre/DAV/Exception/Conflict.php | 0 .../Sabre/DAV/Exception/ConflictingLock.php | 0 3rdparty/Sabre/DAV/Exception/FileNotFound.php | 0 3rdparty/Sabre/DAV/Exception/Forbidden.php | 0 .../DAV/Exception/InsufficientStorage.php | 0 .../DAV/Exception/InvalidResourceType.php | 0 .../Exception/LockTokenMatchesRequestUri.php | 0 3rdparty/Sabre/DAV/Exception/Locked.php | 0 .../Sabre/DAV/Exception/MethodNotAllowed.php | 0 .../Sabre/DAV/Exception/NotAuthenticated.php | 0 3rdparty/Sabre/DAV/Exception/NotFound.php | 0 .../Sabre/DAV/Exception/NotImplemented.php | 0 .../Sabre/DAV/Exception/PaymentRequired.php | 0 .../DAV/Exception/PreconditionFailed.php | 0 ...Implemented.php => ReportNotSupported.php} | 4 +- .../RequestedRangeNotSatisfiable.php | 0 .../DAV/Exception/UnsupportedMediaType.php | 0 3rdparty/Sabre/DAV/FS/Directory.php | 5 +- 3rdparty/Sabre/DAV/FS/File.php | 0 3rdparty/Sabre/DAV/FS/Node.php | 0 3rdparty/Sabre/DAV/FSExt/Directory.php | 5 +- 3rdparty/Sabre/DAV/FSExt/File.php | 32 +- 3rdparty/Sabre/DAV/FSExt/Node.php | 0 3rdparty/Sabre/DAV/File.php | 0 3rdparty/Sabre/DAV/ICollection.php | 5 +- 3rdparty/Sabre/DAV/IExtendedCollection.php | 0 3rdparty/Sabre/DAV/IFile.php | 2 +- 3rdparty/Sabre/DAV/INode.php | 0 3rdparty/Sabre/DAV/IProperties.php | 0 3rdparty/Sabre/DAV/IQuota.php | 0 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php | 0 3rdparty/Sabre/DAV/Locks/Backend/FS.php | 0 3rdparty/Sabre/DAV/Locks/Backend/File.php | 0 3rdparty/Sabre/DAV/Locks/Backend/PDO.php | 0 3rdparty/Sabre/DAV/Locks/LockInfo.php | 0 3rdparty/Sabre/DAV/Locks/Plugin.php | 1 + 3rdparty/Sabre/DAV/Mount/Plugin.php | 0 3rdparty/Sabre/DAV/Node.php | 2 +- 3rdparty/Sabre/DAV/ObjectTree.php | 26 +- 3rdparty/Sabre/DAV/PartialUpdate/IFile.php | 38 ++ 3rdparty/Sabre/DAV/PartialUpdate/Plugin.php | 209 +++++++ 3rdparty/Sabre/DAV/Property.php | 12 +- .../Sabre/DAV/Property/GetLastModified.php | 0 3rdparty/Sabre/DAV/Property/Href.php | 2 +- 3rdparty/Sabre/DAV/Property/HrefList.php | 2 +- 3rdparty/Sabre/DAV/Property/IHref.php | 0 3rdparty/Sabre/DAV/Property/LockDiscovery.php | 0 3rdparty/Sabre/DAV/Property/ResourceType.php | 0 3rdparty/Sabre/DAV/Property/Response.php | 2 +- 3rdparty/Sabre/DAV/Property/ResponseList.php | 0 3rdparty/Sabre/DAV/Property/SupportedLock.php | 0 .../Sabre/DAV/Property/SupportedReportSet.php | 0 3rdparty/Sabre/DAV/PropertyInterface.php | 21 + 3rdparty/Sabre/DAV/Server.php | 175 +++++- 3rdparty/Sabre/DAV/ServerPlugin.php | 2 +- 3rdparty/Sabre/DAV/SimpleCollection.php | 5 +- 3rdparty/Sabre/DAV/SimpleDirectory.php | 21 - 3rdparty/Sabre/DAV/SimpleFile.php | 0 3rdparty/Sabre/DAV/StringUtil.php | 0 .../Sabre/DAV/TemporaryFileFilterPlugin.php | 0 3rdparty/Sabre/DAV/Tree.php | 0 3rdparty/Sabre/DAV/Tree/Filesystem.php | 0 3rdparty/Sabre/DAV/URLUtil.php | 0 3rdparty/Sabre/DAV/UUIDUtil.php | 0 3rdparty/Sabre/DAV/Version.php | 2 +- 3rdparty/Sabre/DAV/XMLUtil.php | 29 +- 3rdparty/Sabre/DAV/includes.php | 27 +- .../DAVACL/AbstractPrincipalCollection.php | 2 +- .../Sabre/DAVACL/Exception/AceConflict.php | 0 .../Sabre/DAVACL/Exception/NeedPrivileges.php | 0 .../Sabre/DAVACL/Exception/NoAbstract.php | 0 .../Exception/NotRecognizedPrincipal.php | 0 .../Exception/NotSupportedPrivilege.php | 0 3rdparty/Sabre/DAVACL/IACL.php | 2 +- 3rdparty/Sabre/DAVACL/IPrincipal.php | 0 3rdparty/Sabre/DAVACL/IPrincipalBackend.php | 0 3rdparty/Sabre/DAVACL/Plugin.php | 54 +- 3rdparty/Sabre/DAVACL/Principal.php | 0 .../Sabre/DAVACL/PrincipalBackend/PDO.php | 0 3rdparty/Sabre/DAVACL/PrincipalCollection.php | 0 3rdparty/Sabre/DAVACL/Property/Acl.php | 10 +- .../Sabre/DAVACL/Property/AclRestrictions.php | 0 .../Property/CurrentUserPrivilegeSet.php | 0 3rdparty/Sabre/DAVACL/Property/Principal.php | 4 +- .../DAVACL/Property/SupportedPrivilegeSet.php | 0 3rdparty/Sabre/DAVACL/Version.php | 2 +- 3rdparty/Sabre/DAVACL/includes.php | 0 3rdparty/Sabre/HTTP/AWSAuth.php | 0 3rdparty/Sabre/HTTP/AbstractAuth.php | 0 3rdparty/Sabre/HTTP/BasicAuth.php | 0 3rdparty/Sabre/HTTP/DigestAuth.php | 0 3rdparty/Sabre/HTTP/Request.php | 2 +- 3rdparty/Sabre/HTTP/Response.php | 7 +- 3rdparty/Sabre/HTTP/Util.php | 0 3rdparty/Sabre/HTTP/Version.php | 2 +- 3rdparty/Sabre/HTTP/includes.php | 0 3rdparty/Sabre/VObject/Component.php | 136 ++-- 3rdparty/Sabre/VObject/Component/VAlarm.php | 34 +- .../Sabre/VObject/Component/VCalendar.php | 129 +++- 3rdparty/Sabre/VObject/Component/VCard.php | 105 ++++ 3rdparty/Sabre/VObject/Component/VEvent.php | 21 +- .../Sabre/VObject/Component/VFreeBusy.php | 68 ++ 3rdparty/Sabre/VObject/Component/VJournal.php | 14 +- 3rdparty/Sabre/VObject/Component/VTodo.php | 14 +- 3rdparty/Sabre/VObject/DateTimeParser.php | 28 +- 3rdparty/Sabre/VObject/Element.php | 16 - 3rdparty/Sabre/VObject/Element/DateTime.php | 37 -- .../Sabre/VObject/Element/MultiDateTime.php | 17 - 3rdparty/Sabre/VObject/ElementList.php | 12 +- 3rdparty/Sabre/VObject/FreeBusyGenerator.php | 97 +-- 3rdparty/Sabre/VObject/Node.php | 60 +- 3rdparty/Sabre/VObject/Parameter.php | 10 +- 3rdparty/Sabre/VObject/ParseException.php | 8 +- 3rdparty/Sabre/VObject/Property.php | 172 +++-- 3rdparty/Sabre/VObject/Property/Compound.php | 129 ++++ 3rdparty/Sabre/VObject/Property/DateTime.php | 91 +-- .../Sabre/VObject/Property/MultiDateTime.php | 32 +- 3rdparty/Sabre/VObject/Reader.php | 78 ++- 3rdparty/Sabre/VObject/RecurrenceIterator.php | 58 +- 3rdparty/Sabre/VObject/Splitter/ICalendar.php | 111 ++++ .../VObject/Splitter/SplitterInterface.php | 39 ++ 3rdparty/Sabre/VObject/Splitter/VCard.php | 76 +++ 3rdparty/Sabre/VObject/StringUtil.php | 61 ++ 3rdparty/Sabre/VObject/TimeZoneUtil.php | 351 +++++++++++ 3rdparty/Sabre/VObject/Version.php | 8 +- 3rdparty/Sabre/VObject/WindowsTimezoneMap.php | 128 ---- 3rdparty/Sabre/VObject/includes.php | 23 +- 3rdparty/Sabre/autoload.php | 28 +- apps/files/templates/index.php_orig | 90 +++ apps/files/templates/index.php_test | 90 +++ lib/base.php | 5 + lib/vobject.php | 24 +- 216 files changed, 6472 insertions(+), 1143 deletions(-) delete mode 100755 3rdparty/Sabre.includes.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Backend/Abstract.php create mode 100644 3rdparty/Sabre/CalDAV/Backend/BackendInterface.php create mode 100644 3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Backend/PDO.php create mode 100644 3rdparty/Sabre/CalDAV/Backend/SharingSupport.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Calendar.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/CalendarObject.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/CalendarQueryParser.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/CalendarQueryValidator.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/CalendarRootNode.php create mode 100644 3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/ICSExportPlugin.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/ICalendar.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/ICalendarObject.php create mode 100644 3rdparty/Sabre/CalDAV/IShareableCalendar.php create mode 100644 3rdparty/Sabre/CalDAV/ISharedCalendar.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/Collection.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/ICollection.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/INode.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/INotificationType.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/Node.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php create mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Principal/Collection.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Principal/User.php create mode 100644 3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php create mode 100644 3rdparty/Sabre/CalDAV/Property/Invite.php create mode 100644 3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Schedule/IMip.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Schedule/Outbox.php delete mode 100755 3rdparty/Sabre/CalDAV/Server.php create mode 100644 3rdparty/Sabre/CalDAV/ShareableCalendar.php create mode 100644 3rdparty/Sabre/CalDAV/SharedCalendar.php create mode 100644 3rdparty/Sabre/CalDAV/SharingPlugin.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/UserCalendars.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/Version.php mode change 100755 => 100644 3rdparty/Sabre/CalDAV/includes.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/AddressBook.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/AddressBookQueryParser.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/AddressBookRoot.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Backend/Abstract.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Backend/PDO.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Card.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/IAddressBook.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/ICard.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/IDirectory.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/UserAddressBooks.php create mode 100644 3rdparty/Sabre/CardDAV/VCFExportPlugin.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/Version.php mode change 100755 => 100644 3rdparty/Sabre/CardDAV/includes.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Backend/Apache.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Backend/File.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Backend/PDO.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/IBackend.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Auth/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/GuessContentType.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/favicon.ico mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/card.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/collection.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/file.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/parent.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Browser/assets/icons/principal.png mode change 100755 => 100644 3rdparty/Sabre/DAV/Client.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Collection.php delete mode 100755 3rdparty/Sabre/DAV/Directory.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/BadRequest.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/Conflict.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/ConflictingLock.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/FileNotFound.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/Forbidden.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/InsufficientStorage.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/InvalidResourceType.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/Locked.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/NotAuthenticated.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/NotFound.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/NotImplemented.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/PaymentRequired.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/PreconditionFailed.php rename 3rdparty/Sabre/DAV/Exception/{ReportNotImplemented.php => ReportNotSupported.php} (87%) mode change 100755 => 100644 mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FS/Directory.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FS/File.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FS/Node.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FSExt/Directory.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FSExt/File.php mode change 100755 => 100644 3rdparty/Sabre/DAV/FSExt/Node.php mode change 100755 => 100644 3rdparty/Sabre/DAV/File.php mode change 100755 => 100644 3rdparty/Sabre/DAV/ICollection.php mode change 100755 => 100644 3rdparty/Sabre/DAV/IExtendedCollection.php mode change 100755 => 100644 3rdparty/Sabre/DAV/IFile.php mode change 100755 => 100644 3rdparty/Sabre/DAV/INode.php mode change 100755 => 100644 3rdparty/Sabre/DAV/IProperties.php mode change 100755 => 100644 3rdparty/Sabre/DAV/IQuota.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/Backend/FS.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/Backend/File.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/Backend/PDO.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/LockInfo.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Locks/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Mount/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Node.php mode change 100755 => 100644 3rdparty/Sabre/DAV/ObjectTree.php create mode 100644 3rdparty/Sabre/DAV/PartialUpdate/IFile.php create mode 100644 3rdparty/Sabre/DAV/PartialUpdate/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/GetLastModified.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/Href.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/HrefList.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/IHref.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/LockDiscovery.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/ResourceType.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/Response.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/ResponseList.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/SupportedLock.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Property/SupportedReportSet.php create mode 100644 3rdparty/Sabre/DAV/PropertyInterface.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Server.php mode change 100755 => 100644 3rdparty/Sabre/DAV/ServerPlugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/SimpleCollection.php delete mode 100755 3rdparty/Sabre/DAV/SimpleDirectory.php mode change 100755 => 100644 3rdparty/Sabre/DAV/SimpleFile.php mode change 100755 => 100644 3rdparty/Sabre/DAV/StringUtil.php mode change 100755 => 100644 3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Tree.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Tree/Filesystem.php mode change 100755 => 100644 3rdparty/Sabre/DAV/URLUtil.php mode change 100755 => 100644 3rdparty/Sabre/DAV/UUIDUtil.php mode change 100755 => 100644 3rdparty/Sabre/DAV/Version.php mode change 100755 => 100644 3rdparty/Sabre/DAV/XMLUtil.php mode change 100755 => 100644 3rdparty/Sabre/DAV/includes.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Exception/AceConflict.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Exception/NoAbstract.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/IACL.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/IPrincipal.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/IPrincipalBackend.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Plugin.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Principal.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/PrincipalCollection.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Property/Acl.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Property/AclRestrictions.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Property/Principal.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/Version.php mode change 100755 => 100644 3rdparty/Sabre/DAVACL/includes.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/AWSAuth.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/AbstractAuth.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/BasicAuth.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/DigestAuth.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/Request.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/Response.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/Util.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/Version.php mode change 100755 => 100644 3rdparty/Sabre/HTTP/includes.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component/VAlarm.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component/VCalendar.php create mode 100644 3rdparty/Sabre/VObject/Component/VCard.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component/VEvent.php create mode 100644 3rdparty/Sabre/VObject/Component/VFreeBusy.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component/VJournal.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Component/VTodo.php mode change 100755 => 100644 3rdparty/Sabre/VObject/DateTimeParser.php delete mode 100755 3rdparty/Sabre/VObject/Element.php delete mode 100755 3rdparty/Sabre/VObject/Element/DateTime.php delete mode 100755 3rdparty/Sabre/VObject/Element/MultiDateTime.php mode change 100755 => 100644 3rdparty/Sabre/VObject/ElementList.php mode change 100755 => 100644 3rdparty/Sabre/VObject/FreeBusyGenerator.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Node.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Parameter.php mode change 100755 => 100644 3rdparty/Sabre/VObject/ParseException.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Property.php create mode 100644 3rdparty/Sabre/VObject/Property/Compound.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Property/DateTime.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Property/MultiDateTime.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Reader.php mode change 100755 => 100644 3rdparty/Sabre/VObject/RecurrenceIterator.php create mode 100644 3rdparty/Sabre/VObject/Splitter/ICalendar.php create mode 100644 3rdparty/Sabre/VObject/Splitter/SplitterInterface.php create mode 100644 3rdparty/Sabre/VObject/Splitter/VCard.php create mode 100644 3rdparty/Sabre/VObject/StringUtil.php create mode 100644 3rdparty/Sabre/VObject/TimeZoneUtil.php mode change 100755 => 100644 3rdparty/Sabre/VObject/Version.php delete mode 100755 3rdparty/Sabre/VObject/WindowsTimezoneMap.php mode change 100755 => 100644 3rdparty/Sabre/VObject/includes.php mode change 100755 => 100644 3rdparty/Sabre/autoload.php create mode 100644 apps/files/templates/index.php_orig create mode 100644 apps/files/templates/index.php_test diff --git a/3rdparty/Sabre.includes.php b/3rdparty/Sabre.includes.php deleted file mode 100755 index c133437366..0000000000 --- a/3rdparty/Sabre.includes.php +++ /dev/null @@ -1,26 +0,0 @@ -getCalendarObjects($calendarId); + + $validator = new Sabre_CalDAV_CalendarQueryValidator(); + + foreach($objects as $object) { + + if ($this->validateFilterForObject($object, $filters)) { + $result[] = $object['uri']; + } + + } + + return $result; + + } /** - * Returns information from a single calendar object, based on it's object - * uri. + * This method validates if a filters (as passed to calendarQuery) matches + * the given object. * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array + * @param array $object + * @param array $filter + * @return bool */ - abstract function getCalendarObject($calendarId,$objectUri); + protected function validateFilterForObject(array $object, array $filters) { - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - abstract function createCalendarObject($calendarId,$objectUri,$calendarData); + // Unfortunately, setting the 'calendardata' here is optional. If + // it was excluded, we actually need another call to get this as + // well. + if (!isset($object['calendardata'])) { + $object = $this->getCalendarObject($object['calendarid'], $object['uri']); + } - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - abstract function updateCalendarObject($calendarId,$objectUri,$calendarData); + $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata']; + $vObject = VObject\Reader::read($data); + + $validator = new Sabre_CalDAV_CalendarQueryValidator(); + return $validator->validate($vObject, $filters); + + } - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - abstract function deleteCalendarObject($calendarId,$objectUri); } diff --git a/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php b/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php new file mode 100644 index 0000000000..881538ab60 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php @@ -0,0 +1,231 @@ + array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param mixed $calendarId + * @param array $mutations + * @return bool|array + */ + public function updateCalendar($calendarId, array $mutations); + + /** + * Delete a calendar and all it's objects + * + * @param mixed $calendarId + * @return void + */ + public function deleteCalendar($calendarId); + + /** + * Returns all calendar objects within a calendar. + * + * Every item contains an array with the following keys: + * * id - unique identifier which will be used for subsequent updates + * * calendardata - The iCalendar-compatible calendar data + * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. + * * lastmodified - a timestamp of the last modification time + * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: + * ' "abcdef"') + * * calendarid - The calendarid as it was passed to this function. + * * size - The size of the calendar objects, in bytes. + * + * Note that the etag is optional, but it's highly encouraged to return for + * speed reasons. + * + * The calendardata is also optional. If it's not returned + * 'getCalendarObject' will be called later, which *is* expected to return + * calendardata. + * + * If neither etag or size are specified, the calendardata will be + * used/fetched to determine these numbers. If both are specified the + * amount of times this is needed is reduced by a great degree. + * + * @param mixed $calendarId + * @return array + */ + public function getCalendarObjects($calendarId); + + /** + * Returns information from a single calendar object, based on it's object + * uri. + * + * The returned array must have the same keys as getCalendarObjects. The + * 'calendardata' object is required here though, while it's not required + * for getCalendarObjects. + * + * @param mixed $calendarId + * @param string $objectUri + * @return array + */ + public function getCalendarObject($calendarId,$objectUri); + + /** + * Creates a new calendar object. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function createCalendarObject($calendarId,$objectUri,$calendarData); + + /** + * Updates an existing calendarobject, based on it's uri. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function updateCalendarObject($calendarId,$objectUri,$calendarData); + + /** + * Deletes an existing calendar object. + * + * @param mixed $calendarId + * @param string $objectUri + * @return void + */ + public function deleteCalendarObject($calendarId,$objectUri); + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by Sabre_CalDAV_CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on either VEVENT or VTODO. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in Sabre_CalDAV_CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * @param mixed $calendarId + * @param array $filters + * @return array + */ + public function calendarQuery($calendarId, array $filters); + +} diff --git a/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php b/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php new file mode 100644 index 0000000000..d5a1409d9b --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php @@ -0,0 +1,47 @@ + $row['principaluri'], '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), + '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp' => new Sabre_CalDAV_Property_ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), ); @@ -142,11 +157,13 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { 'principaluri', 'uri', 'ctag', + 'transparent', ); $values = array( ':principaluri' => $principalUri, ':uri' => $calendarUri, ':ctag' => 1, + ':transparent' => 0, ); // Default value @@ -160,6 +177,10 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { } $values[':components'] = implode(',',$properties[$sccs]->getValue()); } + $transp = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp'; + if (isset($properties[$transp])) { + $values[':transparent'] = $properties[$transp]->getValue()==='transparent'; + } foreach($this->propertyMap as $xmlName=>$dbName) { if (isset($properties[$xmlName])) { @@ -225,16 +246,24 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { foreach($mutations as $propertyName=>$propertyValue) { - // We don't know about this property. - if (!isset($this->propertyMap[$propertyName])) { - $hasError = true; - $result[403][$propertyName] = null; - unset($mutations[$propertyName]); - continue; - } + switch($propertyName) { + case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp' : + $fieldName = 'transparent'; + $newValues[$fieldName] = $propertyValue->getValue()==='transparent'; + break; + default : + // Checking the property map + if (!isset($this->propertyMap[$propertyName])) { + // We don't know about this property. + $hasError = true; + $result[403][$propertyName] = null; + unset($mutations[$propertyName]); + continue; + } - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; + $fieldName = $this->propertyMap[$propertyName]; + $newValues[$fieldName] = $propertyValue; + } } @@ -316,9 +345,22 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { */ public function getCalendarObjects($calendarId) { - $stmt = $this->pdo->prepare('SELECT * FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); + $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); $stmt->execute(array($calendarId)); - return $stmt->fetchAll(); + + $result = array(); + foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { + $result[] = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + ); + } + + return $result; } @@ -336,44 +378,166 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { */ public function getCalendarObject($calendarId,$objectUri) { - $stmt = $this->pdo->prepare('SELECT * FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); + $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); $stmt->execute(array($calendarId, $objectUri)); - return $stmt->fetch(); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + + if(!$row) return null; + + return array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + 'calendardata' => $row['calendardata'], + ); } + /** * Creates a new calendar object. * - * @param string $calendarId + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId * @param string $objectUri * @param string $calendarData - * @return void + * @return string|null */ public function createCalendarObject($calendarId,$objectUri,$calendarData) { - $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified) VALUES (?,?,?,?)'); - $stmt->execute(array($calendarId,$objectUri,$calendarData,time())); + $extraData = $this->getDenormalizedData($calendarData); + + $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)'); + $stmt->execute(array( + $calendarId, + $objectUri, + $calendarData, + time(), + $extraData['etag'], + $extraData['size'], + $extraData['componentType'], + $extraData['firstOccurence'], + $extraData['lastOccurence'], + )); $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); $stmt->execute(array($calendarId)); + return '"' . $extraData['etag'] . '"'; + } /** * Updates an existing calendarobject, based on it's uri. * - * @param string $calendarId + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId * @param string $objectUri * @param string $calendarData - * @return void + * @return string|null */ public function updateCalendarObject($calendarId,$objectUri,$calendarData) { - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ? WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarData,time(),$calendarId,$objectUri)); + $extraData = $this->getDenormalizedData($calendarData); + + $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?'); + $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri)); $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); $stmt->execute(array($calendarId)); + return '"' . $extraData['etag'] . '"'; + + } + + /** + * Parses some information from calendar objects, used for optimized + * calendar-queries. + * + * Returns an array with the following keys: + * * etag + * * size + * * componentType + * * firstOccurence + * * lastOccurence + * + * @param string $calendarData + * @return array + */ + protected function getDenormalizedData($calendarData) { + + $vObject = VObject\Reader::read($calendarData); + $componentType = null; + $component = null; + $firstOccurence = null; + $lastOccurence = null; + foreach($vObject->getComponents() as $component) { + if ($component->name!=='VTIMEZONE') { + $componentType = $component->name; + break; + } + } + if (!$componentType) { + throw new Sabre_DAV_Exception_BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); + } + if ($componentType === 'VEVENT') { + $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); + // Finding the last occurence is a bit harder + if (!isset($component->RRULE)) { + if (isset($component->DTEND)) { + $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); + } elseif (isset($component->DURATION)) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->add(VObject\DateTimeParser::parse($component->DURATION->value)); + $lastOccurence = $endDate->getTimeStamp(); + } elseif ($component->DTSTART->getDateType()===VObject\Property\DateTime::DATE) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->modify('+1 day'); + $lastOccurence = $endDate->getTimeStamp(); + } else { + $lastOccurence = $firstOccurence; + } + } else { + $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID); + $maxDate = new DateTime(self::MAX_DATE); + if ($it->isInfinite()) { + $lastOccurence = $maxDate->getTimeStamp(); + } else { + $end = $it->getDtEnd(); + while($it->valid() && $end < $maxDate) { + $end = $it->getDtEnd(); + $it->next(); + + } + $lastOccurence = $end->getTimeStamp(); + } + + } + } + + return array( + 'etag' => md5($calendarData), + 'size' => strlen($calendarData), + 'componentType' => $componentType, + 'firstOccurence' => $firstOccurence, + 'lastOccurence' => $lastOccurence, + ); + } /** @@ -392,5 +556,132 @@ class Sabre_CalDAV_Backend_PDO extends Sabre_CalDAV_Backend_Abstract { } + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by Sabre_CalDAV_CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on a VEVENT. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in Sabre_CalDAV_CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * This specific implementation (for the PDO) backend optimizes filters on + * specific components, and VEVENT time-ranges. + * + * @param string $calendarId + * @param array $filters + * @return array + */ + public function calendarQuery($calendarId, array $filters) { + $result = array(); + $validator = new Sabre_CalDAV_CalendarQueryValidator(); + + $componentType = null; + $requirePostFilter = true; + $timeRange = null; + + // if no filters were specified, we don't need to filter after a query + if (!$filters['prop-filters'] && !$filters['comp-filters']) { + $requirePostFilter = false; + } + + // Figuring out if there's a component filter + if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { + $componentType = $filters['comp-filters'][0]['name']; + + // Checking if we need post-filters + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { + $requirePostFilter = false; + } + // There was a time-range filter + if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { + $timeRange = $filters['comp-filters'][0]['time-range']; + + // If start time OR the end time is not specified, we can do a + // 100% accurate mysql query. + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { + $requirePostFilter = false; + } + } + + } + + if ($requirePostFilter) { + $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; + } else { + $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; + } + + $values = array( + 'calendarid' => $calendarId, + ); + + if ($componentType) { + $query.=" AND componenttype = :componenttype"; + $values['componenttype'] = $componentType; + } + + if ($timeRange && $timeRange['start']) { + $query.=" AND lastoccurence > :startdate"; + $values['startdate'] = $timeRange['start']->getTimeStamp(); + } + if ($timeRange && $timeRange['end']) { + $query.=" AND firstoccurence < :enddate"; + $values['enddate'] = $timeRange['end']->getTimeStamp(); + } + + $stmt = $this->pdo->prepare($query); + $stmt->execute($values); + + $result = array(); + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + if ($requirePostFilter) { + if (!$this->validateFilterForObject($row, $filters)) { + continue; + } + } + $result[] = $row['uri']; + + } + + return $result; + + } } diff --git a/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php b/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php new file mode 100644 index 0000000000..f73f0ff3d8 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php @@ -0,0 +1,238 @@ +caldavBackend = $caldavBackend; $this->principalBackend = $principalBackend; $this->calendarInfo = $calendarInfo; - } /** @@ -92,9 +91,6 @@ class Sabre_CalDAV_Calendar implements Sabre_CalDAV_ICalendar, Sabre_DAV_IProper case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : $response[$prop] = new Sabre_CalDAV_Property_SupportedCollationSet(); break; - case '{DAV:}owner' : - $response[$prop] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF,$this->calendarInfo['principaluri']); - break; default : if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; break; @@ -110,12 +106,21 @@ class Sabre_CalDAV_Calendar implements Sabre_CalDAV_ICalendar, Sabre_DAV_IProper * The contained calendar objects are for example Events or Todo's. * * @param string $name - * @return Sabre_DAV_ICalendarObject + * @return Sabre_CalDAV_ICalendarObject */ public function getChild($name) { $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); if (!$obj) throw new Sabre_DAV_Exception_NotFound('Calendar object not found'); + + $obj['acl'] = $this->getACL(); + // Removing the irrelivant + foreach($obj['acl'] as $key=>$acl) { + if ($acl['privilege'] === '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy') { + unset($obj['acl'][$key]); + } + } + return new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } @@ -130,6 +135,13 @@ class Sabre_CalDAV_Calendar implements Sabre_CalDAV_ICalendar, Sabre_DAV_IProper $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); $children = array(); foreach($objs as $obj) { + $obj['acl'] = $this->getACL(); + // Removing the irrelivant + foreach($obj['acl'] as $key=>$acl) { + if ($acl['privilege'] === '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy') { + unset($obj['acl'][$key]); + } + } $children[] = new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } return $children; @@ -262,27 +274,27 @@ class Sabre_CalDAV_Calendar implements Sabre_CalDAV_ICalendar, Sabre_DAV_IProper return array( array( 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], + 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], + 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', + 'principal' => $this->getOwner() . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', + 'principal' => $this->getOwner() . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', + 'principal' => $this->getOwner() . '/calendar-proxy-read', 'protected' => true, ), array( @@ -340,4 +352,27 @@ class Sabre_CalDAV_Calendar implements Sabre_CalDAV_ICalendar, Sabre_DAV_IProper } + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by Sabre_CalDAV_CalendarQueryParser. + * + * @param array $filters + * @return array + */ + public function calendarQuery(array $filters) { + + return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters); + + } + } diff --git a/3rdparty/Sabre/CalDAV/CalendarObject.php b/3rdparty/Sabre/CalDAV/CalendarObject.php old mode 100755 new mode 100644 index 72f0a578d1..40bd8588c7 --- a/3rdparty/Sabre/CalDAV/CalendarObject.php +++ b/3rdparty/Sabre/CalDAV/CalendarObject.php @@ -6,13 +6,13 @@ * @package Sabre * @subpackage CalDAV * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV_ICalendarObject, Sabre_DAVACL_IACL { /** - * Sabre_CalDAV_Backend_Abstract + * Sabre_CalDAV_Backend_BackendInterface * * @var array */ @@ -35,11 +35,11 @@ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV /** * Constructor * - * @param Sabre_CalDAV_Backend_Abstract $caldavBackend + * @param Sabre_CalDAV_Backend_BackendInterface $caldavBackend * @param array $calendarInfo * @param array $objectData */ - public function __construct(Sabre_CalDAV_Backend_Abstract $caldavBackend,array $calendarInfo,array $objectData) { + public function __construct(Sabre_CalDAV_Backend_BackendInterface $caldavBackend,array $calendarInfo,array $objectData) { $this->caldavBackend = $caldavBackend; @@ -85,8 +85,8 @@ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV /** * Updates the ICalendar-formatted object * - * @param string $calendarData - * @return void + * @param string|resource $calendarData + * @return string */ public function put($calendarData) { @@ -119,7 +119,7 @@ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV */ public function getContentType() { - return 'text/calendar'; + return 'text/calendar; charset=utf-8'; } @@ -143,7 +143,7 @@ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV /** * Returns the last modification date as a unix timestamp * - * @return time + * @return int */ public function getLastModified() { @@ -206,6 +206,12 @@ class Sabre_CalDAV_CalendarObject extends Sabre_DAV_File implements Sabre_CalDAV */ public function getACL() { + // An alternative acl may be specified in the object data. + if (isset($this->objectData['acl'])) { + return $this->objectData['acl']; + } + + // The default ACL return array( array( 'privilege' => '{DAV:}read', diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryParser.php b/3rdparty/Sabre/CalDAV/CalendarQueryParser.php old mode 100755 new mode 100644 index bd0d343382..b95095f96f --- a/3rdparty/Sabre/CalDAV/CalendarQueryParser.php +++ b/3rdparty/Sabre/CalDAV/CalendarQueryParser.php @@ -1,5 +1,7 @@ xpath = new DOMXPath($dom); $this->xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $this->xpath->registerNameSpace('dav','urn:DAV'); + $this->xpath->registerNameSpace('dav','DAV:'); } @@ -241,12 +243,12 @@ class Sabre_CalDAV_CalendarQueryParser { $timeRangeNode = $timeRangeNodes->item(0); if ($start = $timeRangeNode->getAttribute('start')) { - $start = Sabre_VObject_DateTimeParser::parseDateTime($start); + $start = VObject\DateTimeParser::parseDateTime($start); } else { $start = null; } if ($end = $timeRangeNode->getAttribute('end')) { - $end = Sabre_VObject_DateTimeParser::parseDateTime($end); + $end = VObject\DateTimeParser::parseDateTime($end); } else { $end = null; } @@ -274,13 +276,13 @@ class Sabre_CalDAV_CalendarQueryParser { if(!$start) { throw new Sabre_DAV_Exception_BadRequest('The "start" attribute is required for the CALDAV:expand element'); } - $start = Sabre_VObject_DateTimeParser::parseDateTime($start); + $start = VObject\DateTimeParser::parseDateTime($start); $end = $parentNode->getAttribute('end'); if(!$end) { throw new Sabre_DAV_Exception_BadRequest('The "end" attribute is required for the CALDAV:expand element'); } - $end = Sabre_VObject_DateTimeParser::parseDateTime($end); + $end = VObject\DateTimeParser::parseDateTime($end); if ($end <= $start) { throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the expand element.'); diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php old mode 100755 new mode 100644 index 8f674840e8..53e86fc509 --- a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php +++ b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php @@ -1,5 +1,7 @@ parent->name === 'VEVENT' && $component->parent->RRULE) { // Fire up the iterator! - $it = new Sabre_VObject_RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); + $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); while($it->valid()) { $expandedEvent = $it->getEventObject(); diff --git a/3rdparty/Sabre/CalDAV/CalendarRootNode.php b/3rdparty/Sabre/CalDAV/CalendarRootNode.php old mode 100755 new mode 100644 index 3907913cc7..eb62eea75a --- a/3rdparty/Sabre/CalDAV/CalendarRootNode.php +++ b/3rdparty/Sabre/CalDAV/CalendarRootNode.php @@ -1,14 +1,15 @@ caldavBackend = $caldavBackend; diff --git a/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php b/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php new file mode 100644 index 0000000000..4ac617d22f --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php @@ -0,0 +1,32 @@ +ownerDocument; + + $np = $doc->createElementNS(Sabre_CalDAV_Plugin::NS_CALDAV,'cal:supported-calendar-component'); + $errorNode->appendChild($np); + + } + +} \ No newline at end of file diff --git a/3rdparty/Sabre/CalDAV/ICSExportPlugin.php b/3rdparty/Sabre/CalDAV/ICSExportPlugin.php old mode 100755 new mode 100644 index ec42b406b2..d3e4e7b720 --- a/3rdparty/Sabre/CalDAV/ICSExportPlugin.php +++ b/3rdparty/Sabre/CalDAV/ICSExportPlugin.php @@ -1,5 +1,7 @@ version = '2.0'; if (Sabre_DAV_Server::$exposeVersion) { $calendar->prodid = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; @@ -103,7 +105,7 @@ class Sabre_CalDAV_ICSExportPlugin extends Sabre_DAV_ServerPlugin { } $nodeData = $node[200]['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data']; - $nodeComp = Sabre_VObject_Reader::read($nodeData); + $nodeComp = VObject\Reader::read($nodeData); foreach($nodeComp->children() as $child) { diff --git a/3rdparty/Sabre/CalDAV/ICalendar.php b/3rdparty/Sabre/CalDAV/ICalendar.php old mode 100755 new mode 100644 index 15d51ebcf7..40aa9f9579 --- a/3rdparty/Sabre/CalDAV/ICalendar.php +++ b/3rdparty/Sabre/CalDAV/ICalendar.php @@ -8,11 +8,28 @@ * @package Sabre * @subpackage CalDAV * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ interface Sabre_CalDAV_ICalendar extends Sabre_DAV_ICollection { - + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by Sabre_CalDAV_CalendarQueryParser. + * + * @param array $filters + * @return array + */ + public function calendarQuery(array $filters); } diff --git a/3rdparty/Sabre/CalDAV/ICalendarObject.php b/3rdparty/Sabre/CalDAV/ICalendarObject.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/IShareableCalendar.php b/3rdparty/Sabre/CalDAV/IShareableCalendar.php new file mode 100644 index 0000000000..5b55788c01 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/IShareableCalendar.php @@ -0,0 +1,48 @@ +caldavBackend = $caldavBackend; + $this->principalUri = $principalUri; + + } + + /** + * Returns all notifications for a principal + * + * @return array + */ + public function getChildren() { + + $children = array(); + $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri); + + foreach($notifications as $notification) { + + $children[] = new Sabre_CalDAV_Notifications_Node( + $this->caldavBackend, + $this->principalUri, + $notification + ); + } + + return $children; + + } + + /** + * Returns the name of this object + * + * @return string + */ + public function getName() { + + return 'notifications'; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}read', + 'protected' => true, + ), + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}write', + 'protected' => true, + ) + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's as an array argument. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new Sabre_DAV_Exception_NotImplemented('Updating ACLs is not implemented here'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/3rdparty/Sabre/CalDAV/Notifications/ICollection.php b/3rdparty/Sabre/CalDAV/Notifications/ICollection.php new file mode 100644 index 0000000000..eb873af3f9 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Notifications/ICollection.php @@ -0,0 +1,22 @@ +caldavBackend = $caldavBackend; + $this->principalUri = $principalUri; + $this->notification = $notification; + + } + + /** + * Returns the path name for this notification + * + * @return id + */ + public function getName() { + + return $this->notification->getId() . '.xml'; + + } + + /** + * Returns the etag for the notification. + * + * The etag must be surrounded by litteral double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->notification->getETag(); + + } + + /** + * This method must return an xml element, using the + * Sabre_CalDAV_Notifications_INotificationType classes. + * + * @return Sabre_DAVNotification_INotificationType + */ + public function getNotificationType() { + + return $this->notification; + + } + + /** + * Deletes this notification + * + * @return void + */ + public function delete() { + + $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}read', + 'protected' => true, + ), + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}write', + 'protected' => true, + ) + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's as an array argument. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new Sabre_DAV_Exception_NotImplemented('Updating ACLs is not implemented here'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php new file mode 100644 index 0000000000..a6b36203f3 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php @@ -0,0 +1,276 @@ +$value) { + if (!property_exists($this, $key)) { + throw new InvalidArgumentException('Unknown option: ' . $key); + } + $this->$key = $value; + } + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { + + $prop = $node->ownerDocument->createElement('cs:invite-notification'); + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + + $dt = $doc->createElement('cs:dtstamp'); + $this->dtStamp->setTimezone(new \DateTimezone('GMT')); + $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); + $node->appendChild($dt); + + $prop = $doc->createElement('cs:invite-notification'); + $node->appendChild($prop); + + $uid = $doc->createElement('cs:uid'); + $uid->appendChild( $doc->createTextNode($this->id) ); + $prop->appendChild($uid); + + $href = $doc->createElement('d:href'); + $href->appendChild( $doc->createTextNode( $this->href ) ); + $prop->appendChild($href); + + $nodeName = null; + switch($this->type) { + + case SharingPlugin::STATUS_ACCEPTED : + $nodeName = 'cs:invite-accepted'; + break; + case SharingPlugin::STATUS_DECLINED : + $nodeName = 'cs:invite-declined'; + break; + case SharingPlugin::STATUS_DELETED : + $nodeName = 'cs:invite-deleted'; + break; + case SharingPlugin::STATUS_NORESPONSE : + $nodeName = 'cs:invite-noresponse'; + break; + + } + $prop->appendChild( + $doc->createElement($nodeName) + ); + $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); + $hostUrl = $doc->createElement('cs:hosturl'); + $hostUrl->appendChild($hostHref); + $prop->appendChild($hostUrl); + + $access = $doc->createElement('cs:access'); + if ($this->readOnly) { + $access->appendChild($doc->createElement('cs:read')); + } else { + $access->appendChild($doc->createElement('cs:read-write')); + } + $prop->appendChild($access); + + $organizerHref = $doc->createElement('d:href', $server->getBaseUri() . $this->organizer); + $organizerUrl = $doc->createElement('cs:organizer'); + if ($this->commonName) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($this->commonName)); + $organizerUrl->appendChild($commonName); + } + $organizerUrl->appendChild($organizerHref); + $prop->appendChild($organizerUrl); + + if ($this->summary) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($this->summary)); + $prop->appendChild($summary); + } + if ($this->supportedComponents) { + + $xcomp = $doc->createElement('cal:supported-calendar-component-set'); + $this->supportedComponents->serialize($server, $xcomp); + $prop->appendChild($xcomp); + + } + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /** + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } + +} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php new file mode 100644 index 0000000000..e935aa5aa1 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php @@ -0,0 +1,216 @@ +$value) { + if (!property_exists($this, $key)) { + throw new InvalidArgumentException('Unknown option: ' . $key); + } + $this->$key = $value; + } + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { + + $prop = $node->ownerDocument->createElement('cs:invite-reply'); + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + + $dt = $doc->createElement('cs:dtstamp'); + $this->dtStamp->setTimezone(new \DateTimezone('GMT')); + $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); + $node->appendChild($dt); + + $prop = $doc->createElement('cs:invite-reply'); + $node->appendChild($prop); + + $uid = $doc->createElement('cs:uid'); + $uid->appendChild($doc->createTextNode($this->id)); + $prop->appendChild($uid); + + $inReplyTo = $doc->createElement('cs:in-reply-to'); + $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) ); + $prop->appendChild($inReplyTo); + + $href = $doc->createElement('d:href'); + $href->appendChild( $doc->createTextNode($this->href) ); + $prop->appendChild($href); + + $nodeName = null; + switch($this->type) { + + case SharingPlugin::STATUS_ACCEPTED : + $nodeName = 'cs:invite-accepted'; + break; + case SharingPlugin::STATUS_DECLINED : + $nodeName = 'cs:invite-declined'; + break; + + } + $prop->appendChild( + $doc->createElement($nodeName) + ); + $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); + $hostUrl = $doc->createElement('cs:hosturl'); + $hostUrl->appendChild($hostHref); + $prop->appendChild($hostUrl); + + if ($this->summary) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($this->summary)); + $prop->appendChild($summary); + } + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /** + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } +} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php new file mode 100644 index 0000000000..f09ed3525f --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php @@ -0,0 +1,179 @@ +id = $id; + $this->type = $type; + $this->description = $description; + $this->href = $href; + $this->etag = $etag; + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { + + switch($this->type) { + case self::TYPE_LOW : + $type = 'low'; + break; + case self::TYPE_MEDIUM : + $type = 'medium'; + break; + default : + case self::TYPE_HIGH : + $type = 'high'; + break; + } + + $prop = $node->ownerDocument->createElement('cs:systemstatus'); + $prop->setAttribute('type', $type); + + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { + + switch($this->type) { + case self::TYPE_LOW : + $type = 'low'; + break; + case self::TYPE_MEDIUM : + $type = 'medium'; + break; + default : + case self::TYPE_HIGH : + $type = 'high'; + break; + } + + $prop = $node->ownerDocument->createElement('cs:systemstatus'); + $prop->setAttribute('type', $type); + + if ($this->description) { + $text = $node->ownerDocument->createTextNode($this->description); + $desc = $node->ownerDocument->createElement('cs:description'); + $desc->appendChild($text); + $prop->appendChild($desc); + } + if ($this->href) { + $text = $node->ownerDocument->createTextNode($this->href); + $href = $node->ownerDocument->createElement('d:href'); + $href->appendChild($text); + $prop->appendChild($href); + } + + $node->appendChild($prop); + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /* + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } +} diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php old mode 100755 new mode 100644 index c56ab38484..f3d11969c8 --- a/3rdparty/Sabre/CalDAV/Plugin.php +++ b/3rdparty/Sabre/CalDAV/Plugin.php @@ -1,5 +1,7 @@ subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); + $server->subscribeEvent('beforeMethod', array($this,'beforeMethod')); $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre_CalDAV_Property_SupportedCalendarComponentSet'; + $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre_CalDAV_Property_ScheduleCalendarTransp'; $server->resourceTypeMapping['Sabre_CalDAV_ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; $server->resourceTypeMapping['Sabre_CalDAV_Schedule_IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; + $server->resourceTypeMapping['Sabre_CalDAV_Notifications_ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; array_push($server->protectedProperties, @@ -205,7 +200,9 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { // CalendarServer extensions '{' . self::NS_CALENDARSERVER . '}getctag', '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for' + '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for', + '{' . self::NS_CALENDARSERVER . '}notification-URL', + '{' . self::NS_CALENDARSERVER . '}notificationtype' ); } @@ -226,6 +223,13 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { // unknownMethod event. return false; case 'POST' : + + // Checking if this is a text/calendar content type + $contentType = $this->server->httpRequest->getHeader('Content-Type'); + if (strpos($contentType, 'text/calendar')!==0) { + return; + } + // Checking if we're talking to an outbox try { $node = $this->server->tree->getNodeForPath($uri); @@ -235,7 +239,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (!$node instanceof Sabre_CalDAV_Schedule_IOutbox) return; - $this->outboxRequest($node); + $this->outboxRequest($node, $uri); return false; } @@ -348,7 +352,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (in_array($calProp,$requestedProperties)) { $addresses = $node->getAlternateUriSet(); - $addresses[] = $this->server->getBaseUri() . $node->getPrincipalUrl(); + $addresses[] = $this->server->getBaseUri() . $node->getPrincipalUrl() . '/'; unset($requestedProperties[$calProp]); $returnedProperties[200][$calProp] = new Sabre_DAV_Property_HrefList($addresses, false); @@ -390,8 +394,31 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } + // notification-URL property + $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL'; + if (($index = array_search($notificationUrl, $requestedProperties)) !== false) { + $principalId = $node->getName(); + $calendarHomePath = 'calendars/' . $principalId . '/notifications/'; + unset($requestedProperties[$index]); + $returnedProperties[200][$notificationUrl] = new Sabre_DAV_Property_Href($calendarHomePath); + } + } // instanceof IPrincipal + if ($node instanceof Sabre_CalDAV_Notifications_INode) { + + $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype'; + if (($index = array_search($propertyName, $requestedProperties)) !== false) { + + $returnedProperties[200][$propertyName] = + $node->getNotificationType(); + + unset($requestedProperties[$index]); + + } + + } // instanceof Notifications_INode + if ($node instanceof Sabre_CalDAV_ICalendarObject) { // The calendar-data property is not supposed to be a 'real' @@ -424,11 +451,11 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { public function calendarMultiGetReport($dom) { $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); $xpath = new DOMXPath($dom); $xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $xpath->registerNameSpace('dav','urn:DAV'); + $xpath->registerNameSpace('dav','DAV:'); $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); if ($expand->length>0) { @@ -438,8 +465,8 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if(!$start || !$end) { throw new Sabre_DAV_Exception_BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element'); } - $start = Sabre_VObject_DateTimeParser::parseDateTime($start); - $end = Sabre_VObject_DateTimeParser::parseDateTime($end); + $start = VObject\DateTimeParser::parseDateTime($start); + $end = VObject\DateTimeParser::parseDateTime($end); if ($end <= $start) { throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the expand element.'); @@ -458,7 +485,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { list($objProps) = $this->server->getPropertiesForPath($uri,$properties); if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) { - $vObject = Sabre_VObject_Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); + $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); $vObject->expand($start, $end); $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); } @@ -467,9 +494,12 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } + $prefer = $this->server->getHTTPPRefer(); + $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList)); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); } @@ -487,54 +517,95 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { $parser = new Sabre_CalDAV_CalendarQueryParser($dom); $parser->parse(); - $requestedCalendarData = true; - $requestedProperties = $parser->requestedProperties; + $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); + $depth = $this->server->getHTTPDepth(0); - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { + // The default result is an empty array + $result = array(); - // We always retrieve calendar-data, as we need it for filtering. - $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; + // The calendarobject was requested directly. In this case we handle + // this locally. + if ($depth == 0 && $node instanceof Sabre_CalDAV_ICalendarObject) { + + $requestedCalendarData = true; + $requestedProperties = $parser->requestedProperties; + + if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { + + // We always retrieve calendar-data, as we need it for filtering. + $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; + + // If calendar-data wasn't explicitly requested, we need to remove + // it after processing. + $requestedCalendarData = false; + } + + $properties = $this->server->getPropertiesForPath( + $this->server->getRequestUri(), + $requestedProperties, + 0 + ); + + // This array should have only 1 element, the first calendar + // object. + $properties = current($properties); + + // If there wasn't any calendar-data returned somehow, we ignore + // this. + if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) { + + $validator = new Sabre_CalDAV_CalendarQueryValidator(); + $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); + if ($validator->validate($vObject,$parser->filters)) { + + // If the client didn't require the calendar-data property, + // we won't give it back. + if (!$requestedCalendarData) { + unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); + } else { + if ($parser->expand) { + $vObject->expand($parser->expand['start'], $parser->expand['end']); + $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); + } + } + + $result = array($properties); + + } + + } - // If calendar-data wasn't explicitly requested, we need to remove - // it after processing. - $requestedCalendarData = false; } + // If we're dealing with a calendar, the calendar itself is responsible + // for the calendar-query. + if ($node instanceof Sabre_CalDAV_ICalendar && $depth = 1) { - // These are the list of nodes that potentially match the requirement - $candidateNodes = $this->server->getPropertiesForPath( - $this->server->getRequestUri(), - $requestedProperties, - $this->server->getHTTPDepth(0) - ); + $nodePaths = $node->calendarQuery($parser->filters); - $verifiedNodes = array(); + foreach($nodePaths as $path) { - $validator = new Sabre_CalDAV_CalendarQueryValidator(); + list($properties) = + $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties); - foreach($candidateNodes as $node) { - - // If the node didn't have a calendar-data property, it must not be a calendar object - if (!isset($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) - continue; - - $vObject = Sabre_VObject_Reader::read($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - if ($validator->validate($vObject,$parser->filters)) { - - if (!$requestedCalendarData) { - unset($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - } if ($parser->expand) { + // We need to do some post-processing + $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); $vObject->expand($parser->expand['start'], $parser->expand['end']); - $node[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); + $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); } - $verifiedNodes[] = $node; + + $result[] = $properties; + } } + $prefer = $this->server->getHTTPPRefer(); + $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($verifiedNodes)); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } @@ -561,10 +632,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } if ($start) { - $start = Sabre_VObject_DateTimeParser::parseDateTime($start); + $start = VObject\DateTimeParser::parseDateTime($start); } if ($end) { - $end = Sabre_VObject_DateTimeParser::parseDateTime($end); + $end = VObject\DateTimeParser::parseDateTime($end); } if (!$start && !$end) { @@ -583,15 +654,33 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_NotImplemented('The free-busy-query REPORT is only implemented on calendars'); } - $objects = array_map(function($child) { - $obj = $child->get(); - if (is_resource($obj)) { - $obj = stream_get_contents($obj); - } - return $obj; - }, $calendar->getChildren()); + // Doing a calendar-query first, to make sure we get the most + // performance. + $urls = $calendar->calendarQuery(array( + 'name' => 'VCALENDAR', + 'comp-filters' => array( + array( + 'name' => 'VEVENT', + 'comp-filters' => array(), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => array( + 'start' => $start, + 'end' => $end, + ), + ), + ), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => null, + )); - $generator = new Sabre_VObject_FreeBusyGenerator(); + $objects = array_map(function($url) use ($calendar) { + $obj = $calendar->getChild($url)->get(); + return $obj; + }, $urls); + + $generator = new VObject\FreeBusyGenerator(); $generator->setObjects($objects); $generator->setTimeRange($start, $end); $result = $generator->getResult(); @@ -620,7 +709,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (!$node instanceof Sabre_CalDAV_ICalendarObject) return; - $this->validateICalendar($data); + $this->validateICalendar($data, $path); } @@ -640,7 +729,52 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (!$parentNode instanceof Sabre_CalDAV_Calendar) return; - $this->validateICalendar($data); + $this->validateICalendar($data, $path); + + } + + /** + * This event is triggered before any HTTP request is handled. + * + * We use this to intercept GET calls to notification nodes, and return the + * proper response. + * + * @param string $method + * @param string $path + * @return void + */ + public function beforeMethod($method, $path) { + + if ($method!=='GET') return; + + try { + $node = $this->server->tree->getNodeForPath($path); + } catch (Sabre_DAV_Exception_NotFound $e) { + return; + } + + if (!$node instanceof Sabre_CalDAV_Notifications_INode) + return; + + if (!$this->server->checkPreconditions(true)) return false; + + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + + $root = $dom->createElement('cs:notification'); + foreach($this->server->xmlNamespaces as $namespace => $prefix) { + $root->setAttribute('xmlns:' . $prefix, $namespace); + } + + $dom->appendChild($root); + $node->getNotificationType()->serializeBody($this->server, $root); + + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->setHeader('ETag',$node->getETag()); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->sendBody($dom->saveXML()); + + return false; } @@ -650,9 +784,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { * An exception is thrown if it's not. * * @param resource|string $data + * @param string $path * @return void */ - protected function validateICalendar(&$data) { + protected function validateICalendar(&$data, $path) { // If it's a stream, we convert it to a string first. if (is_resource($data)) { @@ -664,9 +799,9 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { try { - $vobj = Sabre_VObject_Reader::read($data); + $vobj = VObject\Reader::read($data); - } catch (Sabre_VObject_ParseException $e) { + } catch (VObject\ParseException $e) { throw new Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage()); @@ -676,6 +811,11 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support iCalendar objects.'); } + // Get the Supported Components for the target calendar + list($parentPath,$object) = Sabre_Dav_URLUtil::splitPath($path); + $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set')); + $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue(); + $foundType = null; $foundUID = null; foreach($vobj->getComponents() as $component) { @@ -687,6 +827,9 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { case 'VJOURNAL' : if (is_null($foundType)) { $foundType = $component->name; + if (!in_array($foundType, $supportedComponents)) { + throw new Sabre_CalDAV_Exception_InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType); + } if (!isset($component->UID)) { throw new Sabre_DAV_Exception_BadRequest('Every ' . $component->name . ' component must have an UID'); } @@ -711,12 +854,81 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } /** - * This method handles POST requests to the schedule-outbox + * This method handles POST requests to the schedule-outbox. + * + * Currently, two types of requests are support: + * * FREEBUSY requests from RFC 6638 + * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04 + * + * The latter is from an expired early draft of the CalDAV scheduling + * extensions, but iCal depends on a feature from that spec, so we + * implement it. * * @param Sabre_CalDAV_Schedule_IOutbox $outboxNode + * @param string $outboxUri * @return void */ - public function outboxRequest(Sabre_CalDAV_Schedule_IOutbox $outboxNode) { + public function outboxRequest(Sabre_CalDAV_Schedule_IOutbox $outboxNode, $outboxUri) { + + // Parsing the request body + try { + $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true)); + } catch (VObject\ParseException $e) { + throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); + } + + // The incoming iCalendar object must have a METHOD property, and a + // component. The combination of both determines what type of request + // this is. + $componentType = null; + foreach($vObject->getComponents() as $component) { + if ($component->name !== 'VTIMEZONE') { + $componentType = $component->name; + break; + } + } + if (is_null($componentType)) { + throw new Sabre_DAV_Exception_BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); + } + + // Validating the METHOD + $method = strtoupper((string)$vObject->METHOD); + if (!$method) { + throw new Sabre_DAV_Exception_BadRequest('A METHOD property must be specified in iTIP messages'); + } + + // So we support two types of requests: + // + // REQUEST with a VFREEBUSY component + // REQUEST, REPLY, ADD, CANCEL on VEVENT components + + $acl = $this->server->getPlugin('acl'); + + if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') { + + $acl && $acl->checkPrivileges($outboxUri,'{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-query-freebusy'); + $this->handleFreeBusyRequest($outboxNode, $vObject); + + } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) { + + $acl && $acl->checkPrivileges($outboxUri,'{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent'); + $this->handleEventNotification($outboxNode, $vObject); + + } else { + + throw new Sabre_DAV_Exception_NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)'); + + } + + } + + /** + * This method handles the REQUEST, REPLY, ADD and CANCEL methods for + * VEVENT iTip messages. + * + * @return void + */ + protected function handleEventNotification(Sabre_CalDAV_Schedule_IOutbox $outboxNode, VObject\Component $vObject) { $originator = $this->server->httpRequest->getHeader('Originator'); $recipients = $this->server->httpRequest->getHeader('Recipient'); @@ -760,38 +972,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); } - try { - $vObject = Sabre_VObject_Reader::read($this->server->httpRequest->getBody(true)); - } catch (Sabre_VObject_ParseException $e) { - throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); - } - - // Checking for the object type - $componentType = null; - foreach($vObject->getComponents() as $component) { - if ($component->name !== 'VTIMEZONE') { - $componentType = $component->name; - break; - } - } - if (is_null($componentType)) { - throw new Sabre_DAV_Exception_BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); - } - - // Validating the METHOD - $method = strtoupper((string)$vObject->METHOD); - if (!$method) { - throw new Sabre_DAV_Exception_BadRequest('A METHOD property must be specified in iTIP messages'); - } - - if (in_array($method, array('REQUEST','REPLY','ADD','CANCEL')) && $componentType==='VEVENT') { - $result = $this->iMIPMessage($originator, $recipients, $vObject); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); - } else { - throw new Sabre_DAV_Exception_NotImplemented('This iTIP method is currently not implemented'); - } + $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); } @@ -813,15 +997,15 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { * * @param string $originator * @param array $recipients - * @param Sabre_VObject_Component $vObject + * @param Sabre\VObject\Component $vObject * @return array */ - protected function iMIPMessage($originator, array $recipients, Sabre_VObject_Component $vObject) { + protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) { if (!$this->imipHandler) { $resultStatus = '5.2;This server does not support this operation'; } else { - $this->imipHandler->sendMessage($originator, $recipients, $vObject); + $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal); $resultStatus = '2.0;Success'; } @@ -832,7 +1016,6 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { return $result; - } /** @@ -877,6 +1060,204 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } + /** + * This method is responsible for parsing a free-busy query request and + * returning it's result. + * + * @param Sabre_CalDAV_Schedule_IOutbox $outbox + * @param string $request + * @return string + */ + protected function handleFreeBusyRequest(Sabre_CalDAV_Schedule_IOutbox $outbox, VObject\Component $vObject) { + + $vFreeBusy = $vObject->VFREEBUSY; + $organizer = $vFreeBusy->organizer; + + $organizer = (string)$organizer; + + // Validating if the organizer matches the owner of the inbox. + $owner = $outbox->getOwner(); + + $caldavNS = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}'; + + $uas = $caldavNS . 'calendar-user-address-set'; + $props = $this->server->getProperties($owner,array($uas)); + + if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) { + throw new Sabre_DAV_Exception_Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox'); + } + + if (!isset($vFreeBusy->ATTENDEE)) { + throw new Sabre_DAV_Exception_BadRequest('You must at least specify 1 attendee'); + } + + $attendees = array(); + foreach($vFreeBusy->ATTENDEE as $attendee) { + $attendees[]= (string)$attendee; + } + + + if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) { + throw new Sabre_DAV_Exception_BadRequest('DTSTART and DTEND must both be specified'); + } + + $startRange = $vFreeBusy->DTSTART->getDateTime(); + $endRange = $vFreeBusy->DTEND->getDateTime(); + + $results = array(); + foreach($attendees as $attendee) { + $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject); + } + + $dom = new DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $scheduleResponse = $dom->createElement('cal:schedule-response'); + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace); + + } + $dom->appendChild($scheduleResponse); + + foreach($results as $result) { + $response = $dom->createElement('cal:response'); + + $recipient = $dom->createElement('cal:recipient'); + $recipientHref = $dom->createElement('d:href'); + + $recipientHref->appendChild($dom->createTextNode($result['href'])); + $recipient->appendChild($recipientHref); + $response->appendChild($recipient); + + $reqStatus = $dom->createElement('cal:request-status'); + $reqStatus->appendChild($dom->createTextNode($result['request-status'])); + $response->appendChild($reqStatus); + + if (isset($result['calendar-data'])) { + + $calendardata = $dom->createElement('cal:calendar-data'); + $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize()))); + $response->appendChild($calendardata); + + } + $scheduleResponse->appendChild($response); + } + + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($dom->saveXML()); + + } + + /** + * Returns free-busy information for a specific address. The returned + * data is an array containing the following properties: + * + * calendar-data : A VFREEBUSY VObject + * request-status : an iTip status code. + * href: The principal's email address, as requested + * + * The following request status codes may be returned: + * * 2.0;description + * * 3.7;description + * + * @param string $email address + * @param DateTime $start + * @param DateTime $end + * @param Sabre_VObject_Component $request + * @return Sabre_VObject_Component + */ + protected function getFreeBusyForEmail($email, DateTime $start, DateTime $end, VObject\Component $request) { + + $caldavNS = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}'; + + $aclPlugin = $this->server->getPlugin('acl'); + if (substr($email,0,7)==='mailto:') $email = substr($email,7); + + $result = $aclPlugin->principalSearch( + array('{http://sabredav.org/ns}email-address' => $email), + array( + '{DAV:}principal-URL', $caldavNS . 'calendar-home-set', + '{http://sabredav.org/ns}email-address', + ) + ); + + if (!count($result)) { + return array( + 'request-status' => '3.7;Could not find principal', + 'href' => 'mailto:' . $email, + ); + } + + if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) { + return array( + 'request-status' => '3.7;No calendar-home-set property found', + 'href' => 'mailto:' . $email, + ); + } + $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref(); + + // Grabbing the calendar list + $objects = array(); + foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) { + if (!$node instanceof Sabre_CalDAV_ICalendar) { + continue; + } + $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy'); + + // Getting the list of object uris within the time-range + $urls = $node->calendarQuery(array( + 'name' => 'VCALENDAR', + 'comp-filters' => array( + array( + 'name' => 'VEVENT', + 'comp-filters' => array(), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => array( + 'start' => $start, + 'end' => $end, + ), + ), + ), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => null, + )); + + $calObjects = array_map(function($url) use ($node) { + $obj = $node->getChild($url)->get(); + return $obj; + }, $urls); + + $objects = array_merge($objects,$calObjects); + + } + + $vcalendar = VObject\Component::create('VCALENDAR'); + $vcalendar->VERSION = '2.0'; + $vcalendar->METHOD = 'REPLY'; + $vcalendar->CALSCALE = 'GREGORIAN'; + $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; + + $generator = new VObject\FreeBusyGenerator(); + $generator->setObjects($objects); + $generator->setTimeRange($start, $end); + $generator->setBaseObject($vcalendar); + + $result = $generator->getResult(); + + $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; + $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID; + $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER; + + return array( + 'calendar-data' => $result, + 'request-status' => '2.0;Success', + 'href' => 'mailto:' . $email, + ); + } + /** * This method is used to generate HTML output for the * Sabre_DAV_Browser_Plugin. This allows us to generate an interface users diff --git a/3rdparty/Sabre/CalDAV/Principal/Collection.php b/3rdparty/Sabre/CalDAV/Principal/Collection.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php b/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php b/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Principal/User.php b/3rdparty/Sabre/CalDAV/Principal/User.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php b/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php new file mode 100644 index 0000000000..efe751732c --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php @@ -0,0 +1,72 @@ +canBeShared = $canBeShared; + $this->canBePublished = $canBePublished; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server,DOMElement $node) { + + $doc = $node->ownerDocument; + if ($this->canBeShared) { + $xcomp = $doc->createElement('cs:can-be-shared'); + $node->appendChild($xcomp); + } + if ($this->canBePublished) { + $xcomp = $doc->createElement('cs:can-be-published'); + $node->appendChild($xcomp); + } + + } + +} diff --git a/3rdparty/Sabre/CalDAV/Property/Invite.php b/3rdparty/Sabre/CalDAV/Property/Invite.php new file mode 100644 index 0000000000..4ed94877df --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Property/Invite.php @@ -0,0 +1,173 @@ +users = $users; + + } + + /** + * Returns the list of users, as it was passed to the constructor. + * + * @return array + */ + public function getValue() { + + return $this->users; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server,DOMElement $node) { + + $doc = $node->ownerDocument; + foreach($this->users as $user) { + + $xuser = $doc->createElement('cs:user'); + + $href = $doc->createElement('d:href'); + $href->appendChild($doc->createTextNode($user['href'])); + $xuser->appendChild($href); + + if (isset($user['commonName']) && $user['commonName']) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($user['commonName'])); + $xuser->appendChild($commonName); + } + + switch($user['status']) { + + case SharingPlugin::STATUS_ACCEPTED : + $status = $doc->createElement('cs:invite-accepted'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_DECLINED : + $status = $doc->createElement('cs:invite-declined'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_NORESPONSE : + $status = $doc->createElement('cs:invite-noresponse'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_INVALID : + $status = $doc->createElement('cs:invite-invalid'); + $xuser->appendChild($status); + break; + + } + + $xaccess = $doc->createElement('cs:access'); + + if ($user['readOnly']) { + $xaccess->appendChild( + $doc->createElement('cs:read') + ); + } else { + $xaccess->appendChild( + $doc->createElement('cs:read-write') + ); + } + $xuser->appendChild($xaccess); + + if (isset($user['summary']) && $user['summary']) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($user['summary'])); + $xuser->appendChild($summary); + } + + $node->appendChild($xuser); + + } + + } + + /** + * Unserializes the property. + * + * This static method should return a an instance of this object. + * + * @param DOMElement $prop + * @return Sabre_DAV_IProperty + */ + static function unserialize(DOMElement $prop) { + + $xpath = new \DOMXPath($prop->ownerDocument); + $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'DAV:'); + + $users = array(); + + foreach($xpath->query('cs:user', $prop) as $user) { + + $status = null; + if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { + $status = SharingPlugin::STATUS_ACCEPTED; + } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { + $status = SharingPlugin::STATUS_DECLINED; + } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { + $status = SharingPlugin::STATUS_NORESPONSE; + } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { + $status = SharingPlugin::STATUS_INVALID; + } else { + throw new Sabre_DAV_Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); + } + $users[] = array( + 'href' => $xpath->evaluate('string(d:href)', $user), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), + 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), + 'summary' => $xpath->evaluate('string(cs:summary)', $user), + 'status' => $status, + ); + + } + + return new self($users); + + } + +} diff --git a/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php b/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php new file mode 100644 index 0000000000..76c1dbaec2 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php @@ -0,0 +1,99 @@ +value = $value; + + } + + /** + * Returns the current value + * + * @return string + */ + public function getValue() { + + return $this->value; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param Sabre_DAV_Server $server + * @param DOMElement $node + * @return void + */ + public function serialize(Sabre_DAV_Server $server,DOMElement $node) { + + $doc = $node->ownerDocument; + switch($this->value) { + case self::TRANSPARENT : + $xval = $doc->createElement('cal:transparent'); + break; + case self::OPAQUE : + $xval = $doc->createElement('cal:opaque'); + break; + } + + $node->appendChild($xval); + + } + + /** + * Unserializes the DOMElement back into a Property class. + * + * @param DOMElement $node + * @return Sabre_CalDAV_Property_ScheduleCalendarTransp + */ + static function unserialize(DOMElement $node) { + + $value = null; + foreach($node->childNodes as $childNode) { + switch(Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { + case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}opaque' : + $value = self::OPAQUE; + break; + case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}transparent' : + $value = self::TRANSPARENT; + break; + } + } + if (is_null($value)) + return null; + + return new self($value); + + } +} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Schedule/IMip.php b/3rdparty/Sabre/CalDAV/Schedule/IMip.php old mode 100755 new mode 100644 index 37e75fcc4a..92c3c097c1 --- a/3rdparty/Sabre/CalDAV/Schedule/IMip.php +++ b/3rdparty/Sabre/CalDAV/Schedule/IMip.php @@ -1,5 +1,7 @@ diff --git a/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php b/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CalDAV/Schedule/Outbox.php b/3rdparty/Sabre/CalDAV/Schedule/Outbox.php old mode 100755 new mode 100644 index 014c37230d..462aa527e2 --- a/3rdparty/Sabre/CalDAV/Schedule/Outbox.php +++ b/3rdparty/Sabre/CalDAV/Schedule/Outbox.php @@ -13,7 +13,7 @@ * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -class Sabre_CalDAV_Schedule_Outbox extends Sabre_DAV_Directory implements Sabre_CalDAV_Schedule_IOutbox { +class Sabre_CalDAV_Schedule_Outbox extends Sabre_DAV_Collection implements Sabre_CalDAV_Schedule_IOutbox { /** * The principal Uri @@ -103,6 +103,11 @@ class Sabre_CalDAV_Schedule_Outbox extends Sabre_DAV_Directory implements Sabre_ 'principal' => $this->getOwner(), 'protected' => true, ), + array( + 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent', + 'principal' => $this->getOwner(), + 'protected' => true, + ), array( 'privilege' => '{DAV:}read', 'principal' => $this->getOwner(), @@ -144,6 +149,9 @@ class Sabre_CalDAV_Schedule_Outbox extends Sabre_DAV_Directory implements Sabre_ $default['aggregates'][] = array( 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-query-freebusy', ); + $default['aggregates'][] = array( + 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent', + ); return $default; diff --git a/3rdparty/Sabre/CalDAV/Server.php b/3rdparty/Sabre/CalDAV/Server.php deleted file mode 100755 index 325e3d80a7..0000000000 --- a/3rdparty/Sabre/CalDAV/Server.php +++ /dev/null @@ -1,68 +0,0 @@ -authRealm); - $this->addPlugin($authPlugin); - - $aclPlugin = new Sabre_DAVACL_Plugin(); - $this->addPlugin($aclPlugin); - - $caldavPlugin = new Sabre_CalDAV_Plugin(); - $this->addPlugin($caldavPlugin); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/ShareableCalendar.php b/3rdparty/Sabre/CalDAV/ShareableCalendar.php new file mode 100644 index 0000000000..0e44885c62 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/ShareableCalendar.php @@ -0,0 +1,72 @@ +caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove); + + } + + /** + * Returns the list of people whom this calendar is shared with. + * + * Every element in this array should have the following properties: + * * href - Often a mailto: address + * * commonName - Optional, for example a first + last name + * * status - See the Sabre_CalDAV_SharingPlugin::STATUS_ constants. + * * readOnly - boolean + * * summary - Optional, a description for the share + * + * @return array + */ + public function getShares() { + + return $this->caldavBackend->getShares($this->calendarInfo['id']); + + } + + /** + * Marks this calendar as published. + * + * Publishing a calendar should automatically create a read-only, public, + * subscribable calendar. + * + * @param bool $value + * @return void + */ + public function setPublishStatus($value) { + + $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value); + + } + +} diff --git a/3rdparty/Sabre/CalDAV/SharedCalendar.php b/3rdparty/Sabre/CalDAV/SharedCalendar.php new file mode 100644 index 0000000000..9000697d3e --- /dev/null +++ b/3rdparty/Sabre/CalDAV/SharedCalendar.php @@ -0,0 +1,98 @@ +calendarInfo['{http://calendarserver.org/ns/}shared-url']; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->calendarInfo['{http://sabredav.org/ns}owner-principal']; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + // The top-level ACL only contains access information for the true + // owner of the calendar, so we need to add the information for the + // sharee. + $acl = parent::getACL(); + $acl[] = array( + 'privilege' => '{DAV:}read', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ); + if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) { + $acl[] = array( + 'privilege' => '{DAV:}write', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ); + } + return $acl; + + } + + +} diff --git a/3rdparty/Sabre/CalDAV/SharingPlugin.php b/3rdparty/Sabre/CalDAV/SharingPlugin.php new file mode 100644 index 0000000000..31df8057b2 --- /dev/null +++ b/3rdparty/Sabre/CalDAV/SharingPlugin.php @@ -0,0 +1,475 @@ +server = $server; + //$server->resourceTypeMapping['Sabre_CalDAV_IShareableCalendar'] = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner'; + $server->resourceTypeMapping['Sabre_CalDAV_ISharedCalendar'] = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared'; + + array_push( + $this->server->protectedProperties, + '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite', + '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', + '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url' + ); + + $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); + $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); + $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties')); + $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod')); + + } + + /** + * This event is triggered when properties are requested for a certain + * node. + * + * This allows us to inject any properties early. + * + * @param string $path + * @param Sabre_DAV_INode $node + * @param array $requestedProperties + * @param array $returnedProperties + * @return void + */ + public function beforeGetProperties($path, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { + + if ($node instanceof Sabre_CalDAV_IShareableCalendar) { + if (($index = array_search('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite'] = + new Sabre_CalDAV_Property_Invite( + $node->getShares() + ); + + } + + } + if ($node instanceof Sabre_CalDAV_ISharedCalendar) { + if (($index = array_search('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url'] = + new Sabre_DAV_Property_Href( + $node->getSharedUrl() + ); + + } + + } + + } + + /** + * This method is triggered *after* all properties have been retrieved. + * This allows us to inject the correct resourcetype for calendars that + * have been shared. + * + * @param string $path + * @param array $properties + * @param Sabre_DAV_INode $node + * @return void + */ + public function afterGetProperties($path, &$properties, Sabre_DAV_INode $node) { + + if ($node instanceof Sabre_CalDAV_IShareableCalendar) { + if (isset($properties[200]['{DAV:}resourcetype'])) { + if (count($node->getShares())>0) { + $properties[200]['{DAV:}resourcetype']->add( + '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner' + ); + } + } + $propName = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes'; + if (array_key_exists($propName, $properties[404])) { + unset($properties[404][$propName]); + $properties[200][$propName] = new Sabre_CalDAV_Property_AllowedSharingModes(true,false); + } + + } + + } + + /** + * This method is trigged when a user attempts to update a node's + * properties. + * + * A previous draft of the sharing spec stated that it was possible to use + * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing + * the calendar. + * + * Even though this is no longer in the current spec, we keep this around + * because OS X 10.7 may still make use of this feature. + * + * @param array $mutations + * @param array $result + * @param Sabre_DAV_INode $node + * @return void + */ + public function updateProperties(array &$mutations, array &$result, Sabre_DAV_INode $node) { + + if (!$node instanceof Sabre_CalDAV_IShareableCalendar) + return; + + if (!isset($mutations['{DAV:}resourcetype'])) { + return; + } + + // Only doing something if shared-owner is indeed not in the list. + if($mutations['{DAV:}resourcetype']->is('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner')) return; + + $shares = $node->getShares(); + $remove = array(); + foreach($shares as $share) { + $remove[] = $share['href']; + } + $node->updateShares(array(), $remove); + + // We're marking this update as 200 OK + $result[200]['{DAV:}resourcetype'] = null; + + // Removing it from the mutations list + unset($mutations['{DAV:}resourcetype']); + + } + + /** + * This event is triggered when the server didn't know how to handle a + * certain request. + * + * We intercept this to handle POST requests on calendars. + * + * @param string $method + * @param string $uri + * @return null|bool + */ + public function unknownMethod($method, $uri) { + + if ($method!=='POST') { + return; + } + + // Only handling xml + $contentType = $this->server->httpRequest->getHeader('Content-Type'); + if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false) + return; + + // Making sure the node exists + try { + $node = $this->server->tree->getNodeForPath($uri); + } catch (Sabre_DAV_Exception_NotFound $e) { + return; + } + + + $dom = Sabre_DAV_XMLUtil::loadDOMDocument($this->server->httpRequest->getBody(true)); + + $documentType = Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild); + + switch($documentType) { + + // Dealing with the 'share' document, which modified invitees on a + // calendar. + case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}share' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $mutations = $this->parseShareRequest($dom); + + $node->updateShares($mutations[0], $mutations[1]); + + $this->server->httpResponse->sendStatus(200); + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + // The invite-reply document is sent when the user replies to an + // invitation of a calendar share. + case '{'. Sabre_CalDAV_Plugin::NS_CALENDARSERVER.'}invite-reply' : + + // This only works on the calendar-home-root node. + if (!$node instanceof Sabre_CalDAV_UserCalendars) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $message = $this->parseInviteReplyRequest($dom); + + $url = $node->shareReply( + $message['href'], + $message['status'], + $message['calendarUri'], + $message['inReplyTo'], + $message['summary'] + ); + + $this->server->httpResponse->sendStatus(200); + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + if ($url) { + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + + $root = $dom->createElement('cs:shared-as'); + foreach($this->server->xmlNamespaces as $namespace => $prefix) { + $root->setAttribute('xmlns:' . $prefix, $namespace); + } + + $dom->appendChild($root); + $href = new Sabre_DAV_Property_Href($url); + + $href->serialize($this->server, $root); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($dom->saveXML()); + + } + + // Breaking the event chain + return false; + + case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}publish-calendar' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $node->setPublishStatus(true); + + // iCloud sends back the 202, so we will too. + $this->server->httpResponse->sendStatus(202); + + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}unpublish-calendar' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $node->setPublishStatus(false); + + $this->server->httpResponse->sendStatus(200); + + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + } + + + } + + /** + * Parses the 'share' POST request. + * + * This method returns an array, containing two arrays. + * The first array is a list of new sharees. Every element is a struct + * containing a: + * * href element. (usually a mailto: address) + * * commonName element (often a first and lastname, but can also be + * false) + * * readOnly (true or false) + * * summary (A description of the share, can also be false) + * + * The second array is a list of sharees that are to be removed. This is + * just a simple array with 'hrefs'. + * + * @param DOMDocument $dom + * @return array + */ + protected function parseShareRequest(DOMDocument $dom) { + + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'DAV:'); + + + $set = array(); + $elems = $xpath->query('cs:set'); + + for($i=0; $i < $elems->length; $i++) { + + $xset = $elems->item($i); + $set[] = array( + 'href' => $xpath->evaluate('string(d:href)', $xset), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), + 'summary' => $xpath->evaluate('string(cs:summary)', $xset), + 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false + ); + + } + + $remove = array(); + $elems = $xpath->query('cs:remove'); + + for($i=0; $i < $elems->length; $i++) { + + $xremove = $elems->item($i); + $remove[] = $xpath->evaluate('string(d:href)', $xremove); + + } + + return array($set, $remove); + + } + + /** + * Parses the 'invite-reply' POST request. + * + * This method returns an array, containing the following properties: + * * href - The sharee who is replying + * * status - One of the self::STATUS_* constants + * * calendarUri - The url of the shared calendar + * * inReplyTo - The unique id of the share invitation. + * * summary - Optional description of the reply. + * + * @param DOMDocument $dom + * @return array + */ + protected function parseInviteReplyRequest(DOMDocument $dom) { + + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'DAV:'); + + $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)'); + if (!$hostHref) { + throw new Sabre_DAV_Exception_BadRequest('The {' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required'); + } + + return array( + 'href' => $xpath->evaluate('string(d:href)'), + 'calendarUri' => $this->server->calculateUri($hostHref), + 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'), + 'summary' => $xpath->evaluate('string(cs:summary)'), + 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED + ); + + } + +} diff --git a/3rdparty/Sabre/CalDAV/UserCalendars.php b/3rdparty/Sabre/CalDAV/UserCalendars.php old mode 100755 new mode 100644 index b8d3f0573f..3194e6677a --- a/3rdparty/Sabre/CalDAV/UserCalendars.php +++ b/3rdparty/Sabre/CalDAV/UserCalendars.php @@ -6,7 +6,7 @@ * @package Sabre * @subpackage CalDAV * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre_DAVACL_IACL { @@ -21,7 +21,7 @@ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre /** * CalDAV backend * - * @var Sabre_CalDAV_Backend_Abstract + * @var Sabre_CalDAV_Backend_BackendInterface */ protected $caldavBackend; @@ -36,10 +36,10 @@ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre * Constructor * * @param Sabre_DAVACL_IPrincipalBackend $principalBackend - * @param Sabre_CalDAV_Backend_Abstract $caldavBackend + * @param Sabre_CalDAV_Backend_BackendInterface $caldavBackend * @param mixed $userUri */ - public function __construct(Sabre_DAVACL_IPrincipalBackend $principalBackend, Sabre_CalDAV_Backend_Abstract $caldavBackend, $userUri) { + public function __construct(Sabre_DAVACL_IPrincipalBackend $principalBackend, Sabre_CalDAV_Backend_BackendInterface $caldavBackend, $userUri) { $this->principalBackend = $principalBackend; $this->caldavBackend = $caldavBackend; @@ -168,9 +168,22 @@ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); $objs = array(); foreach($calendars as $calendar) { - $objs[] = new Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); + if ($this->caldavBackend instanceof Sabre_CalDAV_Backend_SharingSupport) { + if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { + $objs[] = new Sabre_CalDAV_SharedCalendar($this->principalBackend, $this->caldavBackend, $calendar); + } else { + $objs[] = new Sabre_CalDAV_ShareableCalendar($this->principalBackend, $this->caldavBackend, $calendar); + } + } else { + $objs[] = new Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); + } } $objs[] = new Sabre_CalDAV_Schedule_Outbox($this->principalInfo['uri']); + + // We're adding a notifications node, if it's supported by the backend. + if ($this->caldavBackend instanceof Sabre_CalDAV_Backend_NotificationSupport) { + $objs[] = new Sabre_CalDAV_Notifications_Collection($this->caldavBackend, $this->principalInfo['uri']); + } return $objs; } @@ -185,8 +198,22 @@ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre */ public function createExtendedCollection($name, array $resourceType, array $properties) { - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar',$resourceType) || count($resourceType)!==2) { - throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType for this collection'); + $isCalendar = false; + foreach($resourceType as $rt) { + switch ($rt) { + case '{DAV:}collection' : + case '{http://calendarserver.org/ns/}shared-owner' : + // ignore + break; + case '{urn:ietf:params:xml:ns:caldav}calendar' : + $isCalendar = true; + break; + default : + throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType: ' . $rt); + } + } + if (!$isCalendar) { + throw new Sabre_DAV_Exception_InvalidResourceType('You can only create calendars in this collection'); } $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); @@ -295,4 +322,27 @@ class Sabre_CalDAV_UserCalendars implements Sabre_DAV_IExtendedCollection, Sabre } + /** + * This method is called when a user replied to a request to share. + * + * This method should return the url of the newly created calendar if the + * share was accepted. + * + * @param string href The sharee who is replying (often a mailto: address) + * @param int status One of the SharingPlugin::STATUS_* constants + * @param string $calendarUri The url to the calendar thats being shared + * @param string $inReplyTo The unique id this message is a response to + * @param string $summary A description of the reply + * @return null|string + */ + public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { + + if (!$this->caldavBackend instanceof Sabre_CalDAV_Backend_SharingSupport) { + throw new Sabre_DAV_Exception_NotImplemented('Sharing support is not implemented by this backend.'); + } + + return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); + + } + } diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php old mode 100755 new mode 100644 index ace9901c08..0ad14fa086 --- a/3rdparty/Sabre/CalDAV/Version.php +++ b/3rdparty/Sabre/CalDAV/Version.php @@ -14,7 +14,7 @@ class Sabre_CalDAV_Version { /** * Full version number */ - const VERSION = '1.6.4'; + const VERSION = '1.7.0'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/CalDAV/includes.php b/3rdparty/Sabre/CalDAV/includes.php old mode 100755 new mode 100644 index 1ecb870a0e..8b38e398f6 --- a/3rdparty/Sabre/CalDAV/includes.php +++ b/3rdparty/Sabre/CalDAV/includes.php @@ -16,28 +16,47 @@ */ // Begin includes -include __DIR__ . '/Backend/Abstract.php'; -include __DIR__ . '/Backend/PDO.php'; +include __DIR__ . '/Backend/BackendInterface.php'; +include __DIR__ . '/Backend/NotificationSupport.php'; +include __DIR__ . '/Backend/SharingSupport.php'; include __DIR__ . '/CalendarQueryParser.php'; include __DIR__ . '/CalendarQueryValidator.php'; include __DIR__ . '/CalendarRootNode.php'; +include __DIR__ . '/Exception/InvalidComponentType.php'; include __DIR__ . '/ICalendar.php'; include __DIR__ . '/ICalendarObject.php'; include __DIR__ . '/ICSExportPlugin.php'; +include __DIR__ . '/IShareableCalendar.php'; +include __DIR__ . '/ISharedCalendar.php'; +include __DIR__ . '/Notifications/ICollection.php'; +include __DIR__ . '/Notifications/INode.php'; +include __DIR__ . '/Notifications/INotificationType.php'; +include __DIR__ . '/Notifications/Node.php'; +include __DIR__ . '/Notifications/Notification/Invite.php'; +include __DIR__ . '/Notifications/Notification/InviteReply.php'; +include __DIR__ . '/Notifications/Notification/SystemStatus.php'; include __DIR__ . '/Plugin.php'; include __DIR__ . '/Principal/Collection.php'; include __DIR__ . '/Principal/ProxyRead.php'; include __DIR__ . '/Principal/ProxyWrite.php'; include __DIR__ . '/Principal/User.php'; +include __DIR__ . '/Property/AllowedSharingModes.php'; +include __DIR__ . '/Property/Invite.php'; +include __DIR__ . '/Property/ScheduleCalendarTransp.php'; include __DIR__ . '/Property/SupportedCalendarComponentSet.php'; include __DIR__ . '/Property/SupportedCalendarData.php'; include __DIR__ . '/Property/SupportedCollationSet.php'; include __DIR__ . '/Schedule/IMip.php'; include __DIR__ . '/Schedule/IOutbox.php'; include __DIR__ . '/Schedule/Outbox.php'; -include __DIR__ . '/Server.php'; +include __DIR__ . '/SharingPlugin.php'; include __DIR__ . '/UserCalendars.php'; include __DIR__ . '/Version.php'; +include __DIR__ . '/Backend/Abstract.php'; +include __DIR__ . '/Backend/PDO.php'; include __DIR__ . '/Calendar.php'; include __DIR__ . '/CalendarObject.php'; +include __DIR__ . '/Notifications/Collection.php'; +include __DIR__ . '/ShareableCalendar.php'; +include __DIR__ . '/SharedCalendar.php'; // End includes diff --git a/3rdparty/Sabre/CardDAV/AddressBook.php b/3rdparty/Sabre/CardDAV/AddressBook.php old mode 100755 new mode 100644 index 12297175a8..8d545114d9 --- a/3rdparty/Sabre/CardDAV/AddressBook.php +++ b/3rdparty/Sabre/CardDAV/AddressBook.php @@ -55,7 +55,7 @@ class Sabre_CardDAV_AddressBook extends Sabre_DAV_Collection implements Sabre_Ca * Returns a card * * @param string $name - * @return Sabre_DAV_Card + * @return Sabre_CardDAV_ICard */ public function getChild($name) { @@ -104,7 +104,7 @@ class Sabre_CardDAV_AddressBook extends Sabre_DAV_Collection implements Sabre_Ca * * @param string $name * @param resource $vcardData - * @return void|null + * @return string|null */ public function createFile($name,$vcardData = null) { diff --git a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/AddressBookRoot.php b/3rdparty/Sabre/CardDAV/AddressBookRoot.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/Backend/Abstract.php b/3rdparty/Sabre/CardDAV/Backend/Abstract.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/Backend/PDO.php b/3rdparty/Sabre/CardDAV/Backend/PDO.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/Card.php b/3rdparty/Sabre/CardDAV/Card.php old mode 100755 new mode 100644 index d7c6633383..0e35d321eb --- a/3rdparty/Sabre/CardDAV/Card.php +++ b/3rdparty/Sabre/CardDAV/Card.php @@ -6,7 +6,7 @@ * @package Sabre * @subpackage CardDAV * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Sabre_CardDAV_Card extends Sabre_DAV_File implements Sabre_CardDAV_ICard, Sabre_DAVACL_IACL { @@ -78,7 +78,7 @@ class Sabre_CardDAV_Card extends Sabre_DAV_File implements Sabre_CardDAV_ICard, * Updates the VCard-formatted object * * @param string $cardData - * @return void + * @return string|null */ public function put($cardData) { @@ -114,7 +114,7 @@ class Sabre_CardDAV_Card extends Sabre_DAV_File implements Sabre_CardDAV_ICard, */ public function getContentType() { - return 'text/x-vcard'; + return 'text/x-vcard; charset=utf-8'; } @@ -128,7 +128,13 @@ class Sabre_CardDAV_Card extends Sabre_DAV_File implements Sabre_CardDAV_ICard, if (isset($this->cardData['etag'])) { return $this->cardData['etag']; } else { - return '"' . md5($this->get()) . '"'; + $data = $this->get(); + if (is_string($data)) { + return '"' . md5($data) . '"'; + } else { + // We refuse to calculate the md5 if it's a stream. + return null; + } } } @@ -136,7 +142,7 @@ class Sabre_CardDAV_Card extends Sabre_DAV_File implements Sabre_CardDAV_ICard, /** * Returns the last modification date as a unix timestamp * - * @return time + * @return int */ public function getLastModified() { diff --git a/3rdparty/Sabre/CardDAV/IAddressBook.php b/3rdparty/Sabre/CardDAV/IAddressBook.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/ICard.php b/3rdparty/Sabre/CardDAV/ICard.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/IDirectory.php b/3rdparty/Sabre/CardDAV/IDirectory.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/Plugin.php b/3rdparty/Sabre/CardDAV/Plugin.php old mode 100755 new mode 100644 index 96def6dd96..12bccaec4f --- a/3rdparty/Sabre/CardDAV/Plugin.php +++ b/3rdparty/Sabre/CardDAV/Plugin.php @@ -1,5 +1,7 @@ subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); + $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); $server->subscribeEvent('updateProperties', array($this, 'updateProperties')); $server->subscribeEvent('report', array($this,'report')); $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); @@ -153,10 +156,6 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { if (is_resource($val)) $val = stream_get_contents($val); - // Taking out \r to not screw up the xml output - //$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); - // The stripping of \r breaks the Mail App in OSX Mountain Lion - // this is fixed in master, but not backported. /Tanghus $returnedProperties[200][$addressDataProp] = $val; } @@ -190,7 +189,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { * @param array $mutations * @param array $result * @param Sabre_DAV_INode $node - * @return void + * @return bool */ public function updateProperties(&$mutations, &$result, $node) { @@ -272,7 +271,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); $propertyList = array(); foreach($hrefElems as $elem) { @@ -282,9 +281,12 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { } + $prefer = $this->server->getHTTPPRefer(); + $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList)); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); } @@ -348,9 +350,9 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { try { - $vobj = Sabre_VObject_Reader::read($data); + $vobj = VObject\Reader::read($data); - } catch (Sabre_VObject_ParseException $e) { + } catch (VObject\ParseException $e) { throw new Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); @@ -360,6 +362,10 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support vcard objects.'); } + if (!isset($vobj->UID)) { + throw new Sabre_DAV_Exception_BadRequest('Every vcard must have an UID.'); + } + } @@ -424,9 +430,12 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { } + $prefer = $this->server->getHTTPPRefer(); + $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result)); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } @@ -440,7 +449,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { */ public function validateFilters($vcardData, array $filters, $test) { - $vcard = Sabre_VObject_Reader::read($vcardData); + $vcard = VObject\Reader::read($vcardData); if (!$filters) return true; @@ -615,6 +624,30 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { } + /** + * This event is triggered after webdav-properties have been retrieved. + * + * @return bool + */ + public function afterGetProperties($uri, &$properties) { + + // If the request was made using the SOGO connector, we must rewrite + // the content-type property. By default SabreDAV will send back + // text/x-vcard; charset=utf-8, but for SOGO we must strip that last + // part. + if (!isset($properties[200]['{DAV:}getcontenttype'])) + return; + + if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) { + return; + } + + if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) { + $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard'; + } + + } + /** * This method is used to generate HTML output for the * Sabre_DAV_Browser_Plugin. This allows us to generate an interface users diff --git a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php b/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/UserAddressBooks.php b/3rdparty/Sabre/CardDAV/UserAddressBooks.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/CardDAV/VCFExportPlugin.php b/3rdparty/Sabre/CardDAV/VCFExportPlugin.php new file mode 100644 index 0000000000..8850fef8af --- /dev/null +++ b/3rdparty/Sabre/CardDAV/VCFExportPlugin.php @@ -0,0 +1,107 @@ +server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); + + } + + /** + * 'beforeMethod' event handles. This event handles intercepts GET requests ending + * with ?export + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if ($method!='GET') return; + if ($this->server->httpRequest->getQueryString()!='export') return; + + // splitting uri + list($uri) = explode('?',$uri,2); + + $node = $this->server->tree->getNodeForPath($uri); + + if (!($node instanceof Sabre_CardDAV_IAddressBook)) return; + + // Checking ACL, if available. + if ($aclPlugin = $this->server->getPlugin('acl')) { + $aclPlugin->checkPrivileges($uri, '{DAV:}read'); + } + + $this->server->httpResponse->setHeader('Content-Type','text/directory'); + $this->server->httpResponse->sendStatus(200); + + $nodes = $this->server->getPropertiesForPath($uri, array( + '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data', + ),1); + + $this->server->httpResponse->sendBody($this->generateVCF($nodes)); + + // Returning false to break the event chain + return false; + + } + + /** + * Merges all vcard objects, and builds one big vcf export + * + * @param array $nodes + * @return string + */ + public function generateVCF(array $nodes) { + + $output = ""; + + foreach($nodes as $node) { + + if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) { + continue; + } + $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data']; + + // Parsing this node so VObject can clean up the output. + $output .= + VObject\Reader::read($nodeData)->serialize(); + + } + + return $output; + + } + +} diff --git a/3rdparty/Sabre/CardDAV/Version.php b/3rdparty/Sabre/CardDAV/Version.php old mode 100755 new mode 100644 index d0623f0d3e..6b70a2df9b --- a/3rdparty/Sabre/CardDAV/Version.php +++ b/3rdparty/Sabre/CardDAV/Version.php @@ -16,7 +16,7 @@ class Sabre_CardDAV_Version { /** * Full version number */ - const VERSION = '1.6.3'; + const VERSION = '1.7.0'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/CardDAV/includes.php b/3rdparty/Sabre/CardDAV/includes.php old mode 100755 new mode 100644 index c3b8c04b07..08b4f76bd0 --- a/3rdparty/Sabre/CardDAV/includes.php +++ b/3rdparty/Sabre/CardDAV/includes.php @@ -26,6 +26,7 @@ include __DIR__ . '/IDirectory.php'; include __DIR__ . '/Plugin.php'; include __DIR__ . '/Property/SupportedAddressData.php'; include __DIR__ . '/UserAddressBooks.php'; +include __DIR__ . '/VCFExportPlugin.php'; include __DIR__ . '/Version.php'; include __DIR__ . '/AddressBook.php'; include __DIR__ . '/Card.php'; diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php b/3rdparty/Sabre/DAV/Auth/Backend/Apache.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/File.php b/3rdparty/Sabre/DAV/Auth/Backend/File.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php b/3rdparty/Sabre/DAV/Auth/Backend/PDO.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/IBackend.php b/3rdparty/Sabre/DAV/Auth/IBackend.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Auth/Plugin.php b/3rdparty/Sabre/DAV/Auth/Plugin.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/GuessContentType.php b/3rdparty/Sabre/DAV/Browser/GuessContentType.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php b/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/Plugin.php b/3rdparty/Sabre/DAV/Browser/Plugin.php old mode 100755 new mode 100644 index 09bbdd2ae0..b6440ab634 --- a/3rdparty/Sabre/DAV/Browser/Plugin.php +++ b/3rdparty/Sabre/DAV/Browser/Plugin.php @@ -338,7 +338,7 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin { $icon = ''; if ($this->enableAssets) { - $node = $parent->getChild($name); + $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name); foreach(array_reverse($this->iconMap) as $class=>$iconName) { if ($node instanceof $class) { diff --git a/3rdparty/Sabre/DAV/Browser/assets/favicon.ico b/3rdparty/Sabre/DAV/Browser/assets/favicon.ico old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png b/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png b/3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/card.png b/3rdparty/Sabre/DAV/Browser/assets/icons/card.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/collection.png b/3rdparty/Sabre/DAV/Browser/assets/icons/collection.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/file.png b/3rdparty/Sabre/DAV/Browser/assets/icons/file.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png b/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/principal.png b/3rdparty/Sabre/DAV/Browser/assets/icons/principal.png old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Client.php b/3rdparty/Sabre/DAV/Client.php old mode 100755 new mode 100644 index 9a428765e9..9d9f4c96b0 --- a/3rdparty/Sabre/DAV/Client.php +++ b/3rdparty/Sabre/DAV/Client.php @@ -16,12 +16,25 @@ */ class Sabre_DAV_Client { + /** + * The propertyMap is a key-value array. + * + * If you use the propertyMap, any {DAV:}multistatus responses with the + * proeprties listed in this array, will automatically be mapped to a + * respective class. + * + * The {DAV:}resourcetype property is automatically added. This maps to + * Sabre_DAV_Property_ResourceType + * + * @var array + */ public $propertyMap = array(); protected $baseUri; protected $userName; protected $password; protected $proxy; + protected $trustedCertificates; /** * Basic authentication @@ -87,6 +100,18 @@ class Sabre_DAV_Client { } + /** + * Add trusted root certificates to the webdav client. + * + * The parameter certificates should be a absulute path to a file + * which contains all trusted certificates + * + * @param string $certificates + */ + public function addTrustedCertificates($certificates) { + $this->trustedCertificates = $certificates; + } + /** * Does a PROPFIND request * @@ -143,13 +168,13 @@ class Sabre_DAV_Client { if ($depth===0) { reset($result); $result = current($result); - return $result[200]; + return isset($result[200])?$result[200]:array(); } $newResult = array(); foreach($result as $href => $statusList) { - $newResult[$href] = $statusList[200]; + $newResult[$href] = isset($statusList[200])?$statusList[200]:array(); } @@ -279,6 +304,10 @@ class Sabre_DAV_Client { CURLOPT_MAXREDIRS => 5, ); + if($this->trustedCertificates) { + $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates; + } + switch ($method) { case 'HEAD' : @@ -363,10 +392,30 @@ class Sabre_DAV_Client { if ($response['statusCode']>=400) { switch ($response['statusCode']) { + case 400 : + throw new Sabre_DAV_Exception_BadRequest('Bad request'); + case 401 : + throw new Sabre_DAV_Exception_NotAuthenticated('Not authenticated'); + case 402 : + throw new Sabre_DAV_Exception_PaymentRequired('Payment required'); + case 403 : + throw new Sabre_DAV_Exception_Forbidden('Forbidden'); case 404: - throw new Sabre_DAV_Exception_NotFound('Resource ' . $url . ' not found.'); - break; - + throw new Sabre_DAV_Exception_NotFound('Resource not found.'); + case 405 : + throw new Sabre_DAV_Exception_MethodNotAllowed('Method not allowed'); + case 409 : + throw new Sabre_DAV_Exception_Conflict('Conflict'); + case 412 : + throw new Sabre_DAV_Exception_PreconditionFailed('Precondition failed'); + case 416 : + throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('Requested Range Not Satisfiable'); + case 500 : + throw new Sabre_DAV_Exception('Internal server error'); + case 501 : + throw new Sabre_DAV_Exception_NotImplemented('Not Implemented'); + case 507 : + throw new Sabre_DAV_Exception_InsufficientStorage('Insufficient storage'); default: throw new Sabre_DAV_Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); } @@ -386,6 +435,7 @@ class Sabre_DAV_Client { * @param array $settings * @return array */ + // @codeCoverageIgnoreStart protected function curlRequest($url, $settings) { $curl = curl_init($url); @@ -399,6 +449,7 @@ class Sabre_DAV_Client { ); } + // @codeCoverageIgnoreEnd /** * Returns the full url based on the given url (which may be relative). All @@ -453,19 +504,17 @@ class Sabre_DAV_Client { */ public function parseMultiStatus($body) { - $body = Sabre_DAV_XMLUtil::convertDAVNamespace($body); - $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); if ($responseXML===false) { throw new InvalidArgumentException('The passed data is not valid XML'); } - $responseXML->registerXPathNamespace('d', 'urn:DAV'); + $responseXML->registerXPathNamespace('d', 'DAV:'); $propResult = array(); foreach($responseXML->xpath('d:response') as $response) { - $response->registerXPathNamespace('d', 'urn:DAV'); + $response->registerXPathNamespace('d', 'DAV:'); $href = $response->xpath('d:href'); $href = (string)$href[0]; @@ -473,7 +522,7 @@ class Sabre_DAV_Client { foreach($response->xpath('d:propstat') as $propStat) { - $propStat->registerXPathNamespace('d', 'urn:DAV'); + $propStat->registerXPathNamespace('d', 'DAV:'); $status = $propStat->xpath('d:status'); list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); diff --git a/3rdparty/Sabre/DAV/Collection.php b/3rdparty/Sabre/DAV/Collection.php old mode 100755 new mode 100644 index 776c22531b..c7648a8a52 --- a/3rdparty/Sabre/DAV/Collection.php +++ b/3rdparty/Sabre/DAV/Collection.php @@ -17,9 +17,13 @@ abstract class Sabre_DAV_Collection extends Sabre_DAV_Node implements Sabre_DAV_ /** * Returns a child object, by its name. * - * This method makes use of the getChildren method to grab all the child nodes, and compares the name. + * This method makes use of the getChildren method to grab all the child + * nodes, and compares the name. * Generally its wise to override this, as this can usually be optimized * + * This method must throw Sabre_DAV_Exception_NotFound if the node does not + * exist. + * * @param string $name * @throws Sabre_DAV_Exception_NotFound * @return Sabre_DAV_INode diff --git a/3rdparty/Sabre/DAV/Directory.php b/3rdparty/Sabre/DAV/Directory.php deleted file mode 100755 index 6db8febc02..0000000000 --- a/3rdparty/Sabre/DAV/Directory.php +++ /dev/null @@ -1,17 +0,0 @@ -path, 'c'); + fseek($f,$offset-1); + if (is_string($data)) { + fwrite($f, $data); + } else { + stream_copy_to_stream($data,$f); + } + fclose($f); + return '"' . md5_file($this->path) . '"'; + + } + /** * Returns the data * - * @return string + * @return resource */ public function get() { diff --git a/3rdparty/Sabre/DAV/FSExt/Node.php b/3rdparty/Sabre/DAV/FSExt/Node.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/File.php b/3rdparty/Sabre/DAV/File.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/ICollection.php b/3rdparty/Sabre/DAV/ICollection.php old mode 100755 new mode 100644 index 4626038a66..94431a0c49 --- a/3rdparty/Sabre/DAV/ICollection.php +++ b/3rdparty/Sabre/DAV/ICollection.php @@ -19,7 +19,7 @@ interface Sabre_DAV_ICollection extends Sabre_DAV_INode { * Data will either be supplied as a stream resource, or in certain cases * as a string. Keep in mind that you may have to support either. * - * After succesful creation of the file, you may choose to return the ETag + * After successful creation of the file, you may choose to return the ETag * of the new file here. * * The returned ETag must be surrounded by double-quotes (The quotes should @@ -50,6 +50,9 @@ interface Sabre_DAV_ICollection extends Sabre_DAV_INode { /** * Returns a specific child node, referenced by its name * + * This method must throw Sabre_DAV_Exception_NotFound if the node does not + * exist. + * * @param string $name * @return Sabre_DAV_INode */ diff --git a/3rdparty/Sabre/DAV/IExtendedCollection.php b/3rdparty/Sabre/DAV/IExtendedCollection.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/IFile.php b/3rdparty/Sabre/DAV/IFile.php old mode 100755 new mode 100644 index 478f822ae7..1eca8986a5 --- a/3rdparty/Sabre/DAV/IFile.php +++ b/3rdparty/Sabre/DAV/IFile.php @@ -51,7 +51,7 @@ interface Sabre_DAV_IFile extends Sabre_DAV_INode { * * If null is returned, we'll assume application/octet-stream * - * @return void + * @return string|null */ function getContentType(); diff --git a/3rdparty/Sabre/DAV/INode.php b/3rdparty/Sabre/DAV/INode.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/IProperties.php b/3rdparty/Sabre/DAV/IProperties.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/IQuota.php b/3rdparty/Sabre/DAV/IQuota.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/Abstract.php b/3rdparty/Sabre/DAV/Locks/Backend/Abstract.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/FS.php b/3rdparty/Sabre/DAV/Locks/Backend/FS.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/File.php b/3rdparty/Sabre/DAV/Locks/Backend/File.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php b/3rdparty/Sabre/DAV/Locks/Backend/PDO.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/LockInfo.php b/3rdparty/Sabre/DAV/Locks/LockInfo.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Locks/Plugin.php b/3rdparty/Sabre/DAV/Locks/Plugin.php old mode 100755 new mode 100644 index 035b3a6386..957ac506a9 --- a/3rdparty/Sabre/DAV/Locks/Plugin.php +++ b/3rdparty/Sabre/DAV/Locks/Plugin.php @@ -152,6 +152,7 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin { case 'MKCOL' : case 'PROPPATCH' : case 'PUT' : + case 'PATCH' : $lastLock = null; if (!$this->validateLock($uri,$lastLock)) throw new Sabre_DAV_Exception_Locked($lastLock); diff --git a/3rdparty/Sabre/DAV/Mount/Plugin.php b/3rdparty/Sabre/DAV/Mount/Plugin.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Node.php b/3rdparty/Sabre/DAV/Node.php old mode 100755 new mode 100644 index 070b7176af..3b95dfec2f --- a/3rdparty/Sabre/DAV/Node.php +++ b/3rdparty/Sabre/DAV/Node.php @@ -27,7 +27,7 @@ abstract class Sabre_DAV_Node implements Sabre_DAV_INode { } /** - * Deleted the current node + * Deletes the current node * * @throws Sabre_DAV_Exception_Forbidden * @return void diff --git a/3rdparty/Sabre/DAV/ObjectTree.php b/3rdparty/Sabre/DAV/ObjectTree.php old mode 100755 new mode 100644 index bce5146390..3b7f222d64 --- a/3rdparty/Sabre/DAV/ObjectTree.php +++ b/3rdparty/Sabre/DAV/ObjectTree.php @@ -51,24 +51,30 @@ class Sabre_DAV_ObjectTree extends Sabre_DAV_Tree { $path = trim($path,'/'); if (isset($this->cache[$path])) return $this->cache[$path]; - //if (!$path || $path=='.') return $this->rootNode; - $currentNode = $this->rootNode; + // Is it the root node? + if (!strlen($path)) { + return $this->rootNode; + } - // We're splitting up the path variable into folder/subfolder components and traverse to the correct node.. - foreach(explode('/',$path) as $pathPart) { + // Attempting to fetch its parent + list($parentName, $baseName) = Sabre_DAV_URLUtil::splitPath($path); - // If this part of the path is just a dot, it actually means we can skip it - if ($pathPart=='.' || $pathPart=='') continue; + // If there was no parent, we must simply ask it from the root node. + if ($parentName==="") { + $node = $this->rootNode->getChild($baseName); + } else { + // Otherwise, we recursively grab the parent and ask him/her. + $parent = $this->getNodeForPath($parentName); - if (!($currentNode instanceof Sabre_DAV_ICollection)) + if (!($parent instanceof Sabre_DAV_ICollection)) throw new Sabre_DAV_Exception_NotFound('Could not find node at path: ' . $path); - $currentNode = $currentNode->getChild($pathPart); + $node = $parent->getChild($baseName); } - $this->cache[$path] = $currentNode; - return $currentNode; + $this->cache[$path] = $node; + return $node; } diff --git a/3rdparty/Sabre/DAV/PartialUpdate/IFile.php b/3rdparty/Sabre/DAV/PartialUpdate/IFile.php new file mode 100644 index 0000000000..cf5ad55c6d --- /dev/null +++ b/3rdparty/Sabre/DAV/PartialUpdate/IFile.php @@ -0,0 +1,38 @@ +addPlugin($patchPlugin); + * + * @package Sabre + * @subpackage DAV + * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. + * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin { + + /** + * Reference to server + * + * @var Sabre_DAV_Server + */ + protected $server; + + /** + * Initializes the plugin + * + * This method is automatically called by the Server class after addPlugin. + * + * @param Sabre_DAV_Server $server + * @return void + */ + public function initialize(Sabre_DAV_Server $server) { + + $this->server = $server; + $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using Sabre_DAV_Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'partialupdate'; + + } + + /** + * This method is called by the Server if the user used an HTTP method + * the server didn't recognize. + * + * This plugin intercepts the PATCH methods. + * + * @param string $method + * @param string $uri + * @return bool|null + */ + public function unknownMethod($method, $uri) { + + switch($method) { + + case 'PATCH': + return $this->httpPatch($uri); + + } + + } + + /** + * Use this method to tell the server this plugin defines additional + * HTTP methods. + * + * This method is passed a uri. It should only return HTTP methods that are + * available for the specified uri. + * + * We claim to support PATCH method (partial update) if and only if + * - the node exist + * - the node implements our partial update interface + * + * @param string $uri + * @return array + */ + public function getHTTPMethods($uri) { + + $tree = $this->server->tree; + + if ($tree->nodeExists($uri) && + $tree->getNodeForPath($uri) instanceof Sabre_DAV_PartialUpdate_IFile) { + return array('PATCH'); + } + + return array(); + + } + + /** + * Returns a list of features for the HTTP OPTIONS Dav: header. + * + * @return array + */ + public function getFeatures() { + + return array('sabredav-partialupdate'); + + } + + /** + * Patch an uri + * + * The WebDAV patch request can be used to modify only a part of an + * existing resource. If the resource does not exist yet and the first + * offset is not 0, the request fails + * + * @param string $uri + * @return void + */ + protected function httpPatch($uri) { + + // Get the node. Will throw a 404 if not found + $node = $this->server->tree->getNodeForPath($uri); + if (!($node instanceof Sabre_DAV_PartialUpdate_IFile)) { + throw new Sabre_DAV_Exception_MethodNotAllowed('The target resource does not support the PATCH method.'); + } + + $range = $this->getHTTPUpdateRange(); + + if (!$range) { + throw new Sabre_DAV_Exception_BadRequest('No valid "X-Update-Range" found in the headers'); + } + + $contentType = strtolower( + $this->server->httpRequest->getHeader('Content-Type') + ); + + if ($contentType != 'application/x-sabredav-partialupdate') { + throw new Sabre_DAV_Exception_UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"'); + } + + $len = $this->server->httpRequest->getHeader('Content-Length'); + + // Load the begin and end data + $start = ($range[0])?$range[0]:0; + $end = ($range[1])?$range[1]:$len-1; + + // Check consistency + if($end < $start) + throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); + if($end - $start + 1 != $len) + throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets'); + + // Checking If-None-Match and related headers. + if (!$this->server->checkPreconditions()) return; + + if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null))) + return; + + $body = $this->server->httpRequest->getBody(); + $etag = $node->putRange($body, $start-1); + + $this->server->broadcastEvent('afterWriteContent',array($uri, $node)); + + $this->server->httpResponse->setHeader('Content-Length','0'); + if ($etag) $this->server->httpResponse->setHeader('ETag',$etag); + $this->server->httpResponse->sendStatus(204); + + return false; + + } + + /** + * Returns the HTTP custom range update header + * + * This method returns null if there is no well-formed HTTP range request + * header or array($start, $end). + * + * The first number is the offset of the first byte in the range. + * The second number is the offset of the last byte in the range. + * + * If the second offset is null, it should be treated as the offset of the last byte of the entity + * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity + * + * @return array|null + */ + public function getHTTPUpdateRange() { + + $range = $this->server->httpRequest->getHeader('X-Update-Range'); + if (is_null($range)) return null; + + // Matching "Range: bytes=1234-5678: both numbers are optional + + if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; + + if ($matches[1]==='' && $matches[2]==='') return null; + + return array( + $matches[1]!==''?$matches[1]:null, + $matches[2]!==''?$matches[2]:null, + ); + + } +} diff --git a/3rdparty/Sabre/DAV/Property.php b/3rdparty/Sabre/DAV/Property.php old mode 100755 new mode 100644 index 1cfada3236..6487bf44bc --- a/3rdparty/Sabre/DAV/Property.php +++ b/3rdparty/Sabre/DAV/Property.php @@ -11,10 +11,16 @@ * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -abstract class Sabre_DAV_Property { - - abstract function serialize(Sabre_DAV_Server $server, DOMElement $prop); +abstract class Sabre_DAV_Property implements Sabre_DAV_PropertyInterface { + /** + * Unserializes the property. + * + * This static method should return a an instance of this object. + * + * @param DOMElement $prop + * @return Sabre_DAV_IProperty + */ static function unserialize(DOMElement $prop) { throw new Sabre_DAV_Exception('Unserialize has not been implemented for this class'); diff --git a/3rdparty/Sabre/DAV/Property/GetLastModified.php b/3rdparty/Sabre/DAV/Property/GetLastModified.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/Href.php b/3rdparty/Sabre/DAV/Property/Href.php old mode 100755 new mode 100644 index dac564f24d..cd1d867f71 --- a/3rdparty/Sabre/DAV/Property/Href.php +++ b/3rdparty/Sabre/DAV/Property/Href.php @@ -82,7 +82,7 @@ class Sabre_DAV_Property_Href extends Sabre_DAV_Property implements Sabre_DAV_Pr */ static function unserialize(DOMElement $dom) { - if (Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { + if ($dom->firstChild && Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { return new self($dom->firstChild->textContent,false); } diff --git a/3rdparty/Sabre/DAV/Property/HrefList.php b/3rdparty/Sabre/DAV/Property/HrefList.php old mode 100755 new mode 100644 index 7a52272e88..282c452ca0 --- a/3rdparty/Sabre/DAV/Property/HrefList.php +++ b/3rdparty/Sabre/DAV/Property/HrefList.php @@ -79,7 +79,7 @@ class Sabre_DAV_Property_HrefList extends Sabre_DAV_Property { * It will only decode {DAV:}href values. * * @param DOMElement $dom - * @return Sabre_DAV_Property_Href + * @return Sabre_DAV_Property_HrefList */ static function unserialize(DOMElement $dom) { diff --git a/3rdparty/Sabre/DAV/Property/IHref.php b/3rdparty/Sabre/DAV/Property/IHref.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/LockDiscovery.php b/3rdparty/Sabre/DAV/Property/LockDiscovery.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/ResourceType.php b/3rdparty/Sabre/DAV/Property/ResourceType.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/Response.php b/3rdparty/Sabre/DAV/Property/Response.php old mode 100755 new mode 100644 index 88afbcfb26..9f21163d12 --- a/3rdparty/Sabre/DAV/Property/Response.php +++ b/3rdparty/Sabre/DAV/Property/Response.php @@ -138,7 +138,7 @@ class Sabre_DAV_Property_Response extends Sabre_DAV_Property implements Sabre_DA if (is_scalar($propertyValue)) { $text = $document->createTextNode($propertyValue); $currentProperty->appendChild($text); - } elseif ($propertyValue instanceof Sabre_DAV_Property) { + } elseif ($propertyValue instanceof Sabre_DAV_PropertyInterface) { $propertyValue->serialize($server,$currentProperty); } elseif (!is_null($propertyValue)) { throw new Sabre_DAV_Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); diff --git a/3rdparty/Sabre/DAV/Property/ResponseList.php b/3rdparty/Sabre/DAV/Property/ResponseList.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/SupportedLock.php b/3rdparty/Sabre/DAV/Property/SupportedLock.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php b/3rdparty/Sabre/DAV/Property/SupportedReportSet.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAV/PropertyInterface.php b/3rdparty/Sabre/DAV/PropertyInterface.php new file mode 100644 index 0000000000..515072cbd3 --- /dev/null +++ b/3rdparty/Sabre/DAV/PropertyInterface.php @@ -0,0 +1,21 @@ +broadcastEvent('exception', array($e)); + } catch (Exception $ignore) { + } $DOM = new DOMDocument('1.0','utf-8'); $DOM->formatOutput = true; @@ -214,17 +217,23 @@ class Sabre_DAV_Server { $error->setAttribute('xmlns:s',self::NS_SABREDAV); $DOM->appendChild($error); - $error->appendChild($DOM->createElement('s:exception',get_class($e))); - $error->appendChild($DOM->createElement('s:message',$e->getMessage())); + $h = function($v) { + + return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8'); + + }; + + $error->appendChild($DOM->createElement('s:exception',$h(get_class($e)))); + $error->appendChild($DOM->createElement('s:message',$h($e->getMessage()))); if ($this->debugExceptions) { - $error->appendChild($DOM->createElement('s:file',$e->getFile())); - $error->appendChild($DOM->createElement('s:line',$e->getLine())); - $error->appendChild($DOM->createElement('s:code',$e->getCode())); - $error->appendChild($DOM->createElement('s:stacktrace',$e->getTraceAsString())); + $error->appendChild($DOM->createElement('s:file',$h($e->getFile()))); + $error->appendChild($DOM->createElement('s:line',$h($e->getLine()))); + $error->appendChild($DOM->createElement('s:code',$h($e->getCode()))); + $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString()))); } if (self::$exposeVersion) { - $error->appendChild($DOM->createElement('s:sabredav-version',Sabre_DAV_Version::VERSION)); + $error->appendChild($DOM->createElement('s:sabredav-version',$h(Sabre_DAV_Version::VERSION))); } if($e instanceof Sabre_DAV_Exception) { @@ -508,7 +517,7 @@ class Sabre_DAV_Server { if (!$this->checkPreconditions(true)) return false; - if (!($node instanceof Sabre_DAV_IFile)) throw new Sabre_DAV_Exception_NotImplemented('GET is only implemented on File objects'); + if (!$node instanceof Sabre_DAV_IFile) throw new Sabre_DAV_Exception_NotImplemented('GET is only implemented on File objects'); $body = $node->get(); // Converting string into stream, if needed. @@ -696,6 +705,7 @@ class Sabre_DAV_Server { // This is a multi-status response $this->httpResponse->sendStatus(207); $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->httpResponse->setHeader('Vary','Brief,Prefer'); // Normally this header is only needed for OPTIONS responses, however.. // iCal seems to also depend on these being set for PROPFIND. Since @@ -704,7 +714,10 @@ class Sabre_DAV_Server { foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); $this->httpResponse->setHeader('DAV',implode(', ',$features)); - $data = $this->generateMultiStatus($newProperties); + $prefer = $this->getHTTPPrefer(); + $minimal = $prefer['return-minimal']; + + $data = $this->generateMultiStatus($newProperties, $minimal); $this->httpResponse->sendBody($data); } @@ -724,6 +737,30 @@ class Sabre_DAV_Server { $result = $this->updateProperties($uri, $newProperties); + $prefer = $this->getHTTPPrefer(); + $this->httpResponse->setHeader('Vary','Brief,Prefer'); + + if ($prefer['return-minimal']) { + + // If return-minimal is specified, we only have to check if the + // request was succesful, and don't need to return the + // multi-status. + $ok = true; + foreach($result as $code=>$prop) { + if ((int)$code > 299) { + $ok = false; + } + } + + if ($ok) { + + $this->httpResponse->sendStatus(204); + return; + + } + + } + $this->httpResponse->sendStatus(207); $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); @@ -927,7 +964,7 @@ class Sabre_DAV_Server { * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo * * @param string $uri - * @return void + * @return bool */ protected function httpMove($uri) { @@ -1009,7 +1046,7 @@ class Sabre_DAV_Server { if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { // If broadcastEvent returned true, it means the report was not supported - throw new Sabre_DAV_Exception_ReportNotImplemented(); + throw new Sabre_DAV_Exception_ReportNotSupported(); } @@ -1158,6 +1195,85 @@ class Sabre_DAV_Server { } + /** + * Returns the HTTP Prefer header information. + * + * The prefer header is defined in: + * http://tools.ietf.org/html/draft-snell-http-prefer-14 + * + * This method will return an array with options. + * + * Currently, the following options may be returned: + * array( + * 'return-asynch' => true, + * 'return-minimal' => true, + * 'return-representation' => true, + * 'wait' => 30, + * 'strict' => true, + * 'lenient' => true, + * ) + * + * This method also supports the Brief header, and will also return + * 'return-minimal' if the brief header was set to 't'. + * + * For the boolean options, false will be returned if the headers are not + * specified. For the integer options it will be 'null'. + * + * @return array + */ + public function getHTTPPrefer() { + + $result = array( + 'return-asynch' => false, + 'return-minimal' => false, + 'return-representation' => false, + 'wait' => null, + 'strict' => false, + 'lenient' => false, + ); + + if ($prefer = $this->httpRequest->getHeader('Prefer')) { + + $parameters = array_map('trim', + explode(',', $prefer) + ); + + foreach($parameters as $parameter) { + + // Right now our regex only supports the tokens actually + // specified in the draft. We may need to expand this if new + // tokens get registered. + if(!preg_match('/^(?P[a-z0-9-]+)(?:=(?P[0-9]+))?$/', $parameter, $matches)) { + continue; + } + + switch($matches['token']) { + + case 'return-asynch' : + case 'return-minimal' : + case 'return-representation' : + case 'strict' : + case 'lenient' : + $result[$matches['token']] = true; + break; + case 'wait' : + $result[$matches['token']] = $matches['value']; + break; + + } + + } + + } + + if ($this->httpRequest->getHeader('Brief')=='t') { + $result['return-minimal'] = true; + } + + return $result; + + } + /** * Returns information about Copy and Move requests @@ -1433,15 +1549,18 @@ class Sabre_DAV_Server { } - $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties)); + $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node)); $newProperties['href'] = trim($myPath,'/'); // Its is a WebDAV recommendation to add a trailing slash to collectionnames. - // Apple's iCal also requires a trailing slash for principals (rfc 3744). - // Therefore we add a trailing / for any non-file. This might need adjustments - // if we find there are other edge cases. - if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype']) && count($newProperties[200]['{DAV:}resourcetype']->getValue())>0) $newProperties['href'] .='/'; + // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard. + if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) { + $rt = $newProperties[200]['{DAV:}resourcetype']; + if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) { + $newProperties['href'] .='/'; + } + } // If the resourcetype property was manually added to the requested property list, // we will remove it again. @@ -1476,11 +1595,14 @@ class Sabre_DAV_Server { if (!$this->broadcastEvent('beforeBind',array($uri))) return false; $parent = $this->tree->getNodeForPath($dir); + if (!$parent instanceof Sabre_DAV_ICollection) { + throw new Sabre_DAV_Exception_Conflict('Files can only be created as children of collections'); + } if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false; $etag = $parent->createFile($name,$data); - $this->tree->markDirty($dir); + $this->tree->markDirty($dir . '/' . $name); $this->broadcastEvent('afterBind',array($uri)); $this->broadcastEvent('afterCreateFile',array($uri, $parent)); @@ -1901,12 +2023,15 @@ class Sabre_DAV_Server { /** - * Generates a WebDAV propfind response body based on a list of nodes + * Generates a WebDAV propfind response body based on a list of nodes. + * + * If 'strip404s' is set to true, all 404 responses will be removed. * * @param array $fileProperties The list with nodes + * @param bool strip404s * @return string */ - public function generateMultiStatus(array $fileProperties) { + public function generateMultiStatus(array $fileProperties, $strip404s = false) { $dom = new DOMDocument('1.0','utf-8'); //$dom->formatOutput = true; @@ -1925,6 +2050,10 @@ class Sabre_DAV_Server { $href = $entry['href']; unset($entry['href']); + if ($strip404s && isset($entry[404])) { + unset($entry[404]); + } + $response = new Sabre_DAV_Property_Response($href,$entry); $response->serialize($this,$multiStatus); @@ -1995,7 +2124,7 @@ class Sabre_DAV_Server { if (!$body) return array(); $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); + $elem = $dom->getElementsByTagNameNS('DAV:','propfind')->item(0); return array_keys(Sabre_DAV_XMLUtil::parseProperties($elem)); } diff --git a/3rdparty/Sabre/DAV/ServerPlugin.php b/3rdparty/Sabre/DAV/ServerPlugin.php old mode 100755 new mode 100644 index 131863d13f..120569ffcc --- a/3rdparty/Sabre/DAV/ServerPlugin.php +++ b/3rdparty/Sabre/DAV/ServerPlugin.php @@ -19,7 +19,7 @@ abstract class Sabre_DAV_ServerPlugin { * This function is called by Sabre_DAV_Server, after * addPlugin is called. * - * This method should set up the requires event subscriptions. + * This method should set up the required event subscriptions. * * @param Sabre_DAV_Server $server * @return void diff --git a/3rdparty/Sabre/DAV/SimpleCollection.php b/3rdparty/Sabre/DAV/SimpleCollection.php old mode 100755 new mode 100644 index 4acf971caa..79e2eaaacd --- a/3rdparty/Sabre/DAV/SimpleCollection.php +++ b/3rdparty/Sabre/DAV/SimpleCollection.php @@ -31,7 +31,7 @@ class Sabre_DAV_SimpleCollection extends Sabre_DAV_Collection { /** * Creates this node * - * The name of the node must be passed, child nodes can also be bassed. + * The name of the node must be passed, child nodes can also be passed. * This nodes must be instances of Sabre_DAV_INode * * @param string $name @@ -78,6 +78,9 @@ class Sabre_DAV_SimpleCollection extends Sabre_DAV_Collection { * This method makes use of the getChildren method to grab all the child nodes, and compares the name. * Generally its wise to override this, as this can usually be optimized * + * This method must throw Sabre_DAV_Exception_NotFound if the node does not + * exist. + * * @param string $name * @throws Sabre_DAV_Exception_NotFound * @return Sabre_DAV_INode diff --git a/3rdparty/Sabre/DAV/SimpleDirectory.php b/3rdparty/Sabre/DAV/SimpleDirectory.php deleted file mode 100755 index 621222ebc5..0000000000 --- a/3rdparty/Sabre/DAV/SimpleDirectory.php +++ /dev/null @@ -1,21 +0,0 @@ -nodeType !== XML_ELEMENT_NODE) return null; - // Mapping back to the real namespace, in case it was dav - if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; + $ns = $dom->namespaceURI; // Mapping to clark notation return '{' . $ns . '}' . $dom->localName; @@ -64,29 +60,11 @@ class Sabre_DAV_XMLUtil { } - /** - * This method takes an XML document (as string) and converts all instances of the - * DAV: namespace to urn:DAV - * - * This is unfortunately needed, because the DAV: namespace violates the xml namespaces - * spec, and causes the DOM to throw errors - * - * @param string $xmlDocument - * @return array|string|null - */ - static function convertDAVNamespace($xmlDocument) { - - // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: - // namespace is actually a violation of the XML namespaces specification, and will cause errors - return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); - - } - /** * This method provides a generic way to load a DOMDocument for WebDAV use. * * This method throws a Sabre_DAV_Exception_BadRequest exception for any xml errors. - * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. + * It does not preserve whitespace. * * @param string $xml * @throws Sabre_DAV_Exception_BadRequest @@ -118,10 +96,11 @@ class Sabre_DAV_XMLUtil { libxml_clear_errors(); $dom = new DOMDocument(); - $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); // We don't generally care about any whitespace $dom->preserveWhiteSpace = false; + + $dom->loadXML($xml,LIBXML_NOWARNING | LIBXML_NOERROR); if ($error = libxml_get_last_error()) { libxml_clear_errors(); diff --git a/3rdparty/Sabre/DAV/includes.php b/3rdparty/Sabre/DAV/includes.php old mode 100755 new mode 100644 index 6a4890677e..6728f88ce7 --- a/3rdparty/Sabre/DAV/includes.php +++ b/3rdparty/Sabre/DAV/includes.php @@ -28,7 +28,7 @@ include __DIR__ . '/Locks/Backend/PDO.php'; include __DIR__ . '/Locks/LockInfo.php'; include __DIR__ . '/Node.php'; include __DIR__ . '/Property/IHref.php'; -include __DIR__ . '/Property.php'; +include __DIR__ . '/PropertyInterface.php'; include __DIR__ . '/Server.php'; include __DIR__ . '/ServerPlugin.php'; include __DIR__ . '/StringUtil.php'; @@ -60,7 +60,7 @@ include __DIR__ . '/Exception/NotFound.php'; include __DIR__ . '/Exception/NotImplemented.php'; include __DIR__ . '/Exception/PaymentRequired.php'; include __DIR__ . '/Exception/PreconditionFailed.php'; -include __DIR__ . '/Exception/ReportNotImplemented.php'; +include __DIR__ . '/Exception/ReportNotSupported.php'; include __DIR__ . '/Exception/RequestedRangeNotSatisfiable.php'; include __DIR__ . '/Exception/UnsupportedMediaType.php'; include __DIR__ . '/FS/Node.php'; @@ -72,6 +72,18 @@ include __DIR__ . '/IQuota.php'; include __DIR__ . '/Locks/Plugin.php'; include __DIR__ . '/Mount/Plugin.php'; include __DIR__ . '/ObjectTree.php'; +include __DIR__ . '/PartialUpdate/IFile.php'; +include __DIR__ . '/PartialUpdate/Plugin.php'; +include __DIR__ . '/Property.php'; +include __DIR__ . '/Tree/Filesystem.php'; +include __DIR__ . '/Collection.php'; +include __DIR__ . '/Exception/ConflictingLock.php'; +include __DIR__ . '/Exception/FileNotFound.php'; +include __DIR__ . '/File.php'; +include __DIR__ . '/FS/Directory.php'; +include __DIR__ . '/FS/File.php'; +include __DIR__ . '/FSExt/Directory.php'; +include __DIR__ . '/FSExt/File.php'; include __DIR__ . '/Property/GetLastModified.php'; include __DIR__ . '/Property/Href.php'; include __DIR__ . '/Property/HrefList.php'; @@ -81,17 +93,6 @@ include __DIR__ . '/Property/Response.php'; include __DIR__ . '/Property/ResponseList.php'; include __DIR__ . '/Property/SupportedLock.php'; include __DIR__ . '/Property/SupportedReportSet.php'; -include __DIR__ . '/Tree/Filesystem.php'; -include __DIR__ . '/Collection.php'; -include __DIR__ . '/Directory.php'; -include __DIR__ . '/Exception/ConflictingLock.php'; -include __DIR__ . '/Exception/FileNotFound.php'; -include __DIR__ . '/File.php'; -include __DIR__ . '/FS/Directory.php'; -include __DIR__ . '/FS/File.php'; -include __DIR__ . '/FSExt/Directory.php'; -include __DIR__ . '/FSExt/File.php'; include __DIR__ . '/SimpleCollection.php'; -include __DIR__ . '/SimpleDirectory.php'; include __DIR__ . '/SimpleFile.php'; // End includes diff --git a/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php b/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php old mode 100755 new mode 100644 index e05b774980..f67eadad6e --- a/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php +++ b/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php @@ -107,7 +107,7 @@ abstract class Sabre_DAVACL_AbstractPrincipalCollection extends Sabre_DAV_Collec * * @param string $name * @throws Sabre_DAV_Exception_NotFound - * @return Sabre_DAV_IPrincipal + * @return Sabre_DAVACL_IPrincipal */ public function getChild($name) { diff --git a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php b/3rdparty/Sabre/DAVACL/Exception/AceConflict.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php b/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php b/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/IACL.php b/3rdparty/Sabre/DAVACL/IACL.php old mode 100755 new mode 100644 index 003e699348..356bb481d5 --- a/3rdparty/Sabre/DAVACL/IACL.php +++ b/3rdparty/Sabre/DAVACL/IACL.php @@ -48,7 +48,7 @@ interface Sabre_DAVACL_IACL extends Sabre_DAV_INode { /** * Updates the ACL * - * This method will receive a list of new ACE's. + * This method will receive a list of new ACE's as an array argument. * * @param array $acl * @return void diff --git a/3rdparty/Sabre/DAVACL/IPrincipal.php b/3rdparty/Sabre/DAVACL/IPrincipal.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/IPrincipalBackend.php b/3rdparty/Sabre/DAVACL/IPrincipalBackend.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Plugin.php b/3rdparty/Sabre/DAVACL/Plugin.php old mode 100755 new mode 100644 index 5c828c6d97..5b17c83847 --- a/3rdparty/Sabre/DAVACL/Plugin.php +++ b/3rdparty/Sabre/DAVACL/Plugin.php @@ -3,7 +3,7 @@ /** * SabreDAV ACL Plugin * - * This plugin provides funcitonality to enforce ACL permissions. + * This plugin provides functionality to enforce ACL permissions. * ACL is defined in RFC3744. * * In addition it also provides support for the {DAV:}current-user-principal @@ -102,11 +102,11 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { ); /** - * Any principal uri's added here, will automatically be added to the list - * of ACL's. They will effectively receive {DAV:}all privileges, as a + * Any principal uri's added here, will automatically be added to the list + * of ACL's. They will effectively receive {DAV:}all privileges, as a * protected privilege. - * - * @var array + * + * @var array */ public $adminPrincipals = array(); @@ -233,6 +233,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { $authPlugin = $this->server->getPlugin('auth'); if (is_null($authPlugin)) return null; + /** @var $authPlugin Sabre_DAV_Auth_Plugin */ $userName = $authPlugin->getCurrentUser(); if (!$userName) return null; @@ -241,6 +242,14 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { } + /** + * This array holds a cache for all the principals that are associated with + * a single principal. + * + * @var array + */ + protected $currentUserPrincipalsCache = array(); + /** * Returns a list of principals that's associated to the current * user, either directly or through group membership. @@ -253,6 +262,11 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { if (is_null($currentUser)) return array(); + // First check our cache + if (isset($this->currentUserPrincipalsCache[$currentUser])) { + return $this->currentUserPrincipalsCache[$currentUser]; + } + $check = array($currentUser); $principals = array($currentUser); @@ -277,6 +291,9 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { } + // Store the result in the cache + $this->currentUserPrincipalsCache[$currentUser] = $principals; + return $principals; } @@ -771,7 +788,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { * @param array $requestedProperties * @param array $returnedProperties * @TODO really should be broken into multiple methods, or even a class. - * @return void + * @return bool */ public function beforeGetProperties($uri, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { @@ -895,6 +912,18 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { $returnedProperties[200]['{DAV:}acl-restrictions'] = new Sabre_DAVACL_Property_AclRestrictions(); } + /* Adding ACL properties */ + if ($node instanceof Sabre_DAVACL_IACL) { + + if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}owner'] = new Sabre_DAV_Property_Href($node->getOwner() . '/'); + + } + + } + } /** @@ -928,6 +957,9 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { } $node->setGroupMemberSet($memberSet); + // We must also clear our cache, just in case + + $this->currentUserPrincipalsCache = array(); $result[200]['{DAV:}group-member-set'] = null; unset($propertyDelta['{DAV:}group-member-set']); @@ -935,7 +967,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { } /** - * This method handels HTTP REPORT requests + * This method handles HTTP REPORT requests * * @param string $reportName * @param DOMNode $dom @@ -1268,10 +1300,12 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin { } $result = $this->principalSearch($searchProperties, $requestedProperties, $uri); - $xml = $this->server->generateMultiStatus($result); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $prefer = $this->server->getHTTPPRefer(); + $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->sendBody($xml); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } diff --git a/3rdparty/Sabre/DAVACL/Principal.php b/3rdparty/Sabre/DAVACL/Principal.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php b/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/PrincipalCollection.php b/3rdparty/Sabre/DAVACL/PrincipalCollection.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Property/Acl.php b/3rdparty/Sabre/DAVACL/Property/Acl.php old mode 100755 new mode 100644 index 05e1a690b3..3f79a8d532 --- a/3rdparty/Sabre/DAVACL/Property/Acl.php +++ b/3rdparty/Sabre/DAVACL/Property/Acl.php @@ -88,11 +88,11 @@ class Sabre_DAVACL_Property_Acl extends Sabre_DAV_Property { static public function unserialize(DOMElement $dom) { $privileges = array(); - $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); + $xaces = $dom->getElementsByTagNameNS('DAV:','ace'); for($ii=0; $ii < $xaces->length; $ii++) { $xace = $xaces->item($ii); - $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); + $principal = $xace->getElementsByTagNameNS('DAV:','principal'); if ($principal->length !== 1) { throw new Sabre_DAV_Exception_BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); } @@ -116,17 +116,17 @@ class Sabre_DAVACL_Property_Acl extends Sabre_DAV_Property { $protected = false; - if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { + if ($xace->getElementsByTagNameNS('DAV:','protected')->length > 0) { $protected = true; } - $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); + $grants = $xace->getElementsByTagNameNS('DAV:','grant'); if ($grants->length < 1) { throw new Sabre_DAV_Exception_NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); } $grant = $grants->item(0); - $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); + $xprivs = $grant->getElementsByTagNameNS('DAV:','privilege'); for($jj=0; $jj<$xprivs->length; $jj++) { $xpriv = $xprivs->item($jj); diff --git a/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php b/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Property/Principal.php b/3rdparty/Sabre/DAVACL/Property/Principal.php old mode 100755 new mode 100644 index c36328a58e..3f68174227 --- a/3rdparty/Sabre/DAVACL/Property/Principal.php +++ b/3rdparty/Sabre/DAVACL/Property/Principal.php @@ -15,7 +15,7 @@ class Sabre_DAVACL_Property_Principal extends Sabre_DAV_Property implements Sabre_DAV_Property_IHref { /** - * To specify a not-logged-in user, use the UNAUTHENTICTED principal + * To specify a not-logged-in user, use the UNAUTHENTICATED principal */ const UNAUTHENTICATED = 1; @@ -131,7 +131,7 @@ class Sabre_DAVACL_Property_Principal extends Sabre_DAV_Property implements Sabr * Deserializes a DOM element into a property object. * * @param DOMElement $dom - * @return Sabre_DAV_Property_Principal + * @return Sabre_DAVACL_Property_Principal */ static public function unserialize(DOMElement $dom) { diff --git a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/DAVACL/Version.php b/3rdparty/Sabre/DAVACL/Version.php old mode 100755 new mode 100644 index 9950f74874..084a9c13c8 --- a/3rdparty/Sabre/DAVACL/Version.php +++ b/3rdparty/Sabre/DAVACL/Version.php @@ -14,7 +14,7 @@ class Sabre_DAVACL_Version { /** * Full version number */ - const VERSION = '1.6.0'; + const VERSION = '1.7.0'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/DAVACL/includes.php b/3rdparty/Sabre/DAVACL/includes.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/AWSAuth.php b/3rdparty/Sabre/HTTP/AWSAuth.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/AbstractAuth.php b/3rdparty/Sabre/HTTP/AbstractAuth.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/DigestAuth.php b/3rdparty/Sabre/HTTP/DigestAuth.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/Request.php b/3rdparty/Sabre/HTTP/Request.php old mode 100755 new mode 100644 index 4746ef7770..74d5ed3d7e --- a/3rdparty/Sabre/HTTP/Request.php +++ b/3rdparty/Sabre/HTTP/Request.php @@ -184,7 +184,7 @@ class Sabre_HTTP_Request { * This method returns a readable stream resource. * If the asString parameter is set to true, a string is sent instead. * - * @param bool asString + * @param bool $asString * @return resource */ public function getBody($asString = false) { diff --git a/3rdparty/Sabre/HTTP/Response.php b/3rdparty/Sabre/HTTP/Response.php old mode 100755 new mode 100644 index ffe9bda208..9d436881bd --- a/3rdparty/Sabre/HTTP/Response.php +++ b/3rdparty/Sabre/HTTP/Response.php @@ -4,7 +4,7 @@ * Sabre_HTTP_Response * * @package Sabre - * @subpackage HTTP + * @subpackage HTTP * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License @@ -85,6 +85,9 @@ class Sabre_HTTP_Response { } + // @codeCoverageIgnoreStart + // We cannot reasonably test header() related methods. + /** * Sends an HTTP status header to the client * @@ -114,7 +117,9 @@ class Sabre_HTTP_Response { return header($name . ': ' . $value, $replace); else return false; + } + // @codeCoverageIgnoreEnd /** * Sets a bunch of HTTP Headers diff --git a/3rdparty/Sabre/HTTP/Util.php b/3rdparty/Sabre/HTTP/Util.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php old mode 100755 new mode 100644 index e6b4f7e535..8ccd7c9edf --- a/3rdparty/Sabre/HTTP/Version.php +++ b/3rdparty/Sabre/HTTP/Version.php @@ -14,7 +14,7 @@ class Sabre_HTTP_Version { /** * Full version number */ - const VERSION = '1.6.4'; + const VERSION = '1.7.0'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/HTTP/includes.php b/3rdparty/Sabre/HTTP/includes.php old mode 100755 new mode 100644 diff --git a/3rdparty/Sabre/VObject/Component.php b/3rdparty/Sabre/VObject/Component.php old mode 100755 new mode 100644 index b78a26133f..7604e3a9bb --- a/3rdparty/Sabre/VObject/Component.php +++ b/3rdparty/Sabre/VObject/Component.php @@ -1,5 +1,7 @@ 'Sabre_VObject_Component_VCalendar', - 'VEVENT' => 'Sabre_VObject_Component_VEvent', - 'VTODO' => 'Sabre_VObject_Component_VTodo', - 'VJOURNAL' => 'Sabre_VObject_Component_VJournal', - 'VALARM' => 'Sabre_VObject_Component_VAlarm', + 'VALARM' => 'Sabre\\VObject\\Component\\VAlarm', + 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar', + 'VCARD' => 'Sabre\\VObject\\Component\\VCard', + 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent', + 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal', + 'VTODO' => 'Sabre\\VObject\\Component\\VTodo', + 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy', ); /** @@ -50,7 +52,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * * @param string $name * @param string $value - * @return Sabre_VObject_Component + * @return Component */ static public function create($name, $value = null) { @@ -71,9 +73,9 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * be overridden with the iterator argument * * @param string $name - * @param Sabre_VObject_ElementList $iterator + * @param ElementList $iterator */ - public function __construct($name, Sabre_VObject_ElementList $iterator = null) { + public function __construct($name, ElementList $iterator = null) { $this->name = strtoupper($name); if (!is_null($iterator)) $this->iterator = $iterator; @@ -94,40 +96,54 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * * This is solely used by the childrenSort method. * - * A higher score means the item will be higher in the list + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. * - * @param Sabre_VObject_Node $n + * @param int $key + * @param array $array * @return int */ - $sortScore = function($n) { + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Component) { - if ($n instanceof Sabre_VObject_Component) { // We want to encode VTIMEZONE first, this is a personal // preference. - if ($n->name === 'VTIMEZONE') { - return 1; + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; } else { - return 0; + $score=400000000; + return $score+$key; } } else { + // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first - if ($n->name === 'VERSION') { - return 3; - } else { - return 2; + if ($array[$key] instanceof Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } } } }; - usort($this->children, function($a, $b) use ($sortScore) { + $tmp = $this->children; + uksort($this->children, function($a, $b) use ($sortScore, $tmp) { - $sA = $sortScore($a); - $sB = $sortScore($b); + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); if ($sA === $sB) return 0; - return ($sA > $sB) ? -1 : 1; + return ($sA < $sB) ? -1 : 1; }); @@ -143,8 +159,8 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * * You can call this method with the following syntaxes: * - * add(Sabre_VObject_Element $element) - * add(string $name, $value) + * add(Node $node) + * add(string $name, $value, array $parameters = array()) * * The first version adds an Element * The second adds a property as a string. @@ -153,26 +169,23 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * @param mixed $itemValue * @return void */ - public function add($item, $itemValue = null) { + public function add($item, $itemValue = null, array $parameters = array()) { - if ($item instanceof Sabre_VObject_Element) { + if ($item instanceof Node) { if (!is_null($itemValue)) { - throw new InvalidArgumentException('The second argument must not be specified, when passing a VObject'); + throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); } $item->parent = $this; $this->children[] = $item; } elseif(is_string($item)) { - if (!is_scalar($itemValue)) { - throw new InvalidArgumentException('The second argument must be scalar'); - } - $item = Sabre_VObject_Property::create($item,$itemValue); + $item = Property::create($item,$itemValue, $parameters); $item->parent = $this; $this->children[] = $item; } else { - throw new InvalidArgumentException('The first argument must either be a Sabre_VObject_Element or a string'); + throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string'); } @@ -181,11 +194,11 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { /** * Returns an iterable list of children * - * @return Sabre_VObject_ElementList + * @return ElementList */ public function children() { - return new Sabre_VObject_ElementList($this->children); + return new ElementList($this->children); } @@ -218,7 +231,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { if ( strtoupper($child->name) === $name && - (is_null($group) || ( $child instanceof Sabre_VObject_Property && strtoupper($child->group) === $group)) + (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) ) { $result[$key] = $child; @@ -241,7 +254,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { $result = array(); foreach($this->children as $child) { - if ($child instanceof Sabre_VObject_Component) { + if ($child instanceof Component) { $result[] = $child; } } @@ -250,6 +263,33 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { } + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $result = array(); + foreach($this->children as $child) { + $result = array_merge($result, $child->validate($options)); + } + return $result; + + } + /* Magic property accessors {{{ */ /** @@ -259,7 +299,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * null is returned. * * @param string $name - * @return Sabre_VObject_Property + * @return Property */ public function __get($name) { @@ -268,8 +308,8 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { return null; } else { $firstMatch = current($matches); - /** @var $firstMatch Sabre_VObject_Property */ - $firstMatch->setIterator(new Sabre_VObject_ElementList(array_values($matches))); + /** @var $firstMatch Property */ + $firstMatch->setIterator(new ElementList(array_values($matches))); return $firstMatch; } @@ -291,7 +331,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { /** * Using the setter method you can add properties or subcomponents * - * You can either pass a Sabre_VObject_Component, Sabre_VObject_Property + * You can either pass a Component, Property * object, or a string to automatically create a Property. * * If the item already exists, it will be removed. If you want to add @@ -306,7 +346,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { $matches = $this->select($name); $overWrite = count($matches)?key($matches):null; - if ($value instanceof Sabre_VObject_Component || $value instanceof Sabre_VObject_Property) { + if ($value instanceof Component || $value instanceof Property) { $value->parent = $this; if (!is_null($overWrite)) { $this->children[$overWrite] = $value; @@ -314,7 +354,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { $this->children[] = $value; } } elseif (is_scalar($value)) { - $property = Sabre_VObject_Property::create($name,$value); + $property = Property::create($name,$value); $property->parent = $this; if (!is_null($overWrite)) { $this->children[$overWrite] = $property; @@ -322,7 +362,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { $this->children[] = $property; } } else { - throw new InvalidArgumentException('You must pass a Sabre_VObject_Component, Sabre_VObject_Property or scalar type'); + throw new \InvalidArgumentException('You must pass a \\Sabre\\VObject\\Component, \\Sabre\\VObject\\Property or scalar type'); } } diff --git a/3rdparty/Sabre/VObject/Component/VAlarm.php b/3rdparty/Sabre/VObject/Component/VAlarm.php old mode 100755 new mode 100644 index ebb4a9b18f..383e16eef1 --- a/3rdparty/Sabre/VObject/Component/VAlarm.php +++ b/3rdparty/Sabre/VObject/Component/VAlarm.php @@ -1,17 +1,18 @@ TRIGGER; if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { - $triggerDuration = Sabre_VObject_DateTimeParser::parseDuration($this->TRIGGER); + $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; $parentComponent = $this->parent; if ($related === 'START') { - $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); + + if ($parentComponent->name === 'VTODO') { + $propName = 'DUE'; + } else { + $propName = 'DTSTART'; + } + + $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); $effectiveTrigger->add($triggerDuration); } else { if ($parentComponent->name === 'VTODO') { @@ -37,7 +45,7 @@ class Sabre_VObject_Component_VAlarm extends Sabre_VObject_Component { } elseif ($parentComponent->name === 'VEVENT') { $endProp = 'DTEND'; } else { - throw new Sabre_DAV_Exception('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); + throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); } if (isset($parentComponent->$endProp)) { @@ -45,7 +53,7 @@ class Sabre_VObject_Component_VAlarm extends Sabre_VObject_Component { $effectiveTrigger->add($triggerDuration); } elseif (isset($parentComponent->DURATION)) { $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); - $duration = Sabre_VObject_DateTimeParser::parseDuration($parentComponent->DURATION); + $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); $effectiveTrigger->add($duration); $effectiveTrigger->add($triggerDuration); } else { @@ -67,22 +75,22 @@ class Sabre_VObject_Component_VAlarm extends Sabre_VObject_Component { * The rules used to determine if an event falls within the specified * time-range is based on the CalDAV specification. * - * @param DateTime $start - * @param DateTime $end + * @param \DateTime $start + * @param \DateTime $end * @return bool */ - public function isInTimeRange(DateTime $start, DateTime $end) { + public function isInTimeRange(\DateTime $start, \DateTime $end) { $effectiveTrigger = $this->getEffectiveTriggerTime(); if (isset($this->DURATION)) { - $duration = Sabre_VObject_DateTimeParser::parseDuration($this->DURATION); + $duration = VObject\DateTimeParser::parseDuration($this->DURATION); $repeat = (string)$this->repeat; if (!$repeat) { $repeat = 1; } - $period = new DatePeriod($effectiveTrigger, $duration, (int)$repeat); + $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); foreach($period as $occurrence) { @@ -98,5 +106,3 @@ class Sabre_VObject_Component_VAlarm extends Sabre_VObject_Component { } } - -?> diff --git a/3rdparty/Sabre/VObject/Component/VCalendar.php b/3rdparty/Sabre/VObject/Component/VCalendar.php old mode 100755 new mode 100644 index f3be29afdb..73f2f6d34f --- a/3rdparty/Sabre/VObject/Component/VCalendar.php +++ b/3rdparty/Sabre/VObject/Component/VCalendar.php @@ -1,17 +1,19 @@ children as $component) { - if (!$component instanceof Sabre_VObject_Component) + if (!$component instanceof VObject\Component) continue; if (isset($component->{'RECURRENCE-ID'})) @@ -69,7 +71,7 @@ class Sabre_VObject_Component_VCalendar extends Sabre_VObject_Component { * @param DateTime $end * @return void */ - public function expand(DateTime $start, DateTime $end) { + public function expand(\DateTime $start, \DateTime $end) { $newEvents = array(); @@ -91,10 +93,10 @@ class Sabre_VObject_Component_VCalendar extends Sabre_VObject_Component { $uid = (string)$vevent->uid; if (!$uid) { - throw new LogicException('Event did not have a UID!'); + throw new \LogicException('Event did not have a UID!'); } - $it = new Sabre_VObject_RecurrenceIterator($this, $vevent->uid); + $it = new VObject\RecurrenceIterator($this, $vevent->uid); $it->fastForward($start); while($it->valid() && $it->getDTStart() < $end) { @@ -114,9 +116,9 @@ class Sabre_VObject_Component_VCalendar extends Sabre_VObject_Component { foreach($newEvents as $newEvent) { foreach($newEvent->children as $child) { - if ($child instanceof Sabre_VObject_Property_DateTime && - $child->getDateType() == Sabre_VObject_Property_DateTime::LOCALTZ) { - $child->setDateTime($child->getDateTime(),Sabre_VObject_Property_DateTime::UTC); + if ($child instanceof VObject\Property\DateTime && + $child->getDateType() == VObject\Property\DateTime::LOCALTZ) { + $child->setDateTime($child->getDateTime(),VObject\Property\DateTime::UTC); } } @@ -129,5 +131,112 @@ class Sabre_VObject_Component_VCalendar extends Sabre_VObject_Component { } + /** + * Validates the node for correctness. + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @return array + */ + /* + public function validate() { + + $warnings = array(); + + $version = $this->select('VERSION'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time', + 'node' => $this, + ); + } else { + if ((string)$this->VERSION !== '2.0') { + $warnings[] = array( + 'level' => 1, + 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', + 'node' => $this, + ); + } + } + $version = $this->select('PRODID'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time', + 'node' => $this, + ); + } + if (count($this->CALSCALE) > 1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The CALSCALE property must not be specified more than once.', + 'node' => $this, + ); + } + if (count($this->METHOD) > 1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The METHOD property must not be specified more than once.', + 'node' => $this, + ); + } + + $allowedComponents = array( + 'VEVENT', + 'VTODO', + 'VJOURNAL', + 'VFREEBUSY', + 'VTIMEZONE', + ); + $allowedProperties = array( + 'PRODID', + 'VERSION', + 'CALSCALE', + 'METHOD', + ); + $componentsFound = 0; + foreach($this->children as $child) { + if($child instanceof Component) { + $componentsFound++; + if (!in_array($child->name, $allowedComponents)) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The ' . $child->name . " component is not allowed in the VCALENDAR component", + 'node' => $this, + ); + } + } + if ($child instanceof Property) { + if (!in_array($child->name, $allowedProperties)) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The ' . $child->name . " property is not allowed in the VCALENDAR component", + 'node' => $this, + ); + } + } + } + + if ($componentsFound===0) { + $warnings[] = array( + 'level' => 1, + 'message' => 'An iCalendar object must have at least 1 component.', + 'node' => $this, + ); + } + + return array_merge( + $warnings, + parent::validate() + ); + + } + */ + } diff --git a/3rdparty/Sabre/VObject/Component/VCard.php b/3rdparty/Sabre/VObject/Component/VCard.php new file mode 100644 index 0000000000..b292698555 --- /dev/null +++ b/3rdparty/Sabre/VObject/Component/VCard.php @@ -0,0 +1,105 @@ +select('VERSION'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->VERSION = self::DEFAULT_VERSION; + } + } else { + $version = (string)$this->VERSION; + if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { + $warnings[] = array( + 'level' => 1, + 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->VERSION = '4.0'; + } + } + + } + $version = $this->select('FN'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The FN property must appear in the VCARD component exactly 1 time', + 'node' => $this, + ); + if (($options & self::REPAIR) && count($version) === 0) { + // We're going to try to see if we can use the contents of the + // N property. + if (isset($this->N)) { + $value = explode(';', (string)$this->N); + if (isset($value[1]) && $value[1]) { + $this->FN = $value[1] . ' ' . $value[0]; + } else { + $this->FN = $value[0]; + } + + // Otherwise, the ORG property may work + } elseif (isset($this->ORG)) { + $this->FN = (string)$this->ORG; + } + + } + } + + return array_merge( + parent::validate($options), + $warnings + ); + + } + +} + diff --git a/3rdparty/Sabre/VObject/Component/VEvent.php b/3rdparty/Sabre/VObject/Component/VEvent.php old mode 100755 new mode 100644 index d6b910874d..9d10966e20 --- a/3rdparty/Sabre/VObject/Component/VEvent.php +++ b/3rdparty/Sabre/VObject/Component/VEvent.php @@ -1,17 +1,18 @@ RRULE) { - $it = new Sabre_VObject_RecurrenceIterator($this); + $it = new VObject\RecurrenceIterator($this); $it->fastForward($start); // We fast-forwarded to a spot where the end-time of the @@ -53,8 +54,8 @@ class Sabre_VObject_Component_VEvent extends Sabre_VObject_Component { } elseif (isset($this->DURATION)) { $effectiveEnd = clone $effectiveStart; - $effectiveEnd->add( Sabre_VObject_DateTimeParser::parseDuration($this->DURATION) ); - } elseif ($this->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE) { + $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); + } elseif ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) { $effectiveEnd = clone $effectiveStart; $effectiveEnd->modify('+1 day'); } else { @@ -67,5 +68,3 @@ class Sabre_VObject_Component_VEvent extends Sabre_VObject_Component { } } - -?> diff --git a/3rdparty/Sabre/VObject/Component/VFreeBusy.php b/3rdparty/Sabre/VObject/Component/VFreeBusy.php new file mode 100644 index 0000000000..d6da52cbd7 --- /dev/null +++ b/3rdparty/Sabre/VObject/Component/VFreeBusy.php @@ -0,0 +1,68 @@ +select('FREEBUSY') as $freebusy) { + + // We are only interested in FBTYPE=BUSY (the default), + // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. + if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { + continue; + } + + // The freebusy component can hold more than 1 value, separated by + // commas. + $periods = explode(',', (string)$freebusy); + + foreach($periods as $period) { + // Every period is formatted as [start]/[end]. The start is an + // absolute UTC time, the end may be an absolute UTC time, or + // duration (relative) value. + list($busyStart, $busyEnd) = explode('/', $period); + + $busyStart = VObject\DateTimeParser::parse($busyStart); + $busyEnd = VObject\DateTimeParser::parse($busyEnd); + if ($busyEnd instanceof \DateInterval) { + $tmp = clone $busyStart; + $tmp->add($busyEnd); + $busyEnd = $tmp; + } + + if($start < $busyEnd && $end > $busyStart) { + return false; + } + + } + + } + + return true; + + } + +} + diff --git a/3rdparty/Sabre/VObject/Component/VJournal.php b/3rdparty/Sabre/VObject/Component/VJournal.php old mode 100755 new mode 100644 index 22b3ec921e..f104a1f66e --- a/3rdparty/Sabre/VObject/Component/VJournal.php +++ b/3rdparty/Sabre/VObject/Component/VJournal.php @@ -1,17 +1,19 @@ DTSTART)?$this->DTSTART->getDateTime():null; if ($dtstart) { $effectiveEnd = clone $dtstart; - if ($this->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE) { + if ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) { $effectiveEnd->modify('+1 day'); } @@ -42,5 +44,3 @@ class Sabre_VObject_Component_VJournal extends Sabre_VObject_Component { } } - -?> diff --git a/3rdparty/Sabre/VObject/Component/VTodo.php b/3rdparty/Sabre/VObject/Component/VTodo.php old mode 100755 new mode 100644 index 79d06298d7..5f879aea43 --- a/3rdparty/Sabre/VObject/Component/VTodo.php +++ b/3rdparty/Sabre/VObject/Component/VTodo.php @@ -1,17 +1,19 @@ DTSTART)?$this->DTSTART->getDateTime():null; - $duration = isset($this->DURATION)?Sabre_VObject_DateTimeParser::parseDuration($this->DURATION):null; + $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; $due = isset($this->DUE)?$this->DUE->getDateTime():null; $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; @@ -64,5 +66,3 @@ class Sabre_VObject_Component_VTodo extends Sabre_VObject_Component { } } - -?> diff --git a/3rdparty/Sabre/VObject/DateTimeParser.php b/3rdparty/Sabre/VObject/DateTimeParser.php old mode 100755 new mode 100644 index 23a4bb6991..d09ded9676 --- a/3rdparty/Sabre/VObject/DateTimeParser.php +++ b/3rdparty/Sabre/VObject/DateTimeParser.php @@ -1,18 +1,18 @@ setTimeZone(new DateTimeZone('UTC')); + $date->setTimeZone(new \DateTimeZone('UTC')); return $date; } @@ -54,13 +54,13 @@ class Sabre_VObject_DateTimeParser { static public function parseDate($date) { // Format is YYYYMMDD - $result = preg_match('/^([1-3][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches); + $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches); if (!$result) { - throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar date value is incorrect: ' . $date); + throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); } - $date = new DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new DateTimeZone('UTC')); + $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); return $date; } @@ -79,7 +79,7 @@ class Sabre_VObject_DateTimeParser { $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); if (!$result) { - throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar duration value is incorrect: ' . $duration); + throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); } if (!$asString) { @@ -128,7 +128,7 @@ class Sabre_VObject_DateTimeParser { if ($duration==='P') { $duration = 'PT0S'; } - $iv = new DateInterval($duration); + $iv = new \DateInterval($duration); if ($invert) $iv->invert = true; return $iv; diff --git a/3rdparty/Sabre/VObject/Element.php b/3rdparty/Sabre/VObject/Element.php deleted file mode 100755 index e20ff0b353..0000000000 --- a/3rdparty/Sabre/VObject/Element.php +++ /dev/null @@ -1,16 +0,0 @@ -vevent where there's multiple VEVENT objects. * - * @package Sabre - * @subpackage VObject * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -class Sabre_VObject_ElementList implements Iterator, Countable, ArrayAccess { +class ElementList implements \Iterator, \Countable, \ArrayAccess { /** * Inner elements @@ -44,7 +44,7 @@ class Sabre_VObject_ElementList implements Iterator, Countable, ArrayAccess { /** * Returns current item in iteration * - * @return Sabre_VObject_Element + * @return Element */ public function current() { @@ -149,7 +149,7 @@ class Sabre_VObject_ElementList implements Iterator, Countable, ArrayAccess { */ public function offsetSet($offset,$value) { - throw new LogicException('You can not add new objects to an ElementList'); + throw new \LogicException('You can not add new objects to an ElementList'); } @@ -163,7 +163,7 @@ class Sabre_VObject_ElementList implements Iterator, Countable, ArrayAccess { */ public function offsetUnset($offset) { - throw new LogicException('You can not remove objects from an ElementList'); + throw new \LogicException('You can not remove objects from an ElementList'); } diff --git a/3rdparty/Sabre/VObject/FreeBusyGenerator.php b/3rdparty/Sabre/VObject/FreeBusyGenerator.php old mode 100755 new mode 100644 index 1c96a64a00..c607d119ce --- a/3rdparty/Sabre/VObject/FreeBusyGenerator.php +++ b/3rdparty/Sabre/VObject/FreeBusyGenerator.php @@ -1,5 +1,7 @@ setTimeRange($start, $end); + } + + if ($objects) { + $this->setObjects($objects); + } + + } + /** * Sets the VCALENDAR object. * @@ -54,10 +77,10 @@ class Sabre_VObject_FreeBusyGenerator { * * The VFREEBUSY object will be automatically added though. * - * @param Sabre_VObject_Component $vcalendar + * @param Component $vcalendar * @return void */ - public function setBaseObject(Sabre_VObject_Component $vcalendar) { + public function setBaseObject(Component $vcalendar) { $this->baseObject = $vcalendar; @@ -66,22 +89,28 @@ class Sabre_VObject_FreeBusyGenerator { /** * Sets the input objects * - * Every object must either be a string or a Sabre_VObject_Component. + * You must either specify a valendar object as a strong, or as the parse + * Component. + * It's also possible to specify multiple objects as an array. * - * @param array $objects + * @param mixed $objects * @return void */ - public function setObjects(array $objects) { + public function setObjects($objects) { + + if (!is_array($objects)) { + $objects = array($objects); + } $this->objects = array(); foreach($objects as $object) { if (is_string($object)) { - $this->objects[] = Sabre_VObject_Reader::read($object); - } elseif ($object instanceof Sabre_VObject_Component) { + $this->objects[] = Reader::read($object); + } elseif ($object instanceof Component) { $this->objects[] = $object; } else { - throw new InvalidArgumentException('You can only pass strings or Sabre_VObject_Component arguments to setObjects'); + throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects'); } } @@ -97,7 +126,7 @@ class Sabre_VObject_FreeBusyGenerator { * @param DateTime $end * @return void */ - public function setTimeRange(DateTime $start = null, DateTime $end = null) { + public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { $this->start = $start; $this->end = $end; @@ -108,7 +137,7 @@ class Sabre_VObject_FreeBusyGenerator { * Parses the input data and returns a correct VFREEBUSY object, wrapped in * a VCALENDAR. * - * @return Sabre_VObject_Component + * @return Component */ public function getResult() { @@ -140,7 +169,7 @@ class Sabre_VObject_FreeBusyGenerator { if ($component->RRULE) { - $iterator = new Sabre_VObject_RecurrenceIterator($object, (string)$component->uid); + $iterator = new RecurrenceIterator($object, (string)$component->uid); if ($this->start) { $iterator->fastForward($this->start); } @@ -172,10 +201,10 @@ class Sabre_VObject_FreeBusyGenerator { if (isset($component->DTEND)) { $endTime = $component->DTEND->getDateTime(); } elseif (isset($component->DURATION)) { - $duration = Sabre_VObject_DateTimeParser::parseDuration((string)$component->DURATION); + $duration = DateTimeParser::parseDuration((string)$component->DURATION); $endTime = clone $startTime; $endTime->add($duration); - } elseif ($component->DTSTART->getDateType() === Sabre_VObject_Property_DateTime::DATE) { + } elseif ($component->DTSTART->getDateType() === Property\DateTime::DATE) { $endTime = clone $startTime; $endTime->modify('+1 day'); } else { @@ -212,14 +241,14 @@ class Sabre_VObject_FreeBusyGenerator { $values = explode(',', $freebusy); foreach($values as $value) { list($startTime, $endTime) = explode('/', $value); - $startTime = Sabre_VObject_DateTimeParser::parseDateTime($startTime); + $startTime = DateTimeParser::parseDateTime($startTime); if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { - $duration = Sabre_VObject_DateTimeParser::parseDuration($endTime); + $duration = DateTimeParser::parseDuration($endTime); $endTime = clone $startTime; $endTime->add($duration); } else { - $endTime = Sabre_VObject_DateTimeParser::parseDateTime($endTime); + $endTime = DateTimeParser::parseDateTime($endTime); } if($this->start && $this->start > $endTime) continue; @@ -248,39 +277,35 @@ class Sabre_VObject_FreeBusyGenerator { if ($this->baseObject) { $calendar = $this->baseObject; } else { - $calendar = new Sabre_VObject_Component('VCALENDAR'); + $calendar = new Component('VCALENDAR'); $calendar->version = '2.0'; - if (Sabre_DAV_Server::$exposeVersion) { - $calendar->prodid = '-//SabreDAV//Sabre VObject ' . Sabre_VObject_Version::VERSION . '//EN'; - } else { - $calendar->prodid = '-//SabreDAV//Sabre VObject//EN'; - } + $calendar->prodid = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN'; $calendar->calscale = 'GREGORIAN'; } - $vfreebusy = new Sabre_VObject_Component('VFREEBUSY'); + $vfreebusy = new Component('VFREEBUSY'); $calendar->add($vfreebusy); if ($this->start) { - $dtstart = new Sabre_VObject_Property_DateTime('DTSTART'); - $dtstart->setDateTime($this->start,Sabre_VObject_Property_DateTime::UTC); + $dtstart = new Property\DateTime('DTSTART'); + $dtstart->setDateTime($this->start,Property\DateTime::UTC); $vfreebusy->add($dtstart); } if ($this->end) { - $dtend = new Sabre_VObject_Property_DateTime('DTEND'); - $dtend->setDateTime($this->start,Sabre_VObject_Property_DateTime::UTC); + $dtend = new Property\DateTime('DTEND'); + $dtend->setDateTime($this->end,Property\DateTime::UTC); $vfreebusy->add($dtend); } - $dtstamp = new Sabre_VObject_Property_DateTime('DTSTAMP'); - $dtstamp->setDateTime(new DateTime('now'), Sabre_VObject_Property_DateTime::UTC); + $dtstamp = new Property\DateTime('DTSTAMP'); + $dtstamp->setDateTime(new \DateTime('now'), Property\DateTime::UTC); $vfreebusy->add($dtstamp); foreach($busyTimes as $busyTime) { - $busyTime[0]->setTimeZone(new DateTimeZone('UTC')); - $busyTime[1]->setTimeZone(new DateTimeZone('UTC')); + $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); + $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); - $prop = new Sabre_VObject_Property( + $prop = new Property( 'FREEBUSY', $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') ); diff --git a/3rdparty/Sabre/VObject/Node.php b/3rdparty/Sabre/VObject/Node.php old mode 100755 new mode 100644 index d89e01b56c..5d2e1ce300 --- a/3rdparty/Sabre/VObject/Node.php +++ b/3rdparty/Sabre/VObject/Node.php @@ -1,15 +1,20 @@ iterator)) return $this->iterator; - return new Sabre_VObject_ElementList(array($this)); + return new ElementList(array($this)); } @@ -53,10 +81,10 @@ abstract class Sabre_VObject_Node implements IteratorAggregate, ArrayAccess, Cou * * Note that this is not actually part of the iterator interface * - * @param Sabre_VObject_ElementList $iterator + * @param ElementList $iterator * @return void */ - public function setIterator(Sabre_VObject_ElementList $iterator) { + public function setIterator(ElementList $iterator) { $this->iterator = $iterator; @@ -125,9 +153,14 @@ abstract class Sabre_VObject_Node implements IteratorAggregate, ArrayAccess, Cou public function offsetSet($offset,$value) { $iterator = $this->getIterator(); - return $iterator->offsetSet($offset,$value); + $iterator->offsetSet($offset,$value); + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace } + // @codeCoverageIgnoreEnd /** * Sets an item through ArrayAccess. @@ -140,9 +173,14 @@ abstract class Sabre_VObject_Node implements IteratorAggregate, ArrayAccess, Cou public function offsetUnset($offset) { $iterator = $this->getIterator(); - return $iterator->offsetUnset($offset); + $iterator->offsetUnset($offset); + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace } + // @codeCoverageIgnoreEnd /* }}} */ diff --git a/3rdparty/Sabre/VObject/Parameter.php b/3rdparty/Sabre/VObject/Parameter.php old mode 100755 new mode 100644 index 2e39af5f78..d6d7c54c3b --- a/3rdparty/Sabre/VObject/Parameter.php +++ b/3rdparty/Sabre/VObject/Parameter.php @@ -1,5 +1,7 @@ name = strtoupper($name); $this->value = $value; diff --git a/3rdparty/Sabre/VObject/ParseException.php b/3rdparty/Sabre/VObject/ParseException.php old mode 100755 new mode 100644 index 1b5e95bf16..91386fec53 --- a/3rdparty/Sabre/VObject/ParseException.php +++ b/3rdparty/Sabre/VObject/ParseException.php @@ -1,12 +1,12 @@ 'Sabre_VObject_Property_DateTime', - 'CREATED' => 'Sabre_VObject_Property_DateTime', - 'DTEND' => 'Sabre_VObject_Property_DateTime', - 'DTSTAMP' => 'Sabre_VObject_Property_DateTime', - 'DTSTART' => 'Sabre_VObject_Property_DateTime', - 'DUE' => 'Sabre_VObject_Property_DateTime', - 'EXDATE' => 'Sabre_VObject_Property_MultiDateTime', - 'LAST-MODIFIED' => 'Sabre_VObject_Property_DateTime', - 'RECURRENCE-ID' => 'Sabre_VObject_Property_DateTime', - 'TRIGGER' => 'Sabre_VObject_Property_DateTime', + 'COMPLETED' => 'Sabre\\VObject\\Property\\DateTime', + 'CREATED' => 'Sabre\\VObject\\Property\\DateTime', + 'DTEND' => 'Sabre\\VObject\\Property\\DateTime', + 'DTSTAMP' => 'Sabre\\VObject\\Property\\DateTime', + 'DTSTART' => 'Sabre\\VObject\\Property\\DateTime', + 'DUE' => 'Sabre\\VObject\\Property\\DateTime', + 'EXDATE' => 'Sabre\\VObject\\Property\\MultiDateTime', + 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\DateTime', + 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\DateTime', + 'TRIGGER' => 'Sabre\\VObject\\Property\\DateTime', + 'N' => 'Sabre\\VObject\\Property\\Compound', + 'ORG' => 'Sabre\\VObject\\Property\\Compound', + 'ADR' => 'Sabre\\VObject\\Property\\Compound', + 'CATEGORIES' => 'Sabre\\VObject\\Property\\Compound', ); /** * Creates the new property by name, but in addition will also see if * there's a class mapped to the property name. * + * Parameters can be specified with the optional third argument. Parameters + * must be a key->value map of the parameter name, and value. If the value + * is specified as an array, it is assumed that multiple parameters with + * the same name should be added. + * * @param string $name * @param string $value - * @return void + * @param array $parameters + * @return Property */ - static public function create($name, $value = null) { + static public function create($name, $value = null, array $parameters = array()) { $name = strtoupper($name); $shortName = $name; @@ -87,9 +97,9 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { } if (isset(self::$classMap[$shortName])) { - return new self::$classMap[$shortName]($name, $value); + return new self::$classMap[$shortName]($name, $value, $parameters); } else { - return new self($name, $value); + return new self($name, $value, $parameters); } } @@ -97,14 +107,20 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { /** * Creates a new property object * - * By default this object will iterate over its own children, but this can - * be overridden with the iterator argument + * Parameters can be specified with the optional third argument. Parameters + * must be a key->value map of the parameter name, and value. If the value + * is specified as an array, it is assumed that multiple parameters with + * the same name should be added. * * @param string $name * @param string $value - * @param Sabre_VObject_ElementList $iterator + * @param array $parameters */ - public function __construct($name, $value = null, $iterator = null) { + public function __construct($name, $value = null, array $parameters = array()) { + + if (!is_scalar($value) && !is_null($value)) { + throw new \InvalidArgumentException('The value argument must be scalar or null'); + } $name = strtoupper($name); $group = null; @@ -113,13 +129,22 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { } $this->name = $name; $this->group = $group; - if (!is_null($iterator)) $this->iterator = $iterator; $this->setValue($value); + foreach($parameters as $paramName => $paramValues) { + + if (!is_array($paramValues)) { + $paramValues = array($paramValues); + } + + foreach($paramValues as $paramValue) { + $this->add($paramName, $paramValue); + } + + } + } - - /** * Updates the internal value * @@ -142,13 +167,12 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { $str = $this->name; if ($this->group) $str = $this->group . '.' . $this->name; - if (count($this->parameters)) { - foreach($this->parameters as $param) { + foreach($this->parameters as $param) { - $str.=';' . $param->serialize(); + $str.=';' . $param->serialize(); - } } + $src = array( '\\', "\n", @@ -180,7 +204,7 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { * * You can call this method with the following syntaxes: * - * add(Sabre_VObject_Parameter $element) + * add(Parameter $element) * add(string $name, $value) * * The first version adds an Parameter @@ -192,24 +216,21 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { */ public function add($item, $itemValue = null) { - if ($item instanceof Sabre_VObject_Parameter) { + if ($item instanceof Parameter) { if (!is_null($itemValue)) { - throw new InvalidArgumentException('The second argument must not be specified, when passing a VObject'); + throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject'); } $item->parent = $this; $this->parameters[] = $item; } elseif(is_string($item)) { - if (!is_scalar($itemValue) && !is_null($itemValue)) { - throw new InvalidArgumentException('The second argument must be scalar'); - } - $parameter = new Sabre_VObject_Parameter($item,$itemValue); + $parameter = new Parameter($item,$itemValue); $parameter->parent = $this; $this->parameters[] = $parameter; } else { - throw new InvalidArgumentException('The first argument must either be a Sabre_VObject_Element or a string'); + throw new \InvalidArgumentException('The first argument must either be a Node a string'); } @@ -240,7 +261,7 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { * Returns a parameter, or parameter list. * * @param string $name - * @return Sabre_VObject_Element + * @return Node */ public function offsetGet($name) { @@ -258,7 +279,7 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { } elseif (count($result)===1) { return $result[0]; } else { - $result[0]->setIterator(new Sabre_VObject_ElementList($result)); + $result[0]->setIterator(new ElementList($result)); return $result[0]; } @@ -273,25 +294,25 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { */ public function offsetSet($name, $value) { - if (is_int($name)) return parent::offsetSet($name, $value); + if (is_int($name)) parent::offsetSet($name, $value); if (is_scalar($value)) { if (!is_string($name)) - throw new InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.'); + throw new \InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.'); $this->offsetUnset($name); - $parameter = new Sabre_VObject_Parameter($name, $value); + $parameter = new Parameter($name, $value); $parameter->parent = $this; $this->parameters[] = $parameter; - } elseif ($value instanceof Sabre_VObject_Parameter) { + } elseif ($value instanceof Parameter) { if (!is_null($name)) - throw new InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a Sabre_VObject_Parameter. Add using $array[]=$parameterObject.'); + throw new \InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a \\Sabre\\VObject\\Parameter. Add using $array[]=$parameterObject.'); $value->parent = $this; $this->parameters[] = $value; } else { - throw new InvalidArgumentException('You can only add parameters to the property object'); + throw new \InvalidArgumentException('You can only add parameters to the property object'); } } @@ -304,7 +325,7 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { */ public function offsetUnset($name) { - if (is_int($name)) return parent::offsetUnset($name); + if (is_int($name)) parent::offsetUnset($name); $name = strtoupper($name); foreach($this->parameters as $key=>$parameter) { @@ -345,4 +366,65 @@ class Sabre_VObject_Property extends Sabre_VObject_Element { } + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + // Checking if our value is UTF-8 + if (!StringUtil::isUTF8($this->value)) { + $warnings[] = array( + 'level' => 1, + 'message' => 'Property is not valid UTF-8!', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->value = StringUtil::convertToUTF8($this->value); + } + } + + // Checking if the propertyname does not contain any invalid bytes. + if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', + 'node' => $this, + ); + if ($options & self::REPAIR) { + // Uppercasing and converting underscores to dashes. + $this->name = strtoupper( + str_replace('_', '-', $this->name) + ); + // Removing every other invalid character + $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); + + } + + } + + // Validating inner parameters + foreach($this->parameters as $param) { + $warnings = array_merge($warnings, $param->validate($options)); + } + + return $warnings; + + } + } diff --git a/3rdparty/Sabre/VObject/Property/Compound.php b/3rdparty/Sabre/VObject/Property/Compound.php new file mode 100644 index 0000000000..e2c18e7726 --- /dev/null +++ b/3rdparty/Sabre/VObject/Property/Compound.php @@ -0,0 +1,129 @@ + ';', + 'ADR' => ';', + 'ORG' => ';', + 'CATEGORIES' => ',', + ); + + /** + * The currently used delimiter. + * + * @var string + */ + protected $delimiter = null; + + /** + * Get a compound value as an array. + * + * @param $name string + * @return array + */ + public function getParts() { + + if (is_null($this->value)) { + return array(); + } + + $delimiter = $this->getDelimiter(); + + // split by any $delimiter which is NOT prefixed by a slash. + // Note that this is not a a perfect solution. If a value is prefixed + // by two slashes, it should actually be split anyway. + // + // Hopefully we can fix this better in a future version, where we can + // break compatibility a bit. + $compoundValues = preg_split("/(?value); + + // remove slashes from any semicolon and comma left escaped in the single values + $compoundValues = array_map( + function($val) { + return strtr($val, array('\,' => ',', '\;' => ';')); + }, $compoundValues); + + return $compoundValues; + + } + + /** + * Returns the delimiter for this property. + * + * @return string + */ + public function getDelimiter() { + + if (!$this->delimiter) { + if (isset(self::$delimiterMap[$this->name])) { + $this->delimiter = self::$delimiterMap[$this->name]; + } else { + // To be a bit future proof, we are going to default the + // delimiter to ; + $this->delimiter = ';'; + } + } + return $this->delimiter; + + } + + /** + * Set a compound value as an array. + * + * + * @param $name string + * @return array + */ + public function setParts(array $values) { + + // add slashes to all semicolons and commas in the single values + $values = array_map( + function($val) { + return strtr($val, array(',' => '\,', ';' => '\;')); + }, $values); + + $this->setValue( + implode($this->getDelimiter(), $values) + ); + + } + +} diff --git a/3rdparty/Sabre/VObject/Property/DateTime.php b/3rdparty/Sabre/VObject/Property/DateTime.php old mode 100755 new mode 100644 index fe2372caa8..556cd441d8 --- a/3rdparty/Sabre/VObject/Property/DateTime.php +++ b/3rdparty/Sabre/VObject/Property/DateTime.php @@ -1,5 +1,9 @@ offsetSet('VALUE','DATE-TIME'); break; case self::UTC : - $dt->setTimeZone(new DateTimeZone('UTC')); + $dt->setTimeZone(new \DateTimeZone('UTC')); $this->setValue($dt->format('Ymd\\THis\\Z')); $this->offsetUnset('VALUE'); $this->offsetUnset('TZID'); @@ -93,7 +95,7 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { $this->offsetSet('VALUE','DATE'); break; default : - throw new InvalidArgumentException('You must pass a valid dateType constant'); + throw new \InvalidArgumentException('You must pass a valid dateType constant'); } $this->dateTime = $dt; @@ -106,7 +108,7 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { * * If no value was set, this method returns null. * - * @return DateTime|null + * @return \DateTime|null */ public function getDateTime() { @@ -152,11 +154,11 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { * * @param string|null $propertyValue The string to parse (yymmdd or * ymmddThhmmss, etc..) - * @param Sabre_VObject_Property|null $property The instance of the + * @param \Sabre\VObject\Property|null $property The instance of the * property we're parsing. * @return array */ - static public function parseData($propertyValue, Sabre_VObject_Property $property = null) { + static public function parseData($propertyValue, VObject\Property $property = null) { if (is_null($propertyValue)) { return array(null, null); @@ -167,14 +169,14 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { $regex = "/^$date(T$time(?PZ)?)?$/"; if (!preg_match($regex, $propertyValue, $matches)) { - throw new InvalidArgumentException($propertyValue . ' is not a valid DateTime or Date string'); + throw new \InvalidArgumentException($propertyValue . ' is not a valid \DateTime or Date string'); } if (!isset($matches['hour'])) { // Date-only return array( self::DATE, - new DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00'), + new \DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00', new \DateTimeZone('UTC')), ); } @@ -187,8 +189,8 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { $matches['second']; if (isset($matches['isutc'])) { - $dt = new DateTime($dateStr,new DateTimeZone('UTC')); - $dt->setTimeZone(new DateTimeZone('UTC')); + $dt = new \DateTime($dateStr,new \DateTimeZone('UTC')); + $dt->setTimeZone(new \DateTimeZone('UTC')); return array( self::UTC, $dt @@ -198,56 +200,27 @@ class Sabre_VObject_Property_DateTime extends Sabre_VObject_Property { // Finding the timezone. $tzid = $property['TZID']; if (!$tzid) { + // This was a floating time string. This implies we use the + // timezone from date_default_timezone_set / date.timezone ini + // setting. return array( self::LOCAL, - new DateTime($dateStr) + new \DateTime($dateStr) ); } - try { - // tzid an Olson identifier? - $tz = new DateTimeZone($tzid->value); - } catch (Exception $e) { - - // Not an Olson id, we're going to try to find the information - // through the time zone name map. - $newtzid = Sabre_VObject_WindowsTimezoneMap::lookup($tzid->value); - if (is_null($newtzid)) { - - // Not a well known time zone name either, we're going to try - // to find the information through the VTIMEZONE object. - - // First we find the root object - $root = $property; - while($root->parent) { - $root = $root->parent; - } - - if (isset($root->VTIMEZONE)) { - foreach($root->VTIMEZONE as $vtimezone) { - if (((string)$vtimezone->TZID) == $tzid) { - if (isset($vtimezone->{'X-LIC-LOCATION'})) { - $newtzid = (string)$vtimezone->{'X-LIC-LOCATION'}; - } else { - // No libical location specified. As a last resort we could - // try matching $vtimezone's DST rules against all known - // time zones returned by DateTimeZone::list* - - // TODO - } - } - } - } - } - - try { - $tz = new DateTimeZone($newtzid); - } catch (Exception $e) { - // If all else fails, we use the default PHP timezone - $tz = new DateTimeZone(date_default_timezone_get()); - } + // To look up the timezone, we must first find the VCALENDAR component. + $root = $property; + while($root->parent) { + $root = $root->parent; } - $dt = new DateTime($dateStr, $tz); + if ($root->name === 'VCALENDAR') { + $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid, $root); + } else { + $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid); + } + + $dt = new \DateTime($dateStr, $tz); $dt->setTimeZone($tz); return array( diff --git a/3rdparty/Sabre/VObject/Property/MultiDateTime.php b/3rdparty/Sabre/VObject/Property/MultiDateTime.php old mode 100755 new mode 100644 index ae53ab6a61..629ef4a134 --- a/3rdparty/Sabre/VObject/Property/MultiDateTime.php +++ b/3rdparty/Sabre/VObject/Property/MultiDateTime.php @@ -1,5 +1,9 @@ offsetUnset('VALUE'); $this->offsetUnset('TZID'); switch($dateType) { - case Sabre_VObject_Property_DateTime::LOCAL : + case DateTime::LOCAL : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd\\THis'); @@ -62,16 +64,16 @@ class Sabre_VObject_Property_MultiDateTime extends Sabre_VObject_Property { $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE-TIME'); break; - case Sabre_VObject_Property_DateTime::UTC : + case DateTime::UTC : $val = array(); foreach($dt as $i) { - $i->setTimeZone(new DateTimeZone('UTC')); + $i->setTimeZone(new \DateTimeZone('UTC')); $val[] = $i->format('Ymd\\THis\\Z'); } $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE-TIME'); break; - case Sabre_VObject_Property_DateTime::LOCALTZ : + case DateTime::LOCALTZ : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd\\THis'); @@ -80,7 +82,7 @@ class Sabre_VObject_Property_MultiDateTime extends Sabre_VObject_Property { $this->offsetSet('VALUE','DATE-TIME'); $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName()); break; - case Sabre_VObject_Property_DateTime::DATE : + case DateTime::DATE : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd'); @@ -89,7 +91,7 @@ class Sabre_VObject_Property_MultiDateTime extends Sabre_VObject_Property { $this->offsetSet('VALUE','DATE'); break; default : - throw new InvalidArgumentException('You must pass a valid dateType constant'); + throw new \InvalidArgumentException('You must pass a valid dateType constant'); } $this->dateTimes = $dt; @@ -121,7 +123,7 @@ class Sabre_VObject_Property_MultiDateTime extends Sabre_VObject_Property { list( $type, $dt - ) = Sabre_VObject_Property_DateTime::parseData($val, $this); + ) = DateTime::parseData($val, $this); $dts[] = $dt; $this->dateType = $type; } @@ -154,7 +156,7 @@ class Sabre_VObject_Property_MultiDateTime extends Sabre_VObject_Property { list( $type, $dt - ) = Sabre_VObject_Property_DateTime::parseData($val, $this); + ) = DateTime::parseData($val, $this); $dts[] = $dt; $this->dateType = $type; } diff --git a/3rdparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php old mode 100755 new mode 100644 index eea73fa3dc..a24590cb38 --- a/3rdparty/Sabre/VObject/Reader.php +++ b/3rdparty/Sabre/VObject/Reader.php @@ -1,5 +1,7 @@ add(self::readLine($lines)); + while(strtoupper(substr($nextLine,0,4))!=="END:") { + $parsedLine = self::readLine($lines, $options); $nextLine = current($lines); + if (is_null($parsedLine)) { + continue; + } + $obj->add($parsedLine); + if ($nextLine===false) - throw new Sabre_VObject_ParseException('Invalid VObject. Document ended prematurely.'); + throw new ParseException('Invalid VObject. Document ended prematurely.'); } // Checking component name of the 'END:' line. if (substr($nextLine,4)!==$obj->name) { - throw new Sabre_VObject_ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"'); + throw new ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"'); } next($lines); @@ -99,19 +126,26 @@ class Sabre_VObject_Reader { // Properties //$result = preg_match('/(?P[A-Z0-9-]+)(?:;(?P^(?([^:^\"]|\"([^\"]*)\")*))?"; $regex = "/^(?P$token)$parameters:(?P.*)$/i"; $result = preg_match($regex,$line,$matches); if (!$result) { - throw new Sabre_VObject_ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format'); + if ($options & self::OPTION_IGNORE_INVALID_LINES) { + return null; + } else { + throw new ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format'); + } } $propertyName = strtoupper($matches['name']); - $propertyValue = preg_replace_callback('#(\\\\(\\\\|N|n|;|,))#',function($matches) { + $propertyValue = preg_replace_callback('#(\\\\(\\\\|N|n))#',function($matches) { if ($matches[2]==='n' || $matches[2]==='N') { return "\n"; } else { @@ -119,7 +153,7 @@ class Sabre_VObject_Reader { } }, $matches['value']); - $obj = Sabre_VObject_Property::create($propertyName, $propertyValue); + $obj = Property::create($propertyName, $propertyValue); if ($matches['parameters']) { @@ -137,7 +171,7 @@ class Sabre_VObject_Reader { /** * Reads a parameter list from a property * - * This method returns an array of Sabre_VObject_Parameter + * This method returns an array of Parameter * * @param string $parameters * @return array @@ -171,7 +205,7 @@ class Sabre_VObject_Reader { } }, $value); - $params[] = new Sabre_VObject_Parameter($match['paramName'], $value); + $params[] = new Parameter($match['paramName'], $value); } diff --git a/3rdparty/Sabre/VObject/RecurrenceIterator.php b/3rdparty/Sabre/VObject/RecurrenceIterator.php old mode 100755 new mode 100644 index 740270dd8f..46c7f44780 --- a/3rdparty/Sabre/VObject/RecurrenceIterator.php +++ b/3rdparty/Sabre/VObject/RecurrenceIterator.php @@ -1,5 +1,7 @@ name === 'VCALENDAR') { - throw new InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); + throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); } $components = array($vcal); $uid = (string)$vcal->uid; @@ -325,7 +325,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } } if (!$this->baseEvent) { - throw new InvalidArgumentException('Could not find a base event with uid: ' . $uid); + throw new \InvalidArgumentException('Could not find a base event with uid: ' . $uid); } $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); @@ -336,8 +336,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } else { $this->endDate = clone $this->startDate; if (isset($this->baseEvent->DURATION)) { - $this->endDate->add(Sabre_VObject_DateTimeParser::parse($this->baseEvent->DURATION->value)); - } elseif ($this->baseEvent->DTSTART->getDateType()===Sabre_VObject_Property_DateTime::DATE) { + $this->endDate->add(DateTimeParser::parse($this->baseEvent->DURATION->value)); + } elseif ($this->baseEvent->DTSTART->getDateType()===Property\DateTime::DATE) { $this->endDate->modify('+1 day'); } } @@ -347,7 +347,11 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { $parts = explode(';', $rrule); - foreach($parts as $part) { + // If no rrule was specified, we create a default setting + if (!$rrule) { + $this->frequency = 'daily'; + $this->count = 1; + } else foreach($parts as $part) { list($key, $value) = explode('=', $part, 2); @@ -358,14 +362,14 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { strtolower($value), array('secondly','minutely','hourly','daily','weekly','monthly','yearly') )) { - throw new InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); + throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); } $this->frequency = strtolower($value); break; case 'UNTIL' : - $this->until = Sabre_VObject_DateTimeParser::parse($value); + $this->until = DateTimeParser::parse($value); break; case 'COUNT' : @@ -374,6 +378,9 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { case 'INTERVAL' : $this->interval = (int)$value; + if ($this->interval < 1) { + throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); + } break; case 'BYSECOND' : @@ -427,7 +434,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { foreach(explode(',', (string)$exDate) as $exceptionDate) { $this->exceptionDates[] = - Sabre_VObject_DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); + DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); } @@ -485,7 +492,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { * * This method always returns a cloned instance. * - * @return void + * @return Component\VEvent */ public function getEventObject() { @@ -561,7 +568,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { * @param DateTime $dt * @return void */ - public function fastForward(DateTime $dt) { + public function fastForward(\DateTime $dt) { while($this->valid() && $this->getDTEnd() <= $dt) { $this->next(); @@ -569,6 +576,17 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } + /** + * Returns true if this recurring event never ends. + * + * @return bool + */ + public function isInfinite() { + + return !$this->count && !$this->until; + + } + /** * Goes on to the next iteration * @@ -632,7 +650,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } - // Checking overriden events + // Checking overridden events foreach($this->overriddenEvents as $index=>$event) { if ($index > $previousStamp && $index <= $currentStamp) { @@ -880,7 +898,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { // The first occurrence that's higher than the current // day of the month wins. // If we advanced to the next month or year, the first - // occurence is always correct. + // occurrence is always correct. if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { break 2; } diff --git a/3rdparty/Sabre/VObject/Splitter/ICalendar.php b/3rdparty/Sabre/VObject/Splitter/ICalendar.php new file mode 100644 index 0000000000..7a9a63e1b2 --- /dev/null +++ b/3rdparty/Sabre/VObject/Splitter/ICalendar.php @@ -0,0 +1,111 @@ +children as $component) { + if (!$component instanceof VObject\Component) { + continue; + } + + // Get all timezones + if ($component->name === 'VTIMEZONE') { + $this->vtimezones[(string)$component->TZID] = $component; + continue; + } + + // Get component UID for recurring Events search + if($component->UID) { + $uid = (string)$component->UID; + } else { + // Generating a random UID + $uid = sha1(microtime()) . '-vobjectimport'; + } + + // Take care of recurring events + if (!array_key_exists($uid, $this->objects)) { + $this->objects[$uid] = VObject\Component::create('VCALENDAR'); + } + + $this->objects[$uid]->add(clone $component); + } + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return Sabre\VObject\Component|null + */ + public function getNext() { + + if($object=array_shift($this->objects)) { + + // create our baseobject + $object->version = '2.0'; + $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; + $object->calscale = 'GREGORIAN'; + + // add vtimezone information to obj (if we have it) + foreach ($this->vtimezones as $vtimezone) { + $object->add($vtimezone); + } + + return $object; + + } else { + + return null; + + } + + } + +} diff --git a/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php b/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php new file mode 100644 index 0000000000..9f7a82450e --- /dev/null +++ b/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php @@ -0,0 +1,39 @@ +input = $input; + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return Sabre\VObject\Component|null + */ + public function getNext() { + + $vcard = ''; + + do { + + if (feof($this->input)) { + return false; + } + + $line = fgets($this->input); + $vcard .= $line; + + } while(strtoupper(substr($line,0,4))!=="END:"); + + $object = VObject\Reader::read($vcard); + + if($object->name !== 'VCARD') { + throw new \InvalidArgumentException("Thats no vCard!", 1); + } + + return $object; + + } + +} diff --git a/3rdparty/Sabre/VObject/StringUtil.php b/3rdparty/Sabre/VObject/StringUtil.php new file mode 100644 index 0000000000..886a7135d6 --- /dev/null +++ b/3rdparty/Sabre/VObject/StringUtil.php @@ -0,0 +1,61 @@ +'Australia/Darwin', + 'AUS Eastern Standard Time'=>'Australia/Sydney', + 'Afghanistan Standard Time'=>'Asia/Kabul', + 'Alaskan Standard Time'=>'America/Anchorage', + 'Arab Standard Time'=>'Asia/Riyadh', + 'Arabian Standard Time'=>'Asia/Dubai', + 'Arabic Standard Time'=>'Asia/Baghdad', + 'Argentina Standard Time'=>'America/Buenos_Aires', + 'Armenian Standard Time'=>'Asia/Yerevan', + 'Atlantic Standard Time'=>'America/Halifax', + 'Azerbaijan Standard Time'=>'Asia/Baku', + 'Azores Standard Time'=>'Atlantic/Azores', + 'Bangladesh Standard Time'=>'Asia/Dhaka', + 'Canada Central Standard Time'=>'America/Regina', + 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', + 'Caucasus Standard Time'=>'Asia/Yerevan', + 'Cen. Australia Standard Time'=>'Australia/Adelaide', + 'Central America Standard Time'=>'America/Guatemala', + 'Central Asia Standard Time'=>'Asia/Almaty', + 'Central Brazilian Standard Time'=>'America/Cuiaba', + 'Central Europe Standard Time'=>'Europe/Budapest', + 'Central European Standard Time'=>'Europe/Warsaw', + 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', + 'Central Standard Time'=>'America/Chicago', + 'Central Standard Time (Mexico)'=>'America/Mexico_City', + 'China Standard Time'=>'Asia/Shanghai', + 'Dateline Standard Time'=>'Etc/GMT+12', + 'E. Africa Standard Time'=>'Africa/Nairobi', + 'E. Australia Standard Time'=>'Australia/Brisbane', + 'E. Europe Standard Time'=>'Europe/Minsk', + 'E. South America Standard Time'=>'America/Sao_Paulo', + 'Eastern Standard Time'=>'America/New_York', + 'Egypt Standard Time'=>'Africa/Cairo', + 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', + 'FLE Standard Time'=>'Europe/Kiev', + 'Fiji Standard Time'=>'Pacific/Fiji', + 'GMT Standard Time'=>'Europe/London', + 'GTB Standard Time'=>'Europe/Istanbul', + 'Georgian Standard Time'=>'Asia/Tbilisi', + 'Greenland Standard Time'=>'America/Godthab', + 'Greenwich Standard Time'=>'Atlantic/Reykjavik', + 'Hawaiian Standard Time'=>'Pacific/Honolulu', + 'India Standard Time'=>'Asia/Calcutta', + 'Iran Standard Time'=>'Asia/Tehran', + 'Israel Standard Time'=>'Asia/Jerusalem', + 'Jordan Standard Time'=>'Asia/Amman', + 'Kamchatka Standard Time'=>'Asia/Kamchatka', + 'Korea Standard Time'=>'Asia/Seoul', + 'Magadan Standard Time'=>'Asia/Magadan', + 'Mauritius Standard Time'=>'Indian/Mauritius', + 'Mexico Standard Time'=>'America/Mexico_City', + 'Mexico Standard Time 2'=>'America/Chihuahua', + 'Mid-Atlantic Standard Time'=>'Etc/GMT+2', + 'Middle East Standard Time'=>'Asia/Beirut', + 'Montevideo Standard Time'=>'America/Montevideo', + 'Morocco Standard Time'=>'Africa/Casablanca', + 'Mountain Standard Time'=>'America/Denver', + 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', + 'Myanmar Standard Time'=>'Asia/Rangoon', + 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', + 'Namibia Standard Time'=>'Africa/Windhoek', + 'Nepal Standard Time'=>'Asia/Katmandu', + 'New Zealand Standard Time'=>'Pacific/Auckland', + 'Newfoundland Standard Time'=>'America/St_Johns', + 'North Asia East Standard Time'=>'Asia/Irkutsk', + 'North Asia Standard Time'=>'Asia/Krasnoyarsk', + 'Pacific SA Standard Time'=>'America/Santiago', + 'Pacific Standard Time'=>'America/Los_Angeles', + 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', + 'Pakistan Standard Time'=>'Asia/Karachi', + 'Paraguay Standard Time'=>'America/Asuncion', + 'Romance Standard Time'=>'Europe/Paris', + 'Russian Standard Time'=>'Europe/Moscow', + 'SA Eastern Standard Time'=>'America/Cayenne', + 'SA Pacific Standard Time'=>'America/Bogota', + 'SA Western Standard Time'=>'America/La_Paz', + 'SE Asia Standard Time'=>'Asia/Bangkok', + 'Samoa Standard Time'=>'Pacific/Apia', + 'Singapore Standard Time'=>'Asia/Singapore', + 'South Africa Standard Time'=>'Africa/Johannesburg', + 'Sri Lanka Standard Time'=>'Asia/Colombo', + 'Syria Standard Time'=>'Asia/Damascus', + 'Taipei Standard Time'=>'Asia/Taipei', + 'Tasmania Standard Time'=>'Australia/Hobart', + 'Tokyo Standard Time'=>'Asia/Tokyo', + 'Tonga Standard Time'=>'Pacific/Tongatapu', + 'US Eastern Standard Time'=>'America/Indianapolis', + 'US Mountain Standard Time'=>'America/Phoenix', + 'UTC'=>'Etc/GMT', + 'UTC+12'=>'Etc/GMT-12', + 'UTC-02'=>'Etc/GMT+2', + 'UTC-11'=>'Etc/GMT+11', + 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', + 'Venezuela Standard Time'=>'America/Caracas', + 'Vladivostok Standard Time'=>'Asia/Vladivostok', + 'W. Australia Standard Time'=>'Australia/Perth', + 'W. Central Africa Standard Time'=>'Africa/Lagos', + 'W. Europe Standard Time'=>'Europe/Berlin', + 'West Asia Standard Time'=>'Asia/Tashkent', + 'West Pacific Standard Time'=>'Pacific/Port_Moresby', + 'Yakutsk Standard Time'=>'Asia/Yakutsk', + + // Microsoft exchange timezones + // Source: + // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx + // + // Correct timezones deduced with help from: + // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones + 'Universal Coordinated Time' => 'UTC', + 'Casablanca, Monrovia' => 'Africa/Casablanca', + 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', + 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', + 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', + 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', + 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', + 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', + 'Prague, Central Europe' => 'Europe/Prague', + 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', + 'West Central Africa' => 'Africa/Luanda', // This was a best guess + 'Athens, Istanbul, Minsk' => 'Europe/Athens', + 'Bucharest' => 'Europe/Bucharest', + 'Cairo' => 'Africa/Cairo', + 'Harare, Pretoria' => 'Africa/Harare', + 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', + 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', + 'Baghdad' => 'Asia/Baghdad', + 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', + 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', + 'East Africa, Nairobi' => 'Africa/Nairobi', + 'Tehran' => 'Asia/Tehran', + 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess + 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', + 'Kabul' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', + 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', + 'Kathmandu, Nepal' => 'Asia/Kathmandu', + 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', + 'Astana, Dhaka' => 'Asia/Dhaka', + 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', + 'Rangoon' => 'Asia/Rangoon', + 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', + 'Krasnoyarsk' => 'Asia/Krasnoyarsk', + 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', + 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', + 'Kuala Lumpur, Singapore' => 'Asia/Singapore', + 'Perth, Western Australia' => 'Australia/Perth', + 'Taipei' => 'Asia/Taipei', + 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', + 'Seoul, Korea Standard time' => 'Asia/Seoul', + 'Yakutsk' => 'Asia/Yakutsk', + 'Adelaide, Central Australia' => 'Australia/Adelaide', + 'Darwin' => 'Australia/Darwin', + 'Brisbane, East Australia' => 'Australia/Brisbane', + 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', + 'Guam, Port Moresby' => 'Pacific/Guam', + 'Hobart, Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', + 'Auckland, Wellington' => 'Pacific/Auckland', + 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', + 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde Is.' => 'Atlantic/Cape_Verde', + 'Mid-Atlantic' => 'America/Noronha', + 'Brasilia' => 'America/Sao_Paulo', // Best guess + 'Buenos Aires' => 'America/Argentina/Buenos_Aires', + 'Greenland' => 'America/Godthab', + 'Newfoundland' => 'America/St_Johns', + 'Atlantic Time (Canada)' => 'America/Halifax', + 'Caracas, La Paz' => 'America/Caracas', + 'Santiago' => 'America/Santiago', + 'Bogota, Lima, Quito' => 'America/Bogota', + 'Eastern Time (US & Canada)' => 'America/New_York', + 'Indiana (East)' => 'America/Indiana/Indianapolis', + 'Central America' => 'America/Guatemala', + 'Central Time (US & Canada)' => 'America/Chicago', + 'Mexico City, Tegucigalpa' => 'America/Mexico_City', + 'Saskatchewan' => 'America/Edmonton', + 'Arizona' => 'America/Phoenix', + 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess + 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess + 'Alaska' => 'America/Anchorage', + 'Hawaii' => 'Pacific/Honolulu', + 'Midway Island, Samoa' => 'Pacific/Midway', + 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', + + ); + + public static $microsoftExchangeMap = array( + 0 => 'UTC', + 31 => 'Africa/Casablanca', + 2 => 'Europe/Lisbon', + 1 => 'Europe/London', + 4 => 'Europe/Berlin', + 6 => 'Europe/Prague', + 3 => 'Europe/Paris', + 69 => 'Africa/Luanda', // This was a best guess + 7 => 'Europe/Athens', + 5 => 'Europe/Bucharest', + 49 => 'Africa/Cairo', + 50 => 'Africa/Harare', + 59 => 'Europe/Helsinki', + 27 => 'Asia/Jerusalem', + 26 => 'Asia/Baghdad', + 74 => 'Asia/Kuwait', + 51 => 'Europe/Moscow', + 56 => 'Africa/Nairobi', + 25 => 'Asia/Tehran', + 24 => 'Asia/Muscat', // Best guess + 54 => 'Asia/Baku', + 48 => 'Asia/Kabul', + 58 => 'Asia/Yekaterinburg', + 47 => 'Asia/Karachi', + 23 => 'Asia/Calcutta', + 62 => 'Asia/Kathmandu', + 46 => 'Asia/Almaty', + 71 => 'Asia/Dhaka', + 66 => 'Asia/Colombo', + 61 => 'Asia/Rangoon', + 22 => 'Asia/Bangkok', + 64 => 'Asia/Krasnoyarsk', + 45 => 'Asia/Shanghai', + 63 => 'Asia/Irkutsk', + 21 => 'Asia/Singapore', + 73 => 'Australia/Perth', + 75 => 'Asia/Taipei', + 20 => 'Asia/Tokyo', + 72 => 'Asia/Seoul', + 70 => 'Asia/Yakutsk', + 19 => 'Australia/Adelaide', + 44 => 'Australia/Darwin', + 18 => 'Australia/Brisbane', + 76 => 'Australia/Sydney', + 43 => 'Pacific/Guam', + 42 => 'Australia/Hobart', + 68 => 'Asia/Vladivostok', + 41 => 'Asia/Magadan', + 17 => 'Pacific/Auckland', + 40 => 'Pacific/Fiji', + 67 => 'Pacific/Tongatapu', + 29 => 'Atlantic/Azores', + 53 => 'Atlantic/Cape_Verde', + 30 => 'America/Noronha', + 8 => 'America/Sao_Paulo', // Best guess + 32 => 'America/Argentina/Buenos_Aires', + 60 => 'America/Godthab', + 28 => 'America/St_Johns', + 9 => 'America/Halifax', + 33 => 'America/Caracas', + 65 => 'America/Santiago', + 35 => 'America/Bogota', + 10 => 'America/New_York', + 34 => 'America/Indiana/Indianapolis', + 55 => 'America/Guatemala', + 11 => 'America/Chicago', + 37 => 'America/Mexico_City', + 36 => 'America/Edmonton', + 38 => 'America/Phoenix', + 12 => 'America/Denver', // Best guess + 13 => 'America/Los_Angeles', // Best guess + 14 => 'America/Anchorage', + 15 => 'Pacific/Honolulu', + 16 => 'Pacific/Midway', + 39 => 'Pacific/Kwajalein', + ); + + /** + * This method will try to find out the correct timezone for an iCalendar + * date-time value. + * + * You must pass the contents of the TZID parameter, as well as the full + * calendar. + * + * If the lookup fails, this method will return UTC. + * + * @param string $tzid + * @param Sabre\VObject\Component $vcalendar + * @return DateTimeZone + */ + static public function getTimeZone($tzid, Component $vcalendar = null) { + + // First we will just see if the tzid is a support timezone identifier. + try { + return new \DateTimeZone($tzid); + } catch (\Exception $e) { + } + + // Next, we check if the tzid is somewhere in our tzid map. + if (isset(self::$map[$tzid])) { + return new \DateTimeZone(self::$map[$tzid]); + } + + if ($vcalendar) { + + // If that didn't work, we will scan VTIMEZONE objects + foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { + + if ((string)$vtimezone->TZID === $tzid) { + + // Some clients add 'X-LIC-LOCATION' with the olson name. + if (isset($vtimezone->{'X-LIC-LOCATION'})) { + try { + return new \DateTimeZone($vtimezone->{'X-LIC-LOCATION'}); + } catch (\Exception $e) { + } + + } + // Microsoft may add a magic number, which we also have an + // answer for. + if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { + if (isset(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value])) { + return new \DateTimeZone(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value]); + } + } + } + + } + + } + + // If we got all the way here, we default to UTC. + return new \DateTimeZone(date_default_timezone_get()); + + + } + + +} diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php old mode 100755 new mode 100644 index 9ee03d8711..0065b7abc9 --- a/3rdparty/Sabre/VObject/Version.php +++ b/3rdparty/Sabre/VObject/Version.php @@ -1,20 +1,20 @@ 'Australia/Darwin', - 'AUS Eastern Standard Time'=>'Australia/Sydney', - 'Afghanistan Standard Time'=>'Asia/Kabul', - 'Alaskan Standard Time'=>'America/Anchorage', - 'Arab Standard Time'=>'Asia/Riyadh', - 'Arabian Standard Time'=>'Asia/Dubai', - 'Arabic Standard Time'=>'Asia/Baghdad', - 'Argentina Standard Time'=>'America/Buenos_Aires', - 'Armenian Standard Time'=>'Asia/Yerevan', - 'Atlantic Standard Time'=>'America/Halifax', - 'Azerbaijan Standard Time'=>'Asia/Baku', - 'Azores Standard Time'=>'Atlantic/Azores', - 'Bangladesh Standard Time'=>'Asia/Dhaka', - 'Canada Central Standard Time'=>'America/Regina', - 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', - 'Caucasus Standard Time'=>'Asia/Yerevan', - 'Cen. Australia Standard Time'=>'Australia/Adelaide', - 'Central America Standard Time'=>'America/Guatemala', - 'Central Asia Standard Time'=>'Asia/Almaty', - 'Central Brazilian Standard Time'=>'America/Cuiaba', - 'Central Europe Standard Time'=>'Europe/Budapest', - 'Central European Standard Time'=>'Europe/Warsaw', - 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', - 'Central Standard Time'=>'America/Chicago', - 'Central Standard Time (Mexico)'=>'America/Mexico_City', - 'China Standard Time'=>'Asia/Shanghai', - 'Dateline Standard Time'=>'Etc/GMT+12', - 'E. Africa Standard Time'=>'Africa/Nairobi', - 'E. Australia Standard Time'=>'Australia/Brisbane', - 'E. Europe Standard Time'=>'Europe/Minsk', - 'E. South America Standard Time'=>'America/Sao_Paulo', - 'Eastern Standard Time'=>'America/New_York', - 'Egypt Standard Time'=>'Africa/Cairo', - 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', - 'FLE Standard Time'=>'Europe/Kiev', - 'Fiji Standard Time'=>'Pacific/Fiji', - 'GMT Standard Time'=>'Europe/London', - 'GTB Standard Time'=>'Europe/Istanbul', - 'Georgian Standard Time'=>'Asia/Tbilisi', - 'Greenland Standard Time'=>'America/Godthab', - 'Greenwich Standard Time'=>'Atlantic/Reykjavik', - 'Hawaiian Standard Time'=>'Pacific/Honolulu', - 'India Standard Time'=>'Asia/Calcutta', - 'Iran Standard Time'=>'Asia/Tehran', - 'Israel Standard Time'=>'Asia/Jerusalem', - 'Jordan Standard Time'=>'Asia/Amman', - 'Kamchatka Standard Time'=>'Asia/Kamchatka', - 'Korea Standard Time'=>'Asia/Seoul', - 'Magadan Standard Time'=>'Asia/Magadan', - 'Mauritius Standard Time'=>'Indian/Mauritius', - 'Mexico Standard Time'=>'America/Mexico_City', - 'Mexico Standard Time 2'=>'America/Chihuahua', - 'Mid-Atlantic Standard Time'=>'Etc/GMT+2', - 'Middle East Standard Time'=>'Asia/Beirut', - 'Montevideo Standard Time'=>'America/Montevideo', - 'Morocco Standard Time'=>'Africa/Casablanca', - 'Mountain Standard Time'=>'America/Denver', - 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', - 'Myanmar Standard Time'=>'Asia/Rangoon', - 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', - 'Namibia Standard Time'=>'Africa/Windhoek', - 'Nepal Standard Time'=>'Asia/Katmandu', - 'New Zealand Standard Time'=>'Pacific/Auckland', - 'Newfoundland Standard Time'=>'America/St_Johns', - 'North Asia East Standard Time'=>'Asia/Irkutsk', - 'North Asia Standard Time'=>'Asia/Krasnoyarsk', - 'Pacific SA Standard Time'=>'America/Santiago', - 'Pacific Standard Time'=>'America/Los_Angeles', - 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', - 'Pakistan Standard Time'=>'Asia/Karachi', - 'Paraguay Standard Time'=>'America/Asuncion', - 'Romance Standard Time'=>'Europe/Paris', - 'Russian Standard Time'=>'Europe/Moscow', - 'SA Eastern Standard Time'=>'America/Cayenne', - 'SA Pacific Standard Time'=>'America/Bogota', - 'SA Western Standard Time'=>'America/La_Paz', - 'SE Asia Standard Time'=>'Asia/Bangkok', - 'Samoa Standard Time'=>'Pacific/Apia', - 'Singapore Standard Time'=>'Asia/Singapore', - 'South Africa Standard Time'=>'Africa/Johannesburg', - 'Sri Lanka Standard Time'=>'Asia/Colombo', - 'Syria Standard Time'=>'Asia/Damascus', - 'Taipei Standard Time'=>'Asia/Taipei', - 'Tasmania Standard Time'=>'Australia/Hobart', - 'Tokyo Standard Time'=>'Asia/Tokyo', - 'Tonga Standard Time'=>'Pacific/Tongatapu', - 'US Eastern Standard Time'=>'America/Indianapolis', - 'US Mountain Standard Time'=>'America/Phoenix', - 'UTC'=>'Etc/GMT', - 'UTC+12'=>'Etc/GMT-12', - 'UTC-02'=>'Etc/GMT+2', - 'UTC-11'=>'Etc/GMT+11', - 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', - 'Venezuela Standard Time'=>'America/Caracas', - 'Vladivostok Standard Time'=>'Asia/Vladivostok', - 'W. Australia Standard Time'=>'Australia/Perth', - 'W. Central Africa Standard Time'=>'Africa/Lagos', - 'W. Europe Standard Time'=>'Europe/Berlin', - 'West Asia Standard Time'=>'Asia/Tashkent', - 'West Pacific Standard Time'=>'Pacific/Port_Moresby', - 'Yakutsk Standard Time'=>'Asia/Yakutsk', - ); - - static public function lookup($tzid) { - return isset(self::$map[$tzid]) ? self::$map[$tzid] : null; - } -} diff --git a/3rdparty/Sabre/VObject/includes.php b/3rdparty/Sabre/VObject/includes.php old mode 100755 new mode 100644 index 0177a8f1ba..b74bd3b6cb --- a/3rdparty/Sabre/VObject/includes.php +++ b/3rdparty/Sabre/VObject/includes.php @@ -1,15 +1,11 @@ +
    + + +
    +
    + t('New');?> + +
    +
    +
    + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    + + + + +
    +
    + + +
    t('Nothing in here. Upload something!')?>
    + + + + + + + + + + + + + +
    + + t( 'Name' ); ?> + + + + Download" /> t('Download')?> + + + t( 'Size' ); ?> + t( 'Modified' ); ?> + + + + t('Unshare')?> <?php echo $l->t('Unshare')?>" /> + + t('Delete')?> <?php echo $l->t('Delete')?>" /> + + +
    +
    +
    +

    + t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?> +

    +
    +
    +

    + t('Files are being scanned, please wait.');?> +

    +

    + t('Current scanning');?> +

    +
    + + + diff --git a/apps/files/templates/index.php_test b/apps/files/templates/index.php_test new file mode 100644 index 0000000000..a509333aa4 --- /dev/null +++ b/apps/files/templates/index.php_test @@ -0,0 +1,90 @@ + +
    + + +
    +
    + t('New');?> + +
    +
    +
    + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    + + + + +
    +
    + + +
    t('Nothing in here. Upload something!')?>
    + + + + + + + + + + + + + +
    + + t( 'Name' ); ?> + + + + Download" /> t('Download')?> + + + t( 'Size' ); ?> + t( 'Modified' ); ?> + + + + t('Unshare')?> <?php echo $l->t('Unshare')?>" /> + + t('Delete')?> <?php echo $l->t('Delete')?>" /> + + +
    +
    +
    +

    + t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?> +

    +
    +
    +

    + t('Files are being scanned, please wait.');?> +

    +

    + t('Current scanning');?> +

    +
    + + + diff --git a/lib/base.php b/lib/base.php index a1ad4f6dc0..bd8829e1ab 100644 --- a/lib/base.php +++ b/lib/base.php @@ -93,6 +93,11 @@ class OC{ elseif(strpos($className, 'Sabre_')===0) { $path = str_replace('_', '/', $className) . '.php'; } + + elseif(strpos($className, 'Sabre\\VObject')===0) { + $path = '3rdparty/'.str_replace('\\', '/', $className) . '.php'; + } + elseif(strpos($className, 'Test_')===0) { $path = 'tests/lib/'.strtolower(str_replace('_', '/', substr($className, 5)) . '.php'); }else{ diff --git a/lib/vobject.php b/lib/vobject.php index b5a04b4bf6..5070c3f1ee 100644 --- a/lib/vobject.php +++ b/lib/vobject.php @@ -24,11 +24,11 @@ * This class provides a streamlined interface to the Sabre VObject classes */ class OC_VObject{ - /** @var Sabre_VObject_Component */ + /** @var Sabre\VObject\Component */ protected $vobject; /** - * @returns Sabre_VObject_Component + * @returns Sabre\VObject\Component */ public function getVObject() { return $this->vobject; @@ -41,9 +41,9 @@ class OC_VObject{ */ public static function parse($data) { try { - Sabre_VObject_Property::$classMap['LAST-MODIFIED'] = 'Sabre_VObject_Property_DateTime'; - $vobject = Sabre_VObject_Reader::read($data); - if ($vobject instanceof Sabre_VObject_Component) { + Sabre\VObject\Property::$classMap['LAST-MODIFIED'] = 'Sabre\VObject\Property\DateTime'; + $vobject = Sabre\VObject\Reader::read($data); + if ($vobject instanceof Sabre\VObject\Component) { $vobject = new OC_VObject($vobject); } return $vobject; @@ -89,13 +89,13 @@ class OC_VObject{ /** * Constuctor - * @param Sabre_VObject_Component or string + * @param Sabre\VObject\Component or string */ public function __construct($vobject_or_name) { if (is_object($vobject_or_name)) { $this->vobject = $vobject_or_name; } else { - $this->vobject = new Sabre_VObject_Component($vobject_or_name); + $this->vobject = new Sabre\VObject\Component($vobject_or_name); } } @@ -117,9 +117,9 @@ class OC_VObject{ if(is_array($value)) { $value = OC_VObject::escapeSemicolons($value); } - $property = new Sabre_VObject_Property( $name, $value ); + $property = new Sabre\VObject\Property( $name, $value ); foreach($parameters as $name => $value) { - $property->parameters[] = new Sabre_VObject_Parameter($name, $value); + $property->parameters[] = new Sabre\VObject\Parameter($name, $value); } $this->vobject->add($property); @@ -150,12 +150,12 @@ class OC_VObject{ * @param int $dateType * @return void */ - public function setDateTime($name, $datetime, $dateType=Sabre_VObject_Property_DateTime::LOCALTZ) { + public function setDateTime($name, $datetime, $dateType=Sabre\VObject\Property\DateTime::LOCALTZ) { if ($datetime == 'now') { $datetime = new DateTime(); } if ($datetime instanceof DateTime) { - $datetime_element = new Sabre_VObject_Property_DateTime($name); + $datetime_element = new Sabre\VObject\Property\DateTime($name); $datetime_element->setDateTime($datetime, $dateType); $this->vobject->__set($name, $datetime_element); }else{ @@ -183,7 +183,7 @@ class OC_VObject{ return $this->vobject->children; } $return = $this->vobject->__get($name); - if ($return instanceof Sabre_VObject_Component) { + if ($return instanceof Sabre\VObject\Component) { $return = new OC_VObject($return); } return $return; From 0a614429af21193f1da47c94d1382953b8d6ba8c Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 17 Oct 2012 17:24:49 +0200 Subject: [PATCH 031/481] Change the lostpassword flow to a controller --- core/lostpassword/controller.php | 82 +++++++++++++++++++ core/lostpassword/index.php | 35 -------- core/lostpassword/resetpassword.php | 27 ------ core/lostpassword/templates/lostpassword.php | 6 +- core/lostpassword/templates/resetpassword.php | 4 +- core/routes.php | 14 ++++ 6 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 core/lostpassword/controller.php delete mode 100644 core/lostpassword/index.php delete mode 100644 core/lostpassword/resetpassword.php diff --git a/core/lostpassword/controller.php b/core/lostpassword/controller.php new file mode 100644 index 0000000000..6037fefa4b --- /dev/null +++ b/core/lostpassword/controller.php @@ -0,0 +1,82 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Core_LostPassword_Controller { + protected static function displayLostPasswordPage($error, $requested) { + OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => $error, 'requested' => $requested)); + } + + protected static function displayResetPasswordPage($success, $args) { + $route_args = array(); + $route_args['token'] = $args['token']; + $route_args['user'] = $args['user']; + OC_Template::printGuestPage('core/lostpassword', 'resetpassword', array('success' => $success, 'args' => $route_args)); + } + + protected static function checkToken($user, $token) { + return OC_Preferences::getValue($user, 'owncloud', 'lostpassword') === hash('sha256', $token); + } + + public static function index($args) { + self::displayLostPasswordPage(false, false); + } + + public static function sendEmail($args) { + if (OC_User::userExists($_POST['user'])) { + $token = hash('sha256', OC_Util::generate_random_bytes(30).OC_Config::getValue('passwordsalt', '')); + OC_Preferences::setValue($_POST['user'], 'owncloud', 'lostpassword', hash('sha256', $token)); // Hash the token again to prevent timing attacks + $email = OC_Preferences::getValue($_POST['user'], 'settings', 'email', ''); + if (!empty($email)) { + $link = OC_Helper::linkToRoute('core_lostpassword_reset', array('user' => $_POST['user'], 'token' => $token)); + $link = OC_Helper::makeURLAbsolute($link); + + $tmpl = new OC_Template('core/lostpassword', 'email'); + $tmpl->assign('link', $link, false); + $msg = $tmpl->fetchPage(); + $l = OC_L10N::get('core'); + $from = 'lostpassword-noreply@' . OCP\Util::getServerHost(); + OC_Mail::send($email, $_POST['user'], $l->t('ownCloud password reset'), $msg, $from, 'ownCloud'); + echo('Mailsent'); + + self::displayLostPasswordPage(false, true); + } else { + self::displayLostPasswordPage(true, false); + } + } else { + self::displayLostPasswordPage(true, false); + } + } + + public static function reset($args) { + // Someone wants to reset their password: + if(self::checkToken($args['user'], $args['token'])) { + self::displayResetPasswordPage(false, $args); + } else { + // Someone lost their password + self::displayLostPasswordPage(false, false); + } + } + + public static function resetPassword($args) { + if (self::checkToken($args['user'], $args['token'])) { + if (isset($_POST['password'])) { + if (OC_User::setPassword($args['user'], $_POST['password'])) { + OC_Preferences::deleteKey($args['user'], 'owncloud', 'lostpassword'); + self::displayResetPasswordPage(true, $args); + } else { + self::displayResetPasswordPage(false, $args); + } + } else { + self::reset($args); + } + } else { + // Someone lost their password + self::displayLostPasswordPage(false, false); + } + } +} diff --git a/core/lostpassword/index.php b/core/lostpassword/index.php deleted file mode 100644 index 906208dcbc..0000000000 --- a/core/lostpassword/index.php +++ /dev/null @@ -1,35 +0,0 @@ - $_POST['user'], 'token' => $token)); - $tmpl = new OC_Template('core/lostpassword', 'email'); - $tmpl->assign('link', $link, false); - $msg = $tmpl->fetchPage(); - $l = OC_L10N::get('core'); - $from = 'lostpassword-noreply@' . OCP\Util::getServerHost(); - OC_MAIL::send($email, $_POST['user'], $l->t('ownCloud password reset'), $msg, $from, 'ownCloud'); - echo('sent'); - } - OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => false, 'requested' => true)); - } else { - OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => true, 'requested' => false)); - } -} else { - OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => false, 'requested' => false)); -} diff --git a/core/lostpassword/resetpassword.php b/core/lostpassword/resetpassword.php deleted file mode 100644 index 896c8da76e..0000000000 --- a/core/lostpassword/resetpassword.php +++ /dev/null @@ -1,27 +0,0 @@ - true)); - } else { - OC_Template::printGuestPage('core/lostpassword', 'resetpassword', array('success' => false)); - } - } else { - OC_Template::printGuestPage('core/lostpassword', 'resetpassword', array('success' => false)); - } -} else { - // Someone lost their password - OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => false, 'requested' => false)); -} diff --git a/core/lostpassword/templates/lostpassword.php b/core/lostpassword/templates/lostpassword.php index 4b871963b8..55c070f3e0 100644 --- a/core/lostpassword/templates/lostpassword.php +++ b/core/lostpassword/templates/lostpassword.php @@ -1,11 +1,11 @@ -
    +
    t('You will receive a link to reset your password via Email.'); ?> - t('Requested'); ?> + t('Reset email send.'); ?> - t('Login failed!'); ?> + t('Request failed!'); ?>

    diff --git a/core/lostpassword/templates/resetpassword.php b/core/lostpassword/templates/resetpassword.php index 56257de7f1..0ab32acca6 100644 --- a/core/lostpassword/templates/resetpassword.php +++ b/core/lostpassword/templates/resetpassword.php @@ -1,8 +1,8 @@ - +

    t('Your password was reset'); ?>

    -

    t('To login page'); ?>

    +

    t('To login page'); ?>

    diff --git a/core/routes.php b/core/routes.php index 8d83681626..7cf2749884 100644 --- a/core/routes.php +++ b/core/routes.php @@ -32,6 +32,20 @@ $this->create('core_ajax_vcategories_edit', '/core/ajax/vcategories/edit.php') $this->create('core_ajax_routes', '/core/routes.json') ->action('OC_Router', 'JSRoutes'); +OC::$CLASSPATH['OC_Core_LostPassword_Controller'] = 'core/lostpassword/controller.php'; +$this->create('core_lostpassword_index', '/lostpassword/') + ->get() + ->action('OC_Core_LostPassword_Controller', 'index'); +$this->create('core_lostpassword_send_email', '/lostpassword/') + ->post() + ->action('OC_Core_LostPassword_Controller', 'sendEmail'); +$this->create('core_lostpassword_reset', '/lostpassword/reset/{token}/{user}') + ->get() + ->action('OC_Core_LostPassword_Controller', 'reset'); +$this->create('core_lostpassword_reset_password', '/lostpassword/reset/{token}/{user}') + ->post() + ->action('OC_Core_LostPassword_Controller', 'resetPassword'); + // Not specifically routed $this->create('app_css', '/apps/{app}/{file}') ->requirements(array('file' => '.*.css')) From a8d0f8482926e7780edc6ffa60f772da1f20e40a Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 17 Oct 2012 17:26:12 +0200 Subject: [PATCH 032/481] Resetting the password should also invalidate the token login cookies --- core/lostpassword/controller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/core/lostpassword/controller.php b/core/lostpassword/controller.php index 6037fefa4b..e616fe7dff 100644 --- a/core/lostpassword/controller.php +++ b/core/lostpassword/controller.php @@ -67,6 +67,7 @@ class OC_Core_LostPassword_Controller { if (isset($_POST['password'])) { if (OC_User::setPassword($args['user'], $_POST['password'])) { OC_Preferences::deleteKey($args['user'], 'owncloud', 'lostpassword'); + OC_User::unsetMagicInCookie(); self::displayResetPasswordPage(true, $args); } else { self::displayResetPasswordPage(false, $args); From f4fd4a5a529aac331c7453bc1d3372da5c71f05c Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:06:18 +0200 Subject: [PATCH 033/481] Updated category ajax files to use type instead of app and add callCheck. --- core/ajax/vcategories/add.php | 21 ++++++++++++--------- core/ajax/vcategories/delete.php | 24 ++++++++++++++---------- core/ajax/vcategories/edit.php | 15 +++++++++------ 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/ajax/vcategories/add.php b/core/ajax/vcategories/add.php index 81fa06dbf1..e97612c28f 100644 --- a/core/ajax/vcategories/add.php +++ b/core/ajax/vcategories/add.php @@ -15,23 +15,26 @@ function debug($msg) { } require_once '../../../lib/base.php'; -OC_JSON::checkLoggedIn(); -$category = isset($_GET['category'])?strip_tags($_GET['category']):null; -$app = isset($_GET['app'])?$_GET['app']:null; -if(is_null($app)) { - bailOut(OC_Contacts_App::$l10n->t('Application name not provided.')); +OCP\JSON::checkLoggedIn(); +OCP\JSON::callCheck(); + +$l = OC_L10N::get('core'); + +$category = isset($_POST['category']) ? strip_tags($_POST['category']) : null; +$type = isset($_POST['type']) ? $_POST['type'] : null; + +if(is_null($type)) { + bailOut($l->t('Category type not provided.')); } -OC_JSON::checkAppEnabled($app); - if(is_null($category)) { - bailOut(OC_Contacts_App::$l10n->t('No category to add?')); + bailOut($l->t('No category to add?')); } debug(print_r($category, true)); -$categories = new OC_VCategories($app); +$categories = new OC_VCategories($type); if($categories->hasCategory($category)) { bailOut(OC_Contacts_App::$l10n->t('This category already exists: '.$category)); } else { diff --git a/core/ajax/vcategories/delete.php b/core/ajax/vcategories/delete.php index cd46a25b79..fd7b71be5d 100644 --- a/core/ajax/vcategories/delete.php +++ b/core/ajax/vcategories/delete.php @@ -16,21 +16,25 @@ function debug($msg) { } require_once '../../../lib/base.php'; -OC_JSON::checkLoggedIn(); -$app = isset($_POST['app'])?$_POST['app']:null; -$categories = isset($_POST['categories'])?$_POST['categories']:null; -if(is_null($app)) { - bailOut(OC_Contacts_App::$l10n->t('Application name not provided.')); + +OCP\JSON::checkLoggedIn(); +OCP\JSON::callCheck(); + +$l = OC_L10N::get('core'); + +$type = isset($_POST['type']) ? $_POST['type'] : null; +$categories = isset($_POST['categories']) ? $_POST['categories'] : null; + +if(is_null($type)) { + bailOut($l->t('Object type not provided.')); } -OC_JSON::checkAppEnabled($app); - -debug('The application "'.$app.'" uses the default file. OC_VObjects will not be updated.'); +debug('The application using category type "' . $type . '" uses the default file for deletion. OC_VObjects will not be updated.'); if(is_null($categories)) { - bailOut('No categories selected for deletion.'); + bailOut($l->t('No categories selected for deletion.')); } -$vcategories = new OC_VCategories($app); +$vcategories = new OC_VCategories($type); $vcategories->delete($categories); OC_JSON::success(array('data' => array('categories'=>$vcategories->categories()))); diff --git a/core/ajax/vcategories/edit.php b/core/ajax/vcategories/edit.php index a0e67841c5..4e9c9c17b5 100644 --- a/core/ajax/vcategories/edit.php +++ b/core/ajax/vcategories/edit.php @@ -17,16 +17,19 @@ function debug($msg) { require_once '../../../lib/base.php'; OC_JSON::checkLoggedIn(); -$app = isset($_GET['app'])?$_GET['app']:null; -if(is_null($app)) { - bailOut('Application name not provided.'); +$l = OC_L10N::get('core'); + +$type = isset($_GET['type']) ? $_GET['type'] : null; + +if(is_null($type)) { + bailOut($l->t('Category type not provided.')); } -OC_JSON::checkAppEnabled($app); -$tmpl = new OC_TEMPLATE("core", "edit_categories_dialog"); +OC_JSON::checkAppEnabled($type); +$tmpl = new OCP\Template("core", "edit_categories_dialog"); -$vcategories = new OC_VCategories($app); +$vcategories = new OC_VCategories($type); $categories = $vcategories->categories(); debug(print_r($categories, true)); $tmpl->assign('categories', $categories); From 26719005a466a0730bd24110115192188c5e60dd Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:07:41 +0200 Subject: [PATCH 034/481] Added ajax files for favorite category handling. --- core/ajax/vcategories/addToFavorites.php | 40 +++++++++++++++++++ core/ajax/vcategories/favorites.php | 33 +++++++++++++++ core/ajax/vcategories/removeFromFavorites.php | 40 +++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 core/ajax/vcategories/addToFavorites.php create mode 100644 core/ajax/vcategories/favorites.php create mode 100644 core/ajax/vcategories/removeFromFavorites.php diff --git a/core/ajax/vcategories/addToFavorites.php b/core/ajax/vcategories/addToFavorites.php new file mode 100644 index 0000000000..f330d19c8a --- /dev/null +++ b/core/ajax/vcategories/addToFavorites.php @@ -0,0 +1,40 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +function bailOut($msg) { + OC_JSON::error(array('data' => array('message' => $msg))); + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); + exit(); +} +function debug($msg) { + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); +} + +require_once '../../../lib/base.php'; + +OCP\JSON::checkLoggedIn(); +OCP\JSON::callCheck(); + +$l = OC_L10N::get('core'); + +$id = isset($_POST['id']) ? strip_tags($_POST['id']) : null; +$type = isset($_POST['type']) ? $_POST['type'] : null; + +if(is_null($type)) { + bailOut($l->t('Object type not provided.')); +} + +if(is_null($id)) { + bailOut($l->t('%s ID not provided.', $type)); +} + +$categories = new OC_VCategories($type); +if(!$categories->addToFavorites($id, $type)) { + bailOut($l->t('Error adding %s to favorites.', $id)); +} + +OC_JSON::success(); diff --git a/core/ajax/vcategories/favorites.php b/core/ajax/vcategories/favorites.php new file mode 100644 index 0000000000..35b23e29c1 --- /dev/null +++ b/core/ajax/vcategories/favorites.php @@ -0,0 +1,33 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +function bailOut($msg) { + OC_JSON::error(array('data' => array('message' => $msg))); + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); + exit(); +} +function debug($msg) { + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); +} + +require_once '../../../lib/base.php'; + +OCP\JSON::checkLoggedIn(); +OCP\JSON::callCheck(); + + +$type = isset($_POST['type']) ? $_POST['type'] : null; + +if(is_null($type)) { + $l = OC_L10N::get('core'); + bailOut($l->t('Object type not provided.')); +} + +$categories = new OC_VCategories($type); +$ids = $categories->getFavorites($type)) { + +OC_JSON::success(array('ids' => $ids)); diff --git a/core/ajax/vcategories/removeFromFavorites.php b/core/ajax/vcategories/removeFromFavorites.php new file mode 100644 index 0000000000..f779df48f2 --- /dev/null +++ b/core/ajax/vcategories/removeFromFavorites.php @@ -0,0 +1,40 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +function bailOut($msg) { + OC_JSON::error(array('data' => array('message' => $msg))); + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); + exit(); +} +function debug($msg) { + OC_Log::write('core', 'ajax/vcategories/addToFavorites.php: '.$msg, OC_Log::DEBUG); +} + +require_once '../../../lib/base.php'; + +OCP\JSON::checkLoggedIn(); +OCP\JSON::callCheck(); + +$l = OC_L10N::get('core'); + +$id = isset($_POST['id']) ? strip_tags($_POST['id']) : null; +$type = isset($_POST['type']) ? $_POST['type'] : null; + +if(is_null($type)) { + bailOut($l->t('Object type not provided.')); +} + +if(is_null($id)) { + bailOut($l->t('%s ID not provided.', $type)); +} + +$categories = new OC_VCategories($type); +if(!$categories->removeFromFavorites($id, $type)) { + bailOut($l->t('Error removing %s from favorites.', $id)); +} + +OC_JSON::success(); From 97c884c54804832a24e153273c5c619b76d3ebe9 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:09:07 +0200 Subject: [PATCH 035/481] Updated category js for handling favorites and use post instead of get. --- core/js/oc-vcategories.js | 61 +++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/core/js/oc-vcategories.js b/core/js/oc-vcategories.js index c99dd51f53..f3935911b8 100644 --- a/core/js/oc-vcategories.js +++ b/core/js/oc-vcategories.js @@ -1,14 +1,15 @@ -var OCCategories={ - edit:function(){ +var OCCategories= { + edit:function() { if(OCCategories.app == undefined) { OC.dialogs.alert('OCCategories.app is not set!'); return; } $('body').append('

    '); - $('#category_dialog').load(OC.filePath('core', 'ajax', 'vcategories/edit.php')+'?app='+OCCategories.app, function(response){ + $('#category_dialog').load( + OC.filePath('core', 'ajax', 'vcategories/edit.php') + '?app=' + OCCategories.app, function(response) { try { var jsondata = jQuery.parseJSON(response); - if(response.status == 'error'){ + if(response.status == 'error') { OC.dialogs.alert(response.data.message, 'Error'); return; } @@ -32,7 +33,7 @@ var OCCategories={ $('#category_dialog').remove(); }, open : function(event, ui) { - $('#category_addinput').live('input',function(){ + $('#category_addinput').live('input',function() { if($(this).val().length > 0) { $('#category_addbutton').removeAttr('disabled'); } @@ -43,7 +44,7 @@ var OCCategories={ $('#category_addbutton').attr('disabled', 'disabled'); return false; }); - $('#category_addbutton').live('click',function(e){ + $('#category_addbutton').live('click',function(e) { e.preventDefault(); if($('#category_addinput').val().length > 0) { OCCategories.add($('#category_addinput').val()); @@ -55,14 +56,37 @@ var OCCategories={ } }); }, - _processDeleteResult:function(jsondata, status, xhr){ - if(jsondata.status == 'success'){ + _processDeleteResult:function(jsondata, status, xhr) { + if(jsondata.status == 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } }, - doDelete:function(){ + favorites:function(type, cb) { + $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/favorites.php'),function(jsondata) { + if(jsondata.status === 'success') { + OCCategories._update(jsondata.data.categories); + } else { + OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + } + }); + }, + addToFavorites:function(id, type) { + $.post(OC.filePath('core', 'ajax', 'vcategories/addToFavorites.php'), {id:id, type:type}, function(jsondata) { + if(jsondata.status !== 'success') { + OC.dialogs.alert(jsondata.data.message, 'Error'); + } + }); + }, + removeFromFavorites:function(id, type) { + $.post(OC.filePath('core', 'ajax', 'vcategories/removeFromFavorites.php'), {id:id, type:type}, function(jsondata) { + if(jsondata.status !== 'success') { + OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + } + }); + }, + doDelete:function() { var categories = $('#categorylist').find('input:checkbox').serialize(); if(categories == '' || categories == undefined) { OC.dialogs.alert(t('core', 'No categories selected for deletion.'), t('core', 'Error')); @@ -76,30 +100,31 @@ var OCCategories={ } }); }, - add:function(category){ - $.getJSON(OC.filePath('core', 'ajax', 'vcategories/add.php'),{'category':category, 'app':OCCategories.app},function(jsondata){ - if(jsondata.status == 'success'){ + add:function(category) { + $.post(OC.filePath('core', 'ajax', 'vcategories/add.php'),{'category':category, 'app':OCCategories.app},function(jsondata) { + if(jsondata.status === 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } }); - return false; }, - rescan:function(){ - $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php'),function(jsondata, status, xhr){ - if(jsondata.status == 'success'){ + rescan:function() { + $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php'),function(jsondata, status, xhr) { + if(jsondata.status === 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } }).error(function(xhr){ if (xhr.status == 404) { - OC.dialogs.alert('The required file ' + OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php') + ' is not installed!', 'Error'); + OC.dialogs.alert( + t('core', 'The required file {file} is not installed!', + {file: OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php')}, t('core', 'Error'))); } }); }, - _update:function(categories){ + _update:function(categories) { var categorylist = $('#categorylist'); categorylist.find('li').remove(); for(var category in categories) { From 1f7baeb9741be2c77caa892b55b12c23caa47253 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:13:34 +0200 Subject: [PATCH 036/481] Use consts all places and rename some daft method names. --- lib/vcategories.php | 50 +++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 499fffad3f..d71d570e4f 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -46,8 +46,11 @@ class OC_VCategories { private $type = null; private $user = null; - private static $category_table = '*PREFIX*vcategory'; - private static $relation_table = '*PREFIX*vcategory_to_object'; + + const CATEGORY_TABLE = '*PREFIX*vcategory'; + const RELATION_TABLE = '*PREFIX*vcategory_to_object'; + + const CATEGORY_FAVORITE = '_$!!$_'; const FORMAT_LIST = 0; const FORMAT_MAP = 1; @@ -81,7 +84,7 @@ class OC_VCategories { private function loadCategories() { $this->categories = array(); $result = null; - $sql = 'SELECT `id`, `category` FROM `*PREFIX*vcategory` ' + $sql = 'SELECT `id`, `category` FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`'; try { $stmt = OCP\DB::prepare($sql); @@ -108,7 +111,7 @@ class OC_VCategories { */ public static function isEmpty($type, $user = null) { $user = is_null($user) ? OC_User::getUser() : $user; - $sql = 'SELECT COUNT(*) FROM `*PREFIX*vcategory` ' + $sql = 'SELECT COUNT(*) FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`'; try { $stmt = OCP\DB::prepare($sql); @@ -185,11 +188,11 @@ class OC_VCategories { $fields = substr($fields, 0, -1); $items = array(); - $sql = 'SELECT `' . self::$relation_table . '`.`categoryid`, ' . $fields + $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` = ?'; + . self::RELATION_TABLE . '` ON `' . $tableinfo['tablename'] + . '`.`id` = `' . self::RELATION_TABLE . '`.`objid` WHERE `' + . self::RELATION_TABLE . '`.`categoryid` = ?'; try { $stmt = OCP\DB::prepare($sql, $limit, $offset); @@ -281,7 +284,7 @@ class OC_VCategories { $result = null; // Find all objectid/categoryid pairs. try { - $stmt = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*vcategory` ' + $stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND `type` = ?'); $result = $stmt->execute(array($this->user, $this->type)); } catch(Exception $e) { @@ -291,14 +294,14 @@ class OC_VCategories { // And delete them. if(!is_null($result)) { - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory_to_object` ' + $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 `*PREFIX*vcategory` ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND `type` = ?'); $result = $stmt->execute(array($this->user, $this->type)); } catch(Exception $e) { @@ -328,7 +331,7 @@ class OC_VCategories { private function save() { if(is_array($this->categories)) { foreach($this->categories as $category) { - OCP\DB::insertIfNotExist(self::$category_table, + OCP\DB::insertIfNotExist(self::CATEGORY_TABLE, array( 'uid' => $this->user, 'type' => $this->type, @@ -346,7 +349,7 @@ class OC_VCategories { $catid = $this->array_searchi($relation['category'], $categories); OC_Log::write('core', __METHOD__ . 'catid, ' . $relation['category'] . ' ' . $catid, OC_Log::DEBUG); if($catid) { - OCP\DB::insertIfNotExist(self::$relation_table, + OCP\DB::insertIfNotExist(self::RELATION_TABLE, array( 'objid' => $relation['objid'], 'categoryid' => $catid, @@ -370,7 +373,7 @@ class OC_VCategories { // Find all objectid/categoryid pairs. $result = null; try { - $stmt = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*vcategory` ' + $stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ?'); $result = $stmt->execute(array($arguments['uid'])); } catch(Exception $e) { @@ -380,7 +383,7 @@ class OC_VCategories { if(!is_null($result)) { try { - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory_to_object` ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` ' . 'WHERE `categoryid` = ?'); while( $row = $result->fetchRow()) { try { @@ -396,7 +399,7 @@ class OC_VCategories { } } try { - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory` ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND'); $result = $stmt->execute(array($arguments['uid'])); } catch(Exception $e) { @@ -415,7 +418,7 @@ class OC_VCategories { public function purgeObject($id, $type = null) { $type = is_null($type) ? $this->type : $type; try { - $stmt = OCP\DB::prepare('DELETE FROM `' . self::$relation_table . '` ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` ' . 'WHERE `objid` = ? AND `type`= ?'); $stmt->execute(array($id, $type)); } catch(Exception $e) { @@ -434,13 +437,16 @@ class OC_VCategories { * Defaults to the type set in the instance * @returns boolean */ - public function createRelation($objid, $category, $type = null) { + public function addToCategory($objid, $category, $type = null) { $type = is_null($type) ? $this->type : $type; + if(is_string($category) && !$this->hasCategory($category)) { + $this->add($category, true); + } $categoryid = (is_string($category) && !is_numeric($category)) ? $this->array_searchi($category, $this->categories) : $category; try { - OCP\DB::insertIfNotExist(self::$relation_table, + OCP\DB::insertIfNotExist(self::RELATION_TABLE, array( 'objid' => $objid, 'categoryid' => $categoryid, @@ -462,13 +468,13 @@ class OC_VCategories { * Defaults to the type set in the instance * @returns boolean */ - public function removeRelation($objid, $category, $type = null) { + 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 . '` ' + $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` ' . 'WHERE `objid` = ? AND `categoryid` = ? AND `type` = ?'; OCP\Util::writeLog('core', __METHOD__.', sql: ' . $objid . ' ' . $categoryid . ' ' . $type, OCP\Util::DEBUG); @@ -499,7 +505,7 @@ class OC_VCategories { unset($this->categories[$this->array_searchi($name, $this->categories)]); } try { - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*vcategory` WHERE ' + $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` WHERE ' . '`uid` = ? AND `type` = ? AND `category` = ?'); $result = $stmt->execute(array($this->user, $this->type, $name)); } catch(Exception $e) { From 09e26145b7d9c5bbbcf5f52e5b3742dafe789333 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:15:58 +0200 Subject: [PATCH 037/481] Add favorite handling methods to OC_VCategories. --- lib/vcategories.php | 99 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index d71d570e4f..e6680450f8 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -149,7 +149,57 @@ class OC_VCategories { } /** - * @brief Get the a list if items belonging to $category. + * 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)); + } 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[] = $row['objid']; + } + } + //OCP\Util::writeLog('core', __METHOD__.', count: ' . count($items), OCP\Util::DEBUG); + //OCP\Util::writeLog('core', __METHOD__.', sql: ' . $sql, OCP\Util::DEBUG); + + 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 @@ -428,6 +478,53 @@ class OC_VCategories { } 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. From 8a777022e4757cd6434853773f782575ef714a21 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:16:53 +0200 Subject: [PATCH 038/481] Formatting --- lib/vcategories.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index e6680450f8..1f1626c551 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -226,9 +226,7 @@ class OC_VCategories { if($catid === false) { $l10n = OC_L10N::get('core'); throw new Exception( - $l10n->t( - 'Could not find category "%s"', $category - ) + $l10n->t('Could not find category "%s"', $category) ); } $fields = ''; From 4827de4a276c83ad92eb1fa890dd3ade5d7a1514 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:20:27 +0200 Subject: [PATCH 039/481] White space fix. --- lib/vcategories.php | 138 ++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 1f1626c551..19274390c5 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -33,12 +33,12 @@ OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_VCategories', 'post_deleteUse * 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. */ @@ -46,12 +46,12 @@ class OC_VCategories { private $type = null; private $user = null; - + const CATEGORY_TABLE = '*PREFIX*vcategory'; const RELATION_TABLE = '*PREFIX*vcategory_to_object'; - + const CATEGORY_FAVORITE = '_$!!$_'; - + const FORMAT_LIST = 0; const FORMAT_MAP = 1; @@ -66,13 +66,13 @@ class OC_VCategories { 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::writeLog('core', __METHOD__ . ', categories: ' + . print_r($this->categories, true), OCP\Util::DEBUG ); - + if($defcategories && count($this->categories) === 0) { $this->add($defcategories, true); } @@ -90,7 +90,7 @@ class OC_VCategories { $stmt = OCP\DB::prepare($sql); $result = $stmt->execute(array($this->user, $this->type)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); } @@ -101,8 +101,8 @@ class OC_VCategories { } } } - - + + /** * @brief Check if any categories are saved for this type and user. * @returns boolean. @@ -118,12 +118,12 @@ class OC_VCategories { $result = $stmt->execute(array($user, $type)); return ($result->numRows() == 0); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); return false; } } - + /** * @brief Get the categories for a specific user. * @param @@ -150,9 +150,9 @@ class OC_VCategories { /** * 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. */ @@ -172,14 +172,14 @@ class OC_VCategories { } $ids = array(); - $sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE + $sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE . ' WHERE `categoryid` = ?'; try { $stmt = OCP\DB::prepare($sql); $result = $stmt->execute(array($catid)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); return false; } @@ -191,28 +191,28 @@ class OC_VCategories { } //OCP\Util::writeLog('core', __METHOD__.', count: ' . count($items), OCP\Util::DEBUG); //OCP\Util::writeLog('core', __METHOD__.', sql: ' . $sql, OCP\Util::DEBUG); - + 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. */ public function itemsForCategory($category, $tableinfo, $limit = null, $offset = null) { @@ -236,17 +236,17 @@ class OC_VCategories { $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 `' + $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)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); } @@ -257,10 +257,10 @@ class OC_VCategories { } //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. @@ -327,8 +327,8 @@ class OC_VCategories { * $categories->rescan($objects); */ public function rescan($objects, $sync=true, $reset=true) { - - if($reset === true) { + + if($reset === true) { $result = null; // Find all objectid/categoryid pairs. try { @@ -336,7 +336,7 @@ class OC_VCategories { . 'WHERE `uid` = ? AND `type` = ?'); $result = $stmt->execute(array($this->user, $this->type)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); } @@ -353,7 +353,7 @@ class OC_VCategories { . 'WHERE `uid` = ? AND `type` = ?'); $result = $stmt->execute(array($this->user, $this->type)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__ . ', exception: ' + OCP\Util::writeLog('core', __METHOD__ . ', exception: ' . $e->getMessage(), OCP\Util::ERROR); return; } @@ -366,7 +366,7 @@ class OC_VCategories { // Load the categories $this->loadFromVObject($object[0], $vobject, $sync); } else { - OC_Log::write('core', __METHOD__ . ', unable to parse. ID: ' . ', ' + OC_Log::write('core', __METHOD__ . ', unable to parse. ID: ' . ', ' . substr($object, 0, 100) . '(...)', OC_Log::DEBUG); } } @@ -379,7 +379,7 @@ class OC_VCategories { private function save() { if(is_array($this->categories)) { foreach($this->categories as $category) { - OCP\DB::insertIfNotExist(self::CATEGORY_TABLE, + OCP\DB::insertIfNotExist(self::CATEGORY_TABLE, array( 'uid' => $this->user, 'type' => $this->type, @@ -392,12 +392,12 @@ class OC_VCategories { // and save relations. $categories = $this->categories; // For some reason this is needed or array_search(i) will return 0..? - ksort($categories); + 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) { - OCP\DB::insertIfNotExist(self::RELATION_TABLE, + OCP\DB::insertIfNotExist(self::RELATION_TABLE, array( 'objid' => $relation['objid'], 'categoryid' => $catid, @@ -407,11 +407,11 @@ class OC_VCategories { } self::$relations = array(); // reset } else { - OC_Log::write('core', __METHOD__.', $this->categories is not an array! ' + 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 @@ -425,10 +425,10 @@ class OC_VCategories { . 'WHERE `uid` = ?'); $result = $stmt->execute(array($arguments['uid'])); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + 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 . '` ' @@ -437,12 +437,12 @@ class OC_VCategories { try { $stmt->execute(array($row['id'])); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); } } } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); } } @@ -451,11 +451,11 @@ class OC_VCategories { . 'WHERE `uid` = ? AND'); $result = $stmt->execute(array($arguments['uid'])); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__ . ', exception: ' + OCP\Util::writeLog('core', __METHOD__ . ', exception: ' . $e->getMessage(), OCP\Util::ERROR); } } - + /** * @brief Delete category/object relations from the db * @param int $id The id of the object @@ -470,7 +470,7 @@ class OC_VCategories { . 'WHERE `objid` = ? AND `type`= ?'); $stmt->execute(array($id, $type)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); return false; } @@ -479,14 +479,14 @@ class OC_VCategories { /** * 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) { @@ -497,7 +497,7 @@ class OC_VCategories { /** * 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 @@ -510,10 +510,10 @@ class OC_VCategories { } 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 @@ -523,7 +523,7 @@ class OC_VCategories { $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 @@ -538,23 +538,23 @@ class OC_VCategories { $this->add($category, true); } $categoryid = (is_string($category) && !is_numeric($category)) - ? $this->array_searchi($category, $this->categories) + ? $this->array_searchi($category, $this->categories) : $category; try { - OCP\DB::insertIfNotExist(self::RELATION_TABLE, + 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::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 @@ -566,23 +566,23 @@ class OC_VCategories { 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) + ? $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::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::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 @@ -592,7 +592,7 @@ class OC_VCategories { if(!is_array($names)) { $names = array($names); } - //OC_Log::write('core', __METHOD__ . ', before: ' + //OC_Log::write('core', __METHOD__ . ', before: ' // . print_r($this->categories, true), OC_Log::DEBUG); foreach($names as $name) { //OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG); @@ -604,11 +604,11 @@ class OC_VCategories { . '`uid` = ? AND `type` = ? AND `category` = ?'); $result = $stmt->execute(array($this->user, $this->type, $name)); } catch(Exception $e) { - OCP\Util::writeLog('core', __METHOD__ . ', exception: ' + OCP\Util::writeLog('core', __METHOD__ . ', exception: ' . $e->getMessage(), OCP\Util::ERROR); } } - //OC_Log::write('core', __METHOD__.', after: ' + //OC_Log::write('core', __METHOD__.', after: ' // . print_r($this->categories, true), OC_Log::DEBUG); if(!is_null($objects)) { foreach($objects as $key=>&$value) { @@ -635,7 +635,7 @@ class OC_VCategories { $idx = $this->array_searchi($name, $categories); if($idx !== false) { OC_Log::write('core', __METHOD__ - .', unsetting: ' + .', unsetting: ' . $categories[$this->array_searchi($name, $categories)], OC_Log::DEBUG); unset($categories[$this->array_searchi($name, $categories)]); @@ -649,7 +649,7 @@ class OC_VCategories { $objects[$key] = $value; } else { OC_Log::write('core', __METHOD__ - .', unable to parse. ID: ' . $value[0] . ', ' + .', unable to parse. ID: ' . $value[0] . ', ' . substr($value[1], 0, 50) . '(...)', OC_Log::DEBUG); } } @@ -670,7 +670,7 @@ class OC_VCategories { return false; } return array_search( - strtolower($needle), + strtolower($needle), array_map('strtolower', $haystack) ); } From b9c9fdfe200d42bc75afe42d9ecfa98e3ccef8c1 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:38:23 +0200 Subject: [PATCH 040/481] Use get for loading dialog. --- core/ajax/vcategories/favorites.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ajax/vcategories/favorites.php b/core/ajax/vcategories/favorites.php index 35b23e29c1..b72fc7a9fe 100644 --- a/core/ajax/vcategories/favorites.php +++ b/core/ajax/vcategories/favorites.php @@ -20,7 +20,7 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::callCheck(); -$type = isset($_POST['type']) ? $_POST['type'] : null; +$type = isset($_GET['type']) ? $_GET['type'] : null; if(is_null($type)) { $l = OC_L10N::get('core'); From 81536a81e3df86289afcc80308a0bb7f22df3cc1 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 00:39:09 +0200 Subject: [PATCH 041/481] More js updates for app/type in OCCategories --- core/js/oc-vcategories.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/js/oc-vcategories.js b/core/js/oc-vcategories.js index f3935911b8..b0256c7ec0 100644 --- a/core/js/oc-vcategories.js +++ b/core/js/oc-vcategories.js @@ -1,12 +1,12 @@ var OCCategories= { edit:function() { - if(OCCategories.app == undefined) { - OC.dialogs.alert('OCCategories.app is not set!'); + if(OCCategories.type == undefined) { + OC.dialogs.alert('OCCategories.type is not set!'); return; } $('body').append('
    '); $('#category_dialog').load( - OC.filePath('core', 'ajax', 'vcategories/edit.php') + '?app=' + OCCategories.app, function(response) { + OC.filePath('core', 'ajax', 'vcategories/edit.php') + '?type=' + OCCategories.type, function(response) { try { var jsondata = jQuery.parseJSON(response); if(response.status == 'error') { @@ -64,7 +64,7 @@ var OCCategories= { } }, favorites:function(type, cb) { - $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/favorites.php'),function(jsondata) { + $.getJSON(OC.filePath('core', 'ajax', 'categories/favorites.php'), {type: type},function(jsondata) { if(jsondata.status === 'success') { OCCategories._update(jsondata.data.categories); } else { @@ -92,13 +92,13 @@ var OCCategories= { OC.dialogs.alert(t('core', 'No categories selected for deletion.'), t('core', 'Error')); return false; } - categories += '&app=' + OCCategories.app; - $.post(OC.filePath(OCCategories.app, 'ajax', 'categories/delete.php'), categories, OCCategories._processDeleteResult) - .error(function(xhr){ - if (xhr.status == 404) { - $.post(OC.filePath('core', 'ajax', 'vcategories/delete.php'), categories, OCCategories._processDeleteResult); - } - }); + var q = categories + '&type=' + OCCategories.type; + if(OCCategories.app) { + q += '&app=' + OCCategories.app; + $.post(OC.filePath(OCCategories.app, 'ajax', 'categories/delete.php'), q, OCCategories._processDeleteResult); + } else { + $.post(OC.filePath('core', 'ajax', 'vcategories/delete.php'), q, OCCategories._processDeleteResult); + } }, add:function(category) { $.post(OC.filePath('core', 'ajax', 'vcategories/add.php'),{'category':category, 'app':OCCategories.app},function(jsondata) { From e55cc2313299d770733a0d488bb11d3ff256bc76 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 02:24:57 +0200 Subject: [PATCH 042/481] app !== type --- core/ajax/vcategories/edit.php | 1 - 1 file changed, 1 deletion(-) diff --git a/core/ajax/vcategories/edit.php b/core/ajax/vcategories/edit.php index 4e9c9c17b5..e7f2ff8ce5 100644 --- a/core/ajax/vcategories/edit.php +++ b/core/ajax/vcategories/edit.php @@ -26,7 +26,6 @@ if(is_null($type)) { bailOut($l->t('Category type not provided.')); } -OC_JSON::checkAppEnabled($type); $tmpl = new OCP\Template("core", "edit_categories_dialog"); $vcategories = new OC_VCategories($type); From fdf3ec1027c0be5fe01bdd4e4780fef812f999af Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 02:25:39 +0200 Subject: [PATCH 043/481] Add wait state to category dialog while processing. --- core/js/oc-vcategories.js | 50 ++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/core/js/oc-vcategories.js b/core/js/oc-vcategories.js index b0256c7ec0..f08df9c069 100644 --- a/core/js/oc-vcategories.js +++ b/core/js/oc-vcategories.js @@ -14,18 +14,34 @@ var OCCategories= { return; } } catch(e) { - $('#edit_categories_dialog').dialog({ + var setEnabled = function(d, enable) { + if(enable) { + dlg.css('cursor', 'default').find('input,button:not(#category_addbutton)') + .prop('disabled', false).css('cursor', 'default'); + } else { + d.css('cursor', 'wait').find('input,button:not(#category_addbutton)') + .prop('disabled', true).css('cursor', 'wait'); + } + } + var dlg = $('#edit_categories_dialog').dialog({ modal: true, height: 350, minHeight:200, width: 250, minWidth: 200, buttons: { 'Close': function() { - $(this).dialog("close"); + $(this).dialog('close'); }, 'Delete':function() { - OCCategories.doDelete(); + var categories = $('#categorylist').find('input:checkbox').serialize(); + setEnabled(dlg, false); + OCCategories.doDelete(categories, function() { + setEnabled(dlg, true); + }); }, 'Rescan':function() { - OCCategories.rescan(); + setEnabled(dlg, false); + OCCategories.rescan(function() { + setEnabled(dlg, true); + }); } }, close : function(event, ui) { @@ -56,12 +72,15 @@ var OCCategories= { } }); }, - _processDeleteResult:function(jsondata, status, xhr) { + _processDeleteResult:function(jsondata, cb) { if(jsondata.status == 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } + if(typeof cb == 'function') { + cb(); + } }, favorites:function(type, cb) { $.getJSON(OC.filePath('core', 'ajax', 'categories/favorites.php'), {type: type},function(jsondata) { @@ -86,8 +105,7 @@ var OCCategories= { } }); }, - doDelete:function() { - var categories = $('#categorylist').find('input:checkbox').serialize(); + doDelete:function(categories, cb) { if(categories == '' || categories == undefined) { OC.dialogs.alert(t('core', 'No categories selected for deletion.'), t('core', 'Error')); return false; @@ -95,9 +113,13 @@ var OCCategories= { var q = categories + '&type=' + OCCategories.type; if(OCCategories.app) { q += '&app=' + OCCategories.app; - $.post(OC.filePath(OCCategories.app, 'ajax', 'categories/delete.php'), q, OCCategories._processDeleteResult); + $.post(OC.filePath(OCCategories.app, 'ajax', 'categories/delete.php'), q, function(jsondata) { + OCCategories._processDeleteResult(jsondata, cb) + }); } else { - $.post(OC.filePath('core', 'ajax', 'vcategories/delete.php'), q, OCCategories._processDeleteResult); + $.post(OC.filePath('core', 'ajax', 'vcategories/delete.php'), q, function(jsondata) { + OCCategories._processDeleteResult(jsondata, cb) + }); } }, add:function(category) { @@ -109,19 +131,25 @@ var OCCategories= { } }); }, - rescan:function() { + rescan:function(cb) { $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php'),function(jsondata, status, xhr) { if(jsondata.status === 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } + if(typeof cb == 'function') { + cb(); + } }).error(function(xhr){ if (xhr.status == 404) { OC.dialogs.alert( t('core', 'The required file {file} is not installed!', {file: OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php')}, t('core', 'Error'))); } + if(typeof cb == 'function') { + cb(); + } }); }, _update:function(categories) { @@ -131,7 +159,7 @@ var OCCategories= { var item = '
  • ' + categories[category] + '
  • '; $(item).appendTo(categorylist); } - if(OCCategories.changed != undefined) { + if(typeof OCCategories.changed === 'function') { OCCategories.changed(categories); } } From afa3f49c933a08af1f30eb8a2ff18529f4398e2c Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 02:26:36 +0200 Subject: [PATCH 044/481] Make categories var static. --- lib/vcategories.php | 56 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 19274390c5..22bd8a3c85 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -37,7 +37,7 @@ class OC_VCategories { /** * Categories */ - private $categories = array(); + private static $categories = array(); /** * Used for storing objectid/categoryname pairs while rescanning. @@ -69,11 +69,11 @@ class OC_VCategories { $this->loadCategories(); OCP\Util::writeLog('core', __METHOD__ . ', categories: ' - . print_r($this->categories, true), + . print_r(self::$categories, true), OCP\Util::DEBUG ); - if($defcategories && count($this->categories) === 0) { + if($defcategories && count(self::$categories) === 0) { $this->add($defcategories, true); } } @@ -82,7 +82,7 @@ class OC_VCategories { * @brief Load categories from db. */ private function loadCategories() { - $this->categories = array(); + self::$categories = array(); $result = null; $sql = 'SELECT `id`, `category` FROM `' . self::CATEGORY_TABLE . '` ' . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`'; @@ -97,9 +97,11 @@ class OC_VCategories { 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']; + self::$categories[$row['id']] = $row['category']; } } + OCP\Util::writeLog('core', __METHOD__.', categories: ' . print_r(self::$categories, true), + OCP\Util::DEBUG); } @@ -130,16 +132,16 @@ class OC_VCategories { * @returns array containing the categories as strings. */ public function categories($format = null) { - if(!$this->categories) { + if(!self::$categories) { return array(); } - $categories = array_values($this->categories); + $categories = array_values(self::$categories); uasort($categories, 'strnatcasecmp'); if($format == self::FORMAT_MAP) { $catmap = array(); foreach($categories as $category) { $catmap[] = array( - 'id' => $this->array_searchi($category, $this->categories), + 'id' => $this->array_searchi($category, self::$categories), 'name' => $category ); } @@ -161,7 +163,7 @@ class OC_VCategories { if(is_numeric($category)) { $catid = $category; } elseif(is_string($category)) { - $catid = $this->array_searchi($category, $this->categories); + $catid = $this->array_searchi($category, self::$categories); } OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG); if($catid === false) { @@ -220,7 +222,7 @@ class OC_VCategories { if(is_numeric($category)) { $catid = $category; } elseif(is_string($category)) { - $catid = $this->array_searchi($category, $this->categories); + $catid = $this->array_searchi($category, self::$categories); } OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG); if($catid === false) { @@ -267,7 +269,7 @@ class OC_VCategories { * @returns bool */ public function hasCategory($name) { - return $this->in_arrayi($name, $this->categories); + return $this->in_arrayi($name, self::$categories); } /** @@ -285,7 +287,7 @@ class OC_VCategories { $newones = array(); foreach($names as $name) { if(($this->in_arrayi( - $name, $this->categories) == false) && $name != '') { + $name, self::$categories) == false) && $name != '') { $newones[] = $name; } if(!is_null($id) ) { @@ -294,7 +296,7 @@ class OC_VCategories { } } if(count($newones) > 0) { - $this->categories = array_merge($this->categories, $newones); + self::$categories = array_merge(self::$categories, $newones); if($sync === true) { $this->save(); } @@ -357,7 +359,7 @@ class OC_VCategories { . $e->getMessage(), OCP\Util::ERROR); return; } - $this->categories = array(); + self::$categories = array(); } // Parse all the VObjects foreach($objects as $object) { @@ -377,8 +379,8 @@ class OC_VCategories { * @brief Save the list with categories */ private function save() { - if(is_array($this->categories)) { - foreach($this->categories as $category) { + if(is_array(self::$categories)) { + foreach(self::$categories as $category) { OCP\DB::insertIfNotExist(self::CATEGORY_TABLE, array( 'uid' => $this->user, @@ -390,7 +392,7 @@ class OC_VCategories { $this->loadCategories(); // Loop through temporarily cached objectid/categoryname pairs // and save relations. - $categories = $this->categories; + $categories = self::$categories; // For some reason this is needed or array_search(i) will return 0..? ksort($categories); foreach(self::$relations as $relation) { @@ -407,8 +409,8 @@ class OC_VCategories { } self::$relations = array(); // reset } else { - OC_Log::write('core', __METHOD__.', $this->categories is not an array! ' - . print_r($this->categories, true), OC_Log::ERROR); + OC_Log::write('core', __METHOD__.', self::$categories is not an array! ' + . print_r(self::$categories, true), OC_Log::ERROR); } } @@ -538,7 +540,7 @@ class OC_VCategories { $this->add($category, true); } $categoryid = (is_string($category) && !is_numeric($category)) - ? $this->array_searchi($category, $this->categories) + ? $this->array_searchi($category, self::$categories) : $category; try { OCP\DB::insertIfNotExist(self::RELATION_TABLE, @@ -566,7 +568,7 @@ class OC_VCategories { 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) + ? $this->array_searchi($category, self::$categories) : $category; try { $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` ' @@ -592,12 +594,12 @@ class OC_VCategories { if(!is_array($names)) { $names = array($names); } - //OC_Log::write('core', __METHOD__ . ', before: ' - // . print_r($this->categories, true), OC_Log::DEBUG); + OC_Log::write('core', __METHOD__ . ', before: ' + . print_r(self::$categories, true), OC_Log::DEBUG); foreach($names as $name) { - //OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG); + OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG); if($this->hasCategory($name)) { - unset($this->categories[$this->array_searchi($name, $this->categories)]); + unset(self::$categories[$this->array_searchi($name, self::$categories)]); } try { $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` WHERE ' @@ -608,8 +610,8 @@ class OC_VCategories { . $e->getMessage(), OCP\Util::ERROR); } } - //OC_Log::write('core', __METHOD__.', after: ' - // . print_r($this->categories, true), OC_Log::DEBUG); + OC_Log::write('core', __METHOD__.', after: ' + . print_r(self::$categories, true), OC_Log::DEBUG); if(!is_null($objects)) { foreach($objects as $key=>&$value) { $vobject = OC_VObject::parse($value[1]); From 1c9929d44f9d826493de7222ad42ff220cfd0cab Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 13:18:57 +0200 Subject: [PATCH 045/481] Added unit tests for OC_DB::insertIfNotExist() --- tests/data/db_structure.xml | 84 +++++++++++++++++++++++++++++++++++++ tests/lib/db.php | 26 ++++++++++++ 2 files changed, 110 insertions(+) diff --git a/tests/data/db_structure.xml b/tests/data/db_structure.xml index 03d7502c44..8a80819adf 100644 --- a/tests/data/db_structure.xml +++ b/tests/data/db_structure.xml @@ -135,4 +135,88 @@ + + + *dbprefix*vcategory + + + + + id + integer + 0 + true + 1 + true + 4 + + + + uid + text + + true + 64 + + + + type + text + + true + 64 + + + + category + text + + true + 255 + + + + uid_index + + uid + ascending + + + + + type_index + + type + ascending + + + + + category_index + + category + ascending + + + + + uid_type_category_index + true + + uid + ascending + + + type + ascending + + + category + ascending + + + + +
    + diff --git a/tests/lib/db.php b/tests/lib/db.php index 2344f7d8ec..5d30f6ac46 100644 --- a/tests/lib/db.php +++ b/tests/lib/db.php @@ -24,6 +24,7 @@ class Test_DB extends UnitTestCase { $this->test_prefix = $r; $this->table1 = $this->test_prefix.'contacts_addressbooks'; $this->table2 = $this->test_prefix.'contacts_cards'; + $this->table3 = $this->test_prefix.'vcategory'; } public function tearDown() { @@ -67,4 +68,29 @@ class Test_DB extends UnitTestCase { $result = $query->execute(array('uri_3')); $this->assertTrue($result); } + + public function testinsertIfNotExist() { + $categoryentries = array( + array('user' => 'test', 'type' => 'contact', 'category' => 'Family'), + array('user' => 'test', 'type' => 'contact', 'category' => 'Friends'), + array('user' => 'test', 'type' => 'contact', 'category' => 'Coworkers'), + array('user' => 'test', 'type' => 'contact', 'category' => 'Coworkers'), + array('user' => 'test', 'type' => 'contact', 'category' => 'School'), + ); + + foreach($categoryentries as $entry) { + $result = OC_DB::insertIfNotExist('*PREFIX*'.$this->table3, + array( + 'uid' => $entry['user'], + 'type' => $entry['type'], + 'category' => $entry['category'], + )); + $this->assertTrue($result); + } + + $query = OC_DB::prepare('SELECT * FROM *PREFIX*'.$this->table3); + $result = $query->execute(); + $this->assertTrue($result); + $this->assertEqual($result->numRows(), '4'); + } } From 0e4ed2887cb413db0e3eecdb0595a09dc3b01a0f Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 13:20:08 +0200 Subject: [PATCH 046/481] Return result from OC_DB::insertIfNotExist(). --- lib/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/db.php b/lib/db.php index 6ad65201e1..f32e8549ce 100644 --- a/lib/db.php +++ b/lib/db.php @@ -587,7 +587,7 @@ class OC_DB { } $result = new PDOStatementWrapper($result); - $result->execute(); + return $result->execute(); } /** From 180326028587be3e266aa0c7d4ec9e870bd55265 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 13:21:05 +0200 Subject: [PATCH 047/481] Renamed OC_VCategories::add() to addMulti() and let the add() method return the id of the newly created category. --- lib/vcategories.php | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 22bd8a3c85..c958368238 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -74,7 +74,7 @@ class OC_VCategories { ); if($defcategories && count(self::$categories) === 0) { - $this->add($defcategories, true); + $this->addMulti($defcategories, true); } } @@ -273,13 +273,37 @@ class OC_VCategories { } /** - * @brief Add a new category name. + * @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; + } + OCP\DB::insertIfNotExist(self::CATEGORY_TABLE, + array( + 'uid' => $this->user, + 'type' => $this->type, + 'category' => $name, + )); + $id = OCP\DB::insertid(self::CATEGORY_TABLE); + OCP\Util::writeLog('core', __METHOD__.', id: ' . $id, OCP\Util::DEBUG); + self::$categories[$id] = $name; + return $id; + } + + /** + * @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 add($names, $sync=false, $id = null) { + public function addMulti($names, $sync=false, $id = null) { if(!is_array($names)) { $names = array($names); } @@ -309,7 +333,7 @@ class OC_VCategories { * @param $vobject The instance of OC_VObject to load the categories from. */ public function loadFromVObject($id, $vobject, $sync=false) { - $this->add($vobject->getAsArray('CATEGORIES'), $sync, $id); + $this->addMulti($vobject->getAsArray('CATEGORIES'), $sync, $id); } /** From 394e4e4d5fe5cbd5e52df63984a67dc0786685a4 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 16:15:47 +0200 Subject: [PATCH 048/481] Removed useless ORDER BY from query. --- lib/vcategories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index c958368238..fb315ca960 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -114,7 +114,7 @@ class OC_VCategories { 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` = ? ORDER BY `category`'; + . 'WHERE `uid` = ? AND `type` = ?'; try { $stmt = OCP\DB::prepare($sql); $result = $stmt->execute(array($user, $type)); From 10e29da8be495cce0cea7aa35942bd2a92b868d8 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 17:21:23 +0200 Subject: [PATCH 049/481] Use self::prepare() instead of self::$connection->prepare. --- lib/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/db.php b/lib/db.php index f32e8549ce..ff06ec3e00 100644 --- a/lib/db.php +++ b/lib/db.php @@ -577,7 +577,7 @@ class OC_DB { //OC_Log::write('core', __METHOD__ . ', type: ' . $type . ', query: ' . $query, OC_Log::DEBUG); try { - $result=self::$connection->prepare($query); + $result = self::prepare($query); } catch(PDOException $e) { $entry = 'DB Error: "'.$e->getMessage().'"
    '; $entry .= 'Offending command was: '.$query.'
    '; From 73c743076e64384ecf7892921e9cf96ce68abdca Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 17:23:54 +0200 Subject: [PATCH 050/481] Remove index that might cause problems. --- db_structure.xml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index 64abdff368..fe580c4a2f 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -735,23 +735,6 @@ - - uid_type_category_index - true - - uid - ascending - - - type - ascending - - - category - ascending - - - From 2456401672e4d0bf1a7042d4a25f316c1f4a9347 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 18:11:13 +0200 Subject: [PATCH 051/481] Remove redundant class wrapping. --- lib/db.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/db.php b/lib/db.php index ff06ec3e00..8472978d81 100644 --- a/lib/db.php +++ b/lib/db.php @@ -586,7 +586,6 @@ class OC_DB { die( $entry ); } - $result = new PDOStatementWrapper($result); return $result->execute(); } From fc6d1bf5006f6630f342eed92cad25167a5d4d8e Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 19 Oct 2012 19:42:59 +0200 Subject: [PATCH 052/481] Clean indentation. --- db_structure.xml | 202 +++++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index fe580c4a2f..851c8aa998 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -671,125 +671,125 @@ - +
    - *dbprefix*vcategory + *dbprefix*vcategory - + - - id - integer - 0 - true - 1 - true - 4 - + + id + integer + 0 + true + 1 + true + 4 + - - uid - text - - true - 64 - + + uid + text + + true + 64 + - - type - text - - true - 64 - + + type + text + + true + 64 + - - category - text - - true - 255 - + + category + text + + true + 255 + - - uid_index - - uid - ascending - - + + uid_index + + uid + ascending + + - - type_index - - type - ascending - - + + type_index + + type + ascending + + - - category_index - - category - ascending - - + + category_index + + category + ascending + + - -
    + + - +
    - *dbprefix*vcategory_to_object + *dbprefix*vcategory_to_object - + - - objid - integer - 0 - true - true - 4 - + + objid + integer + 0 + true + true + 4 + - - categoryid - integer - 0 - true - true - 4 - + + categoryid + integer + 0 + true + true + 4 + - - type - text - - true - 64 - + + type + text + + true + 64 + - - true - true - category_object_index - - categoryid - ascending - - - objid - ascending - - - type - ascending - - + + true + true + category_object_index + + categoryid + ascending + + + objid + ascending + + + type + ascending + + - + -
    + From ab167c3e2c55895fddac50cd1c9d8d5d92b10845 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sat, 20 Oct 2012 13:42:57 +0200 Subject: [PATCH 053/481] Filter out special Favorites category. --- lib/vcategories.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index fb315ca960..2ea70d167f 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -140,14 +140,23 @@ class OC_VCategories { if($format == self::FORMAT_MAP) { $catmap = array(); foreach($categories as $category) { - $catmap[] = array( - 'id' => $this->array_searchi($category, self::$categories), - 'name' => $category - ); + if($category !== self::CATEGORY_FAVORITE) { + $catmap[] = array( + 'id' => $this->array_searchi($category, self::$categories), + 'name' => $category + ); + } } return $catmap; } - return $categories; + + // 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; + } } /** From 26618704a924723505be7b723e90c63055017658 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sat, 20 Oct 2012 13:45:18 +0200 Subject: [PATCH 054/481] Fix accidentally creating new categories with the id as name. --- lib/vcategories.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index 2ea70d167f..c220821eca 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -149,7 +149,7 @@ class OC_VCategories { } return $catmap; } - + // Don't add favorites to normal categories. $favpos = array_search(self::CATEGORY_FAVORITE, $categories); if($favpos !== false) { @@ -569,12 +569,14 @@ class OC_VCategories { */ public function addToCategory($objid, $category, $type = null) { $type = is_null($type) ? $this->type : $type; - if(is_string($category) && !$this->hasCategory($category)) { - $this->add($category, true); + if(is_string($category) && !is_numeric($category)) { + if(!$this->hasCategory($category)) { + $this->add($category, true); + } + $categoryid = $this->array_searchi($category, self::$categories); + } else { + $categoryid = $category; } - $categoryid = (is_string($category) && !is_numeric($category)) - ? $this->array_searchi($category, self::$categories) - : $category; try { OCP\DB::insertIfNotExist(self::RELATION_TABLE, array( @@ -711,3 +713,4 @@ class OC_VCategories { } } + From 273fdb7b642b79b1d1b0d6abb31d684b6f2ed66f Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 22 Oct 2012 15:40:08 +0200 Subject: [PATCH 055/481] Added type and callback arguments to most methods. --- core/js/oc-vcategories.js | 141 +++++++++++++++++++++++++------------- 1 file changed, 95 insertions(+), 46 deletions(-) diff --git a/core/js/oc-vcategories.js b/core/js/oc-vcategories.js index f08df9c069..53065933be 100644 --- a/core/js/oc-vcategories.js +++ b/core/js/oc-vcategories.js @@ -1,12 +1,13 @@ var OCCategories= { - edit:function() { - if(OCCategories.type == undefined) { - OC.dialogs.alert('OCCategories.type is not set!'); - return; + category_favorites:'_$!!$_', + edit:function(type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; } + type = type ? type : this.type; $('body').append('
    '); $('#category_dialog').load( - OC.filePath('core', 'ajax', 'vcategories/edit.php') + '?type=' + OCCategories.type, function(response) { + OC.filePath('core', 'ajax', 'vcategories/edit.php') + '?type=' + type, function(response) { try { var jsondata = jQuery.parseJSON(response); if(response.status == 'error') { @@ -27,8 +28,8 @@ var OCCategories= { modal: true, height: 350, minHeight:200, width: 250, minWidth: 200, buttons: { - 'Close': function() { - $(this).dialog('close'); + 'Close': function() { + $(this).dialog('close'); }, 'Delete':function() { var categories = $('#categorylist').find('input:checkbox').serialize(); @@ -72,83 +73,131 @@ var OCCategories= { } }); }, - _processDeleteResult:function(jsondata, cb) { + _processDeleteResult:function(jsondata) { if(jsondata.status == 'success') { OCCategories._update(jsondata.data.categories); } else { OC.dialogs.alert(jsondata.data.message, 'Error'); } - if(typeof cb == 'function') { - cb(); - } }, favorites:function(type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; + } + type = type ? type : this.type; $.getJSON(OC.filePath('core', 'ajax', 'categories/favorites.php'), {type: type},function(jsondata) { - if(jsondata.status === 'success') { - OCCategories._update(jsondata.data.categories); + if(typeof cb == 'function') { + cb(jsondata); } else { - OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + if(jsondata.status === 'success') { + OCCategories._update(jsondata.data.categories); + } else { + OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + } } }); }, - addToFavorites:function(id, type) { + addToFavorites:function(id, type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; + } + type = type ? type : this.type; $.post(OC.filePath('core', 'ajax', 'vcategories/addToFavorites.php'), {id:id, type:type}, function(jsondata) { - if(jsondata.status !== 'success') { - OC.dialogs.alert(jsondata.data.message, 'Error'); + if(typeof cb == 'function') { + cb(jsondata); + } else { + if(jsondata.status !== 'success') { + OC.dialogs.alert(jsondata.data.message, 'Error'); + } } }); }, - removeFromFavorites:function(id, type) { + removeFromFavorites:function(id, type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; + } + type = type ? type : this.type; $.post(OC.filePath('core', 'ajax', 'vcategories/removeFromFavorites.php'), {id:id, type:type}, function(jsondata) { - if(jsondata.status !== 'success') { - OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + if(typeof cb == 'function') { + cb(jsondata); + } else { + if(jsondata.status !== 'success') { + OC.dialogs.alert(jsondata.data.message, t('core', 'Error')); + } } }); }, - doDelete:function(categories, cb) { + doDelete:function(categories, type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; + } + type = type ? type : this.type; if(categories == '' || categories == undefined) { OC.dialogs.alert(t('core', 'No categories selected for deletion.'), t('core', 'Error')); return false; } - var q = categories + '&type=' + OCCategories.type; - if(OCCategories.app) { - q += '&app=' + OCCategories.app; - $.post(OC.filePath(OCCategories.app, 'ajax', 'categories/delete.php'), q, function(jsondata) { - OCCategories._processDeleteResult(jsondata, cb) + var self = this; + var q = categories + '&type=' + type; + if(this.app) { + q += '&app=' + this.app; + $.post(OC.filePath(this.app, 'ajax', 'categories/delete.php'), q, function(jsondata) { + if(typeof cb == 'function') { + cb(jsondata); + } else { + self._processDeleteResult(jsondata); + } }); } else { $.post(OC.filePath('core', 'ajax', 'vcategories/delete.php'), q, function(jsondata) { - OCCategories._processDeleteResult(jsondata, cb) + if(typeof cb == 'function') { + cb(jsondata); + } else { + self._processDeleteResult(jsondata); + } }); } }, - add:function(category) { - $.post(OC.filePath('core', 'ajax', 'vcategories/add.php'),{'category':category, 'app':OCCategories.app},function(jsondata) { - if(jsondata.status === 'success') { - OCCategories._update(jsondata.data.categories); + add:function(category, type, cb) { + if(!type && !this.type) { + throw { name: 'MissingParameter', message: t('core', 'The object type is not specified.') }; + } + type = type ? type : this.type; + $.post(OC.filePath('core', 'ajax', 'vcategories/add.php'),{'category':category, 'type':type},function(jsondata) { + if(typeof cb == 'function') { + cb(jsondata); } else { - OC.dialogs.alert(jsondata.data.message, 'Error'); + if(jsondata.status === 'success') { + OCCategories._update(jsondata.data.categories); + } else { + OC.dialogs.alert(jsondata.data.message, 'Error'); + } } }); }, - rescan:function(cb) { - $.getJSON(OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php'),function(jsondata, status, xhr) { - if(jsondata.status === 'success') { - OCCategories._update(jsondata.data.categories); - } else { - OC.dialogs.alert(jsondata.data.message, 'Error'); - } + rescan:function(app, cb) { + if(!app && !this.app) { + throw { name: 'MissingParameter', message: t('core', 'The app name is not specified.') }; + } + app = app ? app : this.app; + $.getJSON(OC.filePath(app, 'ajax', 'categories/rescan.php'),function(jsondata, status, xhr) { if(typeof cb == 'function') { - cb(); + cb(jsondata); + } else { + if(jsondata.status === 'success') { + OCCategories._update(jsondata.data.categories); + } else { + OC.dialogs.alert(jsondata.data.message, 'Error'); + } } }).error(function(xhr){ if (xhr.status == 404) { - OC.dialogs.alert( - t('core', 'The required file {file} is not installed!', - {file: OC.filePath(OCCategories.app, 'ajax', 'categories/rescan.php')}, t('core', 'Error'))); - } - if(typeof cb == 'function') { - cb(); + var errormessage = t('core', 'The required file {file} is not installed!', + {file: OC.filePath(app, 'ajax', 'categories/rescan.php')}, t('core', 'Error')); + if(typeof cb == 'function') { + cb({status:'error', data:{message:errormessage}}); + } else { + OC.dialogs.alert(errormessage); + } } }); }, From b5817dcc2e7a531bbd1548b4486d07be5ffdf12f Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 22 Oct 2012 15:41:00 +0200 Subject: [PATCH 056/481] Added missing backtick to sql query. --- lib/vcategories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index c220821eca..607a995cb3 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -184,7 +184,7 @@ class OC_VCategories { $ids = array(); $sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE - . ' WHERE `categoryid` = ?'; + . '` WHERE `categoryid` = ?'; try { $stmt = OCP\DB::prepare($sql); From 2fc495a91a1c38e0fbf53f0c78d157698e7ff024 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 24 Oct 2012 22:39:34 +0200 Subject: [PATCH 057/481] Also delete category/object relations when deleting a category. --- lib/vcategories.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/vcategories.php b/lib/vcategories.php index ec243297a4..116c1d1cd9 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -632,9 +632,11 @@ class OC_VCategories { OC_Log::write('core', __METHOD__ . ', before: ' . print_r(self::$categories, true), OC_Log::DEBUG); foreach($names as $name) { + $id = null; OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG); if($this->hasCategory($name)) { - unset(self::$categories[$this->array_searchi($name, self::$categories)]); + $id = $this->array_searchi($name, self::$categories); + unset(self::$categories[$id]); } try { $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` WHERE ' @@ -644,6 +646,18 @@ class OC_VCategories { 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); + $stmt->execute(array($id)); + } catch(Exception $e) { + OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + OCP\Util::ERROR); + return false; + } + } } OC_Log::write('core', __METHOD__.', after: ' . print_r(self::$categories, true), OC_Log::DEBUG); From 0cf1fef3fa49704bef54b606390ca73bbfc9f61f Mon Sep 17 00:00:00 2001 From: libasys Date: Fri, 26 Oct 2012 20:34:04 +0200 Subject: [PATCH 058/481] Fix for problems using for() function instead of $.each for arrays with IE8 --- core/js/oc-dialogs.js | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 2467af6112..949d8cf846 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -72,33 +72,36 @@ var OCdialogs = { */ form:function(fields, title, callback, modal) { var content = ''; - for (var a in fields) { - content += ''; - } + + }); content += '
    '+fields[a].text+''; + $.each(fields, function(index, val){ + content += '
    '+val.text+''; var type=fields[a].type; + if (type == 'text' || type == 'checkbox' || type == 'password') { - content += ''; + } else if (type == 'text' || type == 'password' && val.value) { + content += ' value="'+val.value+'">'; } } else if (type == 'select') { - content += ''; } content += '
    '; OCdialogs.message(content, title, OCdialogs.FORM_DIALOG, OCdialogs.OK_CANCEL_BUTTONS, callback, modal); }, @@ -215,9 +218,10 @@ var OCdialogs = { fillFilePicker:function(r, dialog_content_id) { var entry_template = '
    *NAME*
    *LASTMODDATE*
    '; var names = ''; - for (var a in r.data) { - names += entry_template.replace('*LASTMODDATE*', OC.mtime2date(r.data[a].mtime)).replace('*NAME*', r.data[a].name).replace('*MIMETYPEICON*', r.data[a].mimetype_icon).replace('*ENTRYNAME*', r.data[a].name).replace('*ENTRYTYPE*', r.data[a].type); - } + $.each(r.data, function(index, a) { + names += entry_template.replace('*LASTMODDATE*', OC.mtime2date(a.mtime)).replace('*NAME*', a.name).replace('*MIMETYPEICON*', a.mimetype_icon).replace('*ENTRYNAME*', a.name).replace('*ENTRYTYPE*', a.type); + }); + $(dialog_content_id + ' #filelist').html(names); $(dialog_content_id + ' .filepicker_loader').css('visibility', 'hidden'); }, From 43e8293d9ce92b42f2dd944847c7e4d8d1b17b9f Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 11:32:16 +0200 Subject: [PATCH 059/481] Change Symfony/Component/Routing from submodule to composer fetching --- .gitignore | 4 ++++ .gitmodules | 3 --- 3rdparty/Symfony/Component/Routing | 1 - composer.json | 8 ++++++++ lib/base.php | 4 ++-- 5 files changed, 14 insertions(+), 6 deletions(-) delete mode 100644 .gitmodules delete mode 160000 3rdparty/Symfony/Component/Routing create mode 100644 composer.json diff --git a/.gitignore b/.gitignore index 4749dea19d..4ae39ed7fa 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,7 @@ nbproject # WebFinger .well-known /.buildpath +3rdparty/autoload.php +3rdparty/composer/ +3rdparty/symfony/ +composer.lock diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 0f4ad58807..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "3rdparty/Symfony/Component/Routing"] - path = 3rdparty/Symfony/Component/Routing - url = git://github.com/symfony/Routing.git diff --git a/3rdparty/Symfony/Component/Routing b/3rdparty/Symfony/Component/Routing deleted file mode 160000 index d724838908..0000000000 --- a/3rdparty/Symfony/Component/Routing +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d72483890880a987afa679503af096d2aaf7d2ee diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000..628ee60110 --- /dev/null +++ b/composer.json @@ -0,0 +1,8 @@ +{ + "require": { + "symfony/routing": "2.0.*" + }, + "config": { + "vendor-dir": "3rdparty" + } +} diff --git a/lib/base.php b/lib/base.php index c8a54d1c65..c688d78533 100644 --- a/lib/base.php +++ b/lib/base.php @@ -97,8 +97,8 @@ class OC{ elseif(strpos($className, 'Sabre_')===0) { $path = str_replace('_', '/', $className) . '.php'; } - elseif(strpos($className, 'Symfony\\')===0) { - $path = str_replace('\\', '/', $className) . '.php'; + elseif(strpos($className, 'Symfony\\Component\\Routing\\')===0) { + $path = 'symfony/routing/'.str_replace('\\', '/', $className) . '.php'; } elseif(strpos($className, 'Test_')===0) { $path = 'tests/lib/'.strtolower(str_replace('_', '/', substr($className, 5)) . '.php'); From 74665faec533430be37879bfc0ef24aa7f211f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 27 Oct 2012 11:22:00 +0200 Subject: [PATCH 060/481] exeuting tests now on apps as well - the apps repo shall be cloned into the sub folder apps2 --- autotest.sh | 6 ++++-- tests/enable_all.php | 20 ++++++++++++++++++++ tests/preseed-config.php | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/enable_all.php create mode 100644 tests/preseed-config.php diff --git a/autotest.sh b/autotest.sh index 56296c6a51..744bcdbe8f 100755 --- a/autotest.sh +++ b/autotest.sh @@ -9,7 +9,7 @@ DATADIR=data-autotest BASEDIR=$PWD -# create autoconfig for sqlite, mysql and (soon) postgresql +# create autoconfig for sqlite, mysql and postgresql cat > ./tests/autoconfig-sqlite.php < + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +require_once __DIR__.'/../lib/base.php'; + +OC_App::enable('calendar'); +OC_App::enable('contacts'); +OC_App::enable('files_archive'); +OC_App::enable('mozilla_sync'); +OC_App::enable('news'); +OC_App::enable('provisioning_api'); +OC_App::enable('user_external'); +OC_App::enable('provisioning_api'); +OC_App::enable('provisioning_api'); + diff --git a/tests/preseed-config.php b/tests/preseed-config.php new file mode 100644 index 0000000000..fbf60ad2e2 --- /dev/null +++ b/tests/preseed-config.php @@ -0,0 +1,19 @@ + false, + 'apps_paths' => + array ( + 0 => + array ( + 'path' => '/home/thomas/Development/owncloud/core/apps', + 'url' => '/apps', + 'writable' => false, + ), + 1 => + array ( + 'path' => '/home/thomas/Development/owncloud/core/apps2', + 'url' => '/apps2', + 'writable' => false, + ) + ), +); From beaaf5425dc2dfb7456efa934fa8eb91ac28c677 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 11:56:51 +0200 Subject: [PATCH 061/481] More info for composer.json --- composer.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/composer.json b/composer.json index 628ee60110..7916b15cb9 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,15 @@ { + "description": "ownCloud gives you universal access to your files/contacts/calendar through a web interface or WebDAV.", + "homepage": "http://owncloud.org", + "license": "AGPL-3.0+", + "support": { + "email": "owncloud@kde.org", + "irc": "irc://irc.freenode.org/owncloud", + "forum": "http://forum.owncloud.org/", + "issues": "https://github.com/owncloud/core/issues" + }, "require": { + "php": ">=5.3.2", "symfony/routing": "2.0.*" }, "config": { From ee6fc22d4b1cfd3b16433aeb457cef2b625e02d7 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 11:02:35 +0200 Subject: [PATCH 062/481] LDAP: sourced out paged search init into initPagedSearch method, making search slicker again --- apps/user_ldap/lib/access.php | 74 ++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index aa108f9840..536a5f8def 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -25,7 +25,6 @@ namespace OCA\user_ldap\lib; abstract class Access { protected $connection; - //never ever check this var directly, always use getPagedSearchResultState protected $pagedSearchedSuccessful; @@ -512,32 +511,8 @@ abstract class Access { return array(); } - //TODO: lines 516:540 into a function of its own. $pagedSearchOK as return - //check wether paged query should be attempted - $pagedSearchOK = false; - if($this->connection->hasPagedResultSupport && !is_null($limit)) { - $offset = intval($offset); //can be null - //get the cookie from the search for the previous search, required by LDAP - $cookie = $this->getPagedResultCookie($filter, $limit, $offset); - if(empty($cookie) && ($offset > 0)) { - //no cookie known, although the offset is not 0. Maybe cache run out. We need to start all over *sigh* (btw, Dear Reader, did you need LDAP paged searching was designed by MSFT?) - $reOffset = ($offset - $limit) < 0 ? 0 : $offset - $limit; - //a bit recursive, $offset of 0 is the exit - $this->search($filter, $base, $attr, $limit, $reOffset, true); - $cookie = $this->getPagedResultCookie($filter, $limit, $offset); - //still no cookie? obviously, the server does not like us. Let's skip paging efforts. - //TODO: remember this, probably does not change in the next request... - if(empty($cookie)) { - $cookie = null; - } - } - if(!is_null($cookie)) { - $pagedSearchOK = ldap_control_paged_result($link_resource, $limit, false, $cookie); - \OCP\Util::writeLog('user_ldap', 'Ready for a paged search', \OCP\Util::DEBUG); - } else { - \OCP\Util::writeLog('user_ldap', 'No paged search for us, Cpt., Limit '.$limit.' Offset '.$offset, \OCP\Util::DEBUG); - } - } + //check wether paged search should be attempted + $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset); $sr = ldap_search($link_resource, $base, $filter, $attr); $findings = ldap_get_entries($link_resource, $sr ); @@ -551,7 +526,7 @@ abstract class Access { return; } //if count is bigger, then the server does not support paged search. Instead, he did a normal search. We set a flag here, so the callee knows how to deal with it. - //TODO: Not used, just make a count on the returned values in the callee + //TODO: Instead, slice findings or selection later if($findings['count'] <= $limit) { $this->pagedSearchedSuccessful = true; } @@ -775,4 +750,47 @@ abstract class Access { return $result; } + + /** + * @brief prepares a paged search, if possible + * @param $filter the LDAP filter for the search + * @param $base the LDAP subtree that shall be searched + * @param $attr optional, when a certain attribute shall be filtered outside + * @param $limit + * @param $offset + * + */ + private function initPagedSearch($filter, $base, $attr, $limit, $offset) { + $pagedSearchOK = false; + if($this->connection->hasPagedResultSupport && !is_null($limit)) { + $offset = intval($offset); //can be null + //get the cookie from the search for the previous search, required by LDAP + $cookie = $this->getPagedResultCookie($filter, $limit, $offset); + if(empty($cookie) && ($offset > 0)) { + //no cookie known, although the offset is not 0. Maybe cache run out. We need to start all over *sigh* (btw, Dear Reader, did you need LDAP paged searching was designed by MSFT?) + $reOffset = ($offset - $limit) < 0 ? 0 : $offset - $limit; + //a bit recursive, $offset of 0 is the exit + \OCP\Util::writeLog('user_ldap', 'Looking for cookie L/O '.$limit.'/'.$reOffset, \OCP\Util::INFO); + $this->search($filter, $base, $attr, $limit, $reOffset, true); + $cookie = $this->getPagedResultCookie($filter, $limit, $offset); + //still no cookie? obviously, the server does not like us. Let's skip paging efforts. + //TODO: remember this, probably does not change in the next request... + if(empty($cookie)) { + $cookie = null; + } + } + if(!is_null($cookie)) { + if($offset > 0) { + \OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO); + } + $pagedSearchOK = ldap_control_paged_result($this->connection->getConnectionResource(), $limit, false, $cookie); + \OCP\Util::writeLog('user_ldap', 'Ready for a paged search', \OCP\Util::INFO); + } else { + \OCP\Util::writeLog('user_ldap', 'No paged search for us, Cpt., Limit '.$limit.' Offset '.$offset, \OCP\Util::INFO); + } + } + + return $pagedSearchOK; + } + } \ No newline at end of file From 67cd268df92d396f13555e426d2486ba98483a1f Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 11:02:53 +0200 Subject: [PATCH 063/481] LDAP: debug messaged --- apps/user_ldap/user_ldap.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index e95bd24fbd..011c7d5536 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -120,21 +120,22 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface { )); \OCP\Util::writeLog('user_ldap', 'getUsers: Get users filter '.$filter, \OCP\Util::DEBUG); + \OCP\Util::writeLog('user_ldap', 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset, \OCP\Util::INFO); //do the search and translate results to owncloud names $ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'), $limit, $offset); $ldap_users = $this->ownCloudUserNames($ldap_users); + \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::INFO); + //if bigger, then paged search is not supported if(!$this->getPagedSearchResultState()) { \OCP\Util::writeLog('user_ldap', 'getUsers: We got old-style results', \OCP\Util::DEBUG); //if not supported, a 'normal' search has run automatically, we just need to get our slice of the cake. And we cache the general search, too $this->connection->writeToCache('getUsers-'.$search, $ldap_users); $ldap_users = array_slice($ldap_users, $offset, $limit); - } else { - //debug message only - \OCP\Util::writeLog('user_ldap', 'getUsers: We got paged results', \OCP\Util::DEBUG); } $this->connection->writeToCache($cachekey, $ldap_users); + \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users returned', \OCP\Util::DEBUG); return $ldap_users; } From 605281da9bb4c575f89113c9f6399c2fe6ca9392 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 12:18:50 +0200 Subject: [PATCH 064/481] LDAP: let result processing in Access::search slice the array for not-paginated search. getUsers e.g. does not need to take care of it anymore. adjustments in group_ldap to follow. --- apps/user_ldap/lib/access.php | 11 +++++++++-- apps/user_ldap/user_ldap.php | 14 ++------------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 536a5f8def..d343945149 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -579,8 +579,15 @@ abstract class Access { } } } -// die(var_dump($selection)); - return $selection; + $findings = $selection; + } + if(!$this->pagedSearchedSuccessful + || ( + !is_null($limit) + || !is_null($offset) + ) + ) { + $findings = array_slice($findings, intval($offset), $limit); } return $findings; } diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 011c7d5536..916d3f1d46 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -119,23 +119,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface { $this->connection->ldapGroupDisplayName.'='.$search )); - \OCP\Util::writeLog('user_ldap', 'getUsers: Get users filter '.$filter, \OCP\Util::DEBUG); - \OCP\Util::writeLog('user_ldap', 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset, \OCP\Util::INFO); + \OCP\Util::writeLog('user_ldap', 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter, \OCP\Util::DEBUG); //do the search and translate results to owncloud names $ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'), $limit, $offset); $ldap_users = $this->ownCloudUserNames($ldap_users); - \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::INFO); - - //if bigger, then paged search is not supported - if(!$this->getPagedSearchResultState()) { - \OCP\Util::writeLog('user_ldap', 'getUsers: We got old-style results', \OCP\Util::DEBUG); - //if not supported, a 'normal' search has run automatically, we just need to get our slice of the cake. And we cache the general search, too - $this->connection->writeToCache('getUsers-'.$search, $ldap_users); - $ldap_users = array_slice($ldap_users, $offset, $limit); - } + \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::DEBUG); $this->connection->writeToCache($cachekey, $ldap_users); - \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users returned', \OCP\Util::DEBUG); return $ldap_users; } From 9317039e0c664e78069b2ec2b3d11005aeca9103 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 12:26:55 +0200 Subject: [PATCH 065/481] Add composer command for now, see http://getcomposer.org/doc/00-intro.md#installation-nix for local install --- 3rdparty/bin/composer | Bin 0 -> 631359 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 3rdparty/bin/composer diff --git a/3rdparty/bin/composer b/3rdparty/bin/composer new file mode 100755 index 0000000000000000000000000000000000000000..7999bd4ff6875d721d50c01d28e4b371c78d21d6 GIT binary patch literal 631359 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≧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

    J{fW+SfXRq-eaET&qYo^DAbnH>1R3g` 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 diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Annotation/Route.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Annotation/Route.php new file mode 100644 index 0000000000..f60af463f2 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Annotation/Route.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Annotation; + +/** + * Annotation class for @Route(). + * + * @Annotation + * + * @author Fabien Potencier + */ +class Route +{ + private $pattern; + private $name; + private $requirements; + private $options; + private $defaults; + + /** + * Constructor. + * + * @param array $data An array of key/value parameters. + */ + public function __construct(array $data) + { + $this->requirements = array(); + $this->options = array(); + $this->defaults = array(); + + if (isset($data['value'])) { + $data['pattern'] = $data['value']; + unset($data['value']); + } + + foreach ($data as $key => $value) { + $method = 'set'.$key; + if (!method_exists($this, $method)) { + throw new \BadMethodCallException(sprintf("Unknown property '%s' on annotation '%s'.", $key, get_class($this))); + } + $this->$method($value); + } + } + + public function setPattern($pattern) + { + $this->pattern = $pattern; + } + + public function getPattern() + { + return $this->pattern; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setRequirements($requirements) + { + $this->requirements = $requirements; + } + + public function getRequirements() + { + return $this->requirements; + } + + public function setOptions($options) + { + $this->options = $options; + } + + public function getOptions() + { + return $this->options; + } + + public function setDefaults($defaults) + { + $this->defaults = $defaults; + } + + public function getDefaults() + { + return $this->defaults; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/CompiledRoute.php b/3rdparty/symfony/routing/Symfony/Component/Routing/CompiledRoute.php new file mode 100644 index 0000000000..c86c9eca5b --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/CompiledRoute.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * CompiledRoutes are returned by the RouteCompiler class. + * + * @author Fabien Potencier + */ +class CompiledRoute +{ + private $route; + private $variables; + private $tokens; + private $staticPrefix; + private $regex; + + /** + * Constructor. + * + * @param Route $route A original Route instance + * @param string $staticPrefix The static prefix of the compiled route + * @param string $regex The regular expression to use to match this route + * @param array $tokens An array of tokens to use to generate URL for this route + * @param array $variables An array of variables + */ + public function __construct(Route $route, $staticPrefix, $regex, array $tokens, array $variables) + { + $this->route = $route; + $this->staticPrefix = $staticPrefix; + $this->regex = $regex; + $this->tokens = $tokens; + $this->variables = $variables; + } + + /** + * Returns the Route instance. + * + * @return Route A Route instance + */ + public function getRoute() + { + return $this->route; + } + + /** + * Returns the static prefix. + * + * @return string The static prefix + */ + public function getStaticPrefix() + { + return $this->staticPrefix; + } + + /** + * Returns the regex. + * + * @return string The regex + */ + public function getRegex() + { + return $this->regex; + } + + /** + * Returns the tokens. + * + * @return array The tokens + */ + public function getTokens() + { + return $this->tokens; + } + + /** + * Returns the variables. + * + * @return array The variables + */ + public function getVariables() + { + return $this->variables; + } + + /** + * Returns the pattern. + * + * @return string The pattern + */ + public function getPattern() + { + return $this->route->getPattern(); + } + + /** + * Returns the options. + * + * @return array The options + */ + public function getOptions() + { + return $this->route->getOptions(); + } + + /** + * Returns the defaults. + * + * @return array The defaults + */ + public function getDefaults() + { + return $this->route->getDefaults(); + } + + /** + * Returns the requirements. + * + * @return array The requirements + */ + public function getRequirements() + { + return $this->route->getRequirements(); + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..5289f525fc --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * ExceptionInterface + * + * @author Alexandre Salomé + * + * @api + */ +interface ExceptionInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php new file mode 100644 index 0000000000..4f12469529 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a parameter is not valid + * + * @author Alexandre Salomé + * + * @api + */ +class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php new file mode 100644 index 0000000000..470ce52216 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * The resource was found but the request method is not allowed. + * + * This exception should trigger an HTTP 405 response in your application code. + * + * @author Kris Wallsmith + * + * @api + */ +class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface +{ + protected $allowedMethods; + + public function __construct(array $allowedMethods, $message = null, $code = 0, \Exception $previous = null) + { + $this->allowedMethods = array_map('strtoupper', $allowedMethods); + + parent::__construct($message, $code, $previous); + } + + public function getAllowedMethods() + { + return $this->allowedMethods; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php new file mode 100644 index 0000000000..5a523fa559 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a route cannot be generated because of missing + * mandatory parameters. + * + * @author Alexandre Salomé + * + * @api + */ +class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php new file mode 100644 index 0000000000..362a0d61f3 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * The resource was not found. + * + * This exception should trigger an HTTP 404 response in your application code. + * + * @author Kris Wallsmith + * + * @api + */ +class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php new file mode 100644 index 0000000000..4d5f288e7e --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a route does not exists + * + * @author Alexandre Salomé + * + * @api + */ +class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php new file mode 100644 index 0000000000..1291bd12d0 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * GeneratorDumper is the base class for all built-in generator dumpers. + * + * @author Fabien Potencier + */ +abstract class GeneratorDumper implements GeneratorDumperInterface +{ + private $routes; + + /** + * Constructor. + * + * @param RouteCollection $routes The RouteCollection to dump + */ + public function __construct(RouteCollection $routes) + { + $this->routes = $routes; + } + + public function getRoutes() + { + return $this->routes; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php new file mode 100644 index 0000000000..6f5353caf2 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * GeneratorDumperInterface is the interface that all generator dumper classes must implement. + * + * @author Fabien Potencier + * + * @api + */ +interface GeneratorDumperInterface +{ + /** + * Dumps a set of routes to a PHP class. + * + * Available options: + * + * * class: The class name + * * base_class: The base class name + * + * @param array $options An array of options + * + * @return string A PHP class representing the generator class + */ + public function dump(array $options = array()); + + /** + * Gets the routes to dump. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRoutes(); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php new file mode 100644 index 0000000000..080dd3a253 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php @@ -0,0 +1,150 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\Route; + +/** + * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes. + * + * @author Fabien Potencier + * + * @api + */ +class PhpGeneratorDumper extends GeneratorDumper +{ + /** + * Dumps a set of routes to a PHP class. + * + * Available options: + * + * * class: The class name + * * base_class: The base class name + * + * @param array $options An array of options + * + * @return string A PHP class representing the generator class + * + * @api + */ + public function dump(array $options = array()) + { + $options = array_merge(array( + 'class' => 'ProjectUrlGenerator', + 'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', + ), $options); + + return + $this->startClass($options['class'], $options['base_class']). + $this->addConstructor(). + $this->addGenerator(). + $this->endClass() + ; + } + + private function addGenerator() + { + $methods = array(); + foreach ($this->getRoutes()->all() as $name => $route) { + $compiledRoute = $route->compile(); + + $variables = str_replace("\n", '', var_export($compiledRoute->getVariables(), true)); + $defaults = str_replace("\n", '', var_export($compiledRoute->getDefaults(), true)); + $requirements = str_replace("\n", '', var_export($compiledRoute->getRequirements(), true)); + $tokens = str_replace("\n", '', var_export($compiledRoute->getTokens(), true)); + + $escapedName = str_replace('.', '__', $name); + + $methods[] = <<{'get'.\$escapedName.'RouteInfo'}(); + + return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$absolute); + } + +$methods +EOF; + } + + private function startClass($class, $baseClass) + { + $routes = array(); + foreach ($this->getRoutes()->all() as $name => $route) { + $routes[] = " '$name' => true,"; + } + $routes = implode("\n", $routes); + + return <<context = \$context; + } + +EOF; + } + + private function endClass() + { + return << + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\Exception\InvalidParameterException; +use Symfony\Component\Routing\Exception\RouteNotFoundException; +use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; + +/** + * UrlGenerator generates URL based on a set of routes. + * + * @author Fabien Potencier + * + * @api + */ +class UrlGenerator implements UrlGeneratorInterface +{ + protected $context; + protected $decodedChars = array( + // %2F is not valid in a URL, so we don't encode it (which is fine as the requirements explicitly allowed it) + '%2F' => '/', + ); + + protected $routes; + protected $cache; + + /** + * Constructor. + * + * @param RouteCollection $routes A RouteCollection instance + * @param RequestContext $context The context + * + * @api + */ + public function __construct(RouteCollection $routes, RequestContext $context) + { + $this->routes = $routes; + $this->context = $context; + $this->cache = array(); + } + + /** + * Sets the request context. + * + * @param RequestContext $context The context + * + * @api + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + } + + /** + * Gets the request context. + * + * @return RequestContext The context + */ + public function getContext() + { + return $this->context; + } + + /** + * Generates a URL from the given parameters. + * + * @param string $name The name of the route + * @param mixed $parameters An array of parameters + * @param Boolean $absolute Whether to generate an absolute URL + * + * @return string The generated URL + * + * @throws Symfony\Component\Routing\Exception\RouteNotFoundException When route doesn't exist + * + * @api + */ + public function generate($name, $parameters = array(), $absolute = false) + { + if (null === $route = $this->routes->get($name)) { + throw new RouteNotFoundException(sprintf('Route "%s" does not exist.', $name)); + } + + if (!isset($this->cache[$name])) { + $this->cache[$name] = $route->compile(); + } + + return $this->doGenerate($this->cache[$name]->getVariables(), $route->getDefaults(), $route->getRequirements(), $this->cache[$name]->getTokens(), $parameters, $name, $absolute); + } + + /** + * @throws Symfony\Component\Routing\Exception\MissingMandatoryParametersException When route has some missing mandatory parameters + * @throws Symfony\Component\Routing\Exception\InvalidParameterException When a parameter value is not correct + */ + protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute) + { + $variables = array_flip($variables); + + $originParameters = $parameters; + $parameters = array_replace($this->context->getParameters(), $parameters); + $tparams = array_replace($defaults, $parameters); + + // all params must be given + if ($diff = array_diff_key($variables, $tparams)) { + throw new MissingMandatoryParametersException(sprintf('The "%s" route has some missing mandatory parameters ("%s").', $name, implode('", "', array_keys($diff)))); + } + + $url = ''; + $optional = true; + foreach ($tokens as $token) { + if ('variable' === $token[0]) { + if (false === $optional || !array_key_exists($token[3], $defaults) || (isset($parameters[$token[3]]) && (string) $parameters[$token[3]] != (string) $defaults[$token[3]])) { + if (!$isEmpty = in_array($tparams[$token[3]], array(null, '', false), true)) { + // check requirement + if ($tparams[$token[3]] && !preg_match('#^'.$token[2].'$#', $tparams[$token[3]])) { + throw new InvalidParameterException(sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given).', $token[3], $name, $token[2], $tparams[$token[3]])); + } + } + + if (!$isEmpty || !$optional) { + $url = $token[1].strtr(rawurlencode($tparams[$token[3]]), $this->decodedChars).$url; + } + + $optional = false; + } + } elseif ('text' === $token[0]) { + $url = $token[1].$url; + $optional = false; + } + } + + if (!$url) { + $url = '/'; + } + + // add a query string if needed + $extra = array_diff_key($originParameters, $variables, $defaults); + if ($extra && $query = http_build_query($extra, '', '&')) { + $url .= '?'.$query; + } + + $url = $this->context->getBaseUrl().$url; + + if ($this->context->getHost()) { + $scheme = $this->context->getScheme(); + if (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme != $req) { + $absolute = true; + $scheme = $req; + } + + if ($absolute) { + $port = ''; + if ('http' === $scheme && 80 != $this->context->getHttpPort()) { + $port = ':'.$this->context->getHttpPort(); + } elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) { + $port = ':'.$this->context->getHttpsPort(); + } + + $url = $scheme.'://'.$this->context->getHost().$port.$url; + } + } + + return $url; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php new file mode 100644 index 0000000000..6f2800c27c --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * UrlGeneratorInterface is the interface that all URL generator classes must implements. + * + * @author Fabien Potencier + * + * @api + */ +interface UrlGeneratorInterface extends RequestContextAwareInterface +{ + /** + * Generates a URL from the given parameters. + * + * @param string $name The name of the route + * @param mixed $parameters An array of parameters + * @param Boolean $absolute Whether to generate an absolute URL + * + * @return string The generated URL + * + * @api + */ + public function generate($name, $parameters = array(), $absolute = false); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/LICENSE b/3rdparty/symfony/routing/Symfony/Component/Routing/LICENSE new file mode 100644 index 0000000000..cdffe7aebc --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2012 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php new file mode 100644 index 0000000000..5f292d4589 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php @@ -0,0 +1,213 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Doctrine\Common\Annotations\Reader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\Config\Loader\LoaderResolver; + +/** + * AnnotationClassLoader loads routing information from a PHP class and its methods. + * + * You need to define an implementation for the getRouteDefaults() method. Most of the + * time, this method should define some PHP callable to be called for the route + * (a controller in MVC speak). + * + * The @Route annotation can be set on the class (for global parameters), + * and on each method. + * + * The @Route annotation main value is the route pattern. The annotation also + * recognizes three parameters: requirements, options, and name. The name parameter + * is mandatory. Here is an example of how you should be able to use it: + * + * /** + * * @Route("/Blog") + * * / + * class Blog + * { + * /** + * * @Route("/", name="blog_index") + * * / + * public function index() + * { + * } + * + * /** + * * @Route("/{id}", name="blog_post", requirements = {"id" = "\d+"}) + * * / + * public function show() + * { + * } + * } + * + * @author Fabien Potencier + */ +abstract class AnnotationClassLoader implements LoaderInterface +{ + protected $reader; + protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route'; + protected $defaultRouteIndex; + + /** + * Constructor. + * + * @param Reader $reader + */ + public function __construct(Reader $reader) + { + $this->reader = $reader; + } + + /** + * Sets the annotation class to read route properties from. + * + * @param string $class A fully-qualified class name + */ + public function setRouteAnnotationClass($class) + { + $this->routeAnnotationClass = $class; + } + + /** + * Loads from annotations from a class. + * + * @param string $class A class name + * @param string $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When route can't be parsed + */ + public function load($class, $type = null) + { + if (!class_exists($class)) { + throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class)); + } + + $globals = array( + 'pattern' => '', + 'requirements' => array(), + 'options' => array(), + 'defaults' => array(), + ); + + $class = new \ReflectionClass($class); + if ($class->isAbstract()) { + throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class)); + } + + if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) { + if (null !== $annot->getPattern()) { + $globals['pattern'] = $annot->getPattern(); + } + + if (null !== $annot->getRequirements()) { + $globals['requirements'] = $annot->getRequirements(); + } + + if (null !== $annot->getOptions()) { + $globals['options'] = $annot->getOptions(); + } + + if (null !== $annot->getDefaults()) { + $globals['defaults'] = $annot->getDefaults(); + } + } + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($class->getFileName())); + + foreach ($class->getMethods() as $method) { + $this->defaultRouteIndex = 0; + foreach ($this->reader->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $this->routeAnnotationClass) { + $this->addRoute($collection, $annot, $globals, $class, $method); + } + } + } + + return $collection; + } + + protected function addRoute(RouteCollection $collection, $annot, $globals, \ReflectionClass $class, \ReflectionMethod $method) + { + $name = $annot->getName(); + if (null === $name) { + $name = $this->getDefaultRouteName($class, $method); + } + + $defaults = array_merge($globals['defaults'], $annot->getDefaults()); + $requirements = array_merge($globals['requirements'], $annot->getRequirements()); + $options = array_merge($globals['options'], $annot->getOptions()); + + $route = new Route($globals['pattern'].$annot->getPattern(), $defaults, $requirements, $options); + + $this->configureRoute($route, $class, $method, $annot); + + $collection->add($name, $route); + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + */ + public function supports($resource, $type = null) + { + return is_string($resource) && preg_match('/^(?:\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)+$/', $resource) && (!$type || 'annotation' === $type); + } + + /** + * Sets the loader resolver. + * + * @param LoaderResolver $resolver A LoaderResolver instance + */ + public function setResolver(LoaderResolver $resolver) + { + } + + /** + * Gets the loader resolver. + * + * @return LoaderResolver A LoaderResolver instance + */ + public function getResolver() + { + } + + /** + * Gets the default route name for a class method. + * + * @param \ReflectionClass $class + * @param \ReflectionMethod $method + * + * @return string + */ + protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method) + { + $name = strtolower(str_replace('\\', '_', $class->name).'_'.$method->name); + if ($this->defaultRouteIndex > 0) { + $name .= '_'.$this->defaultRouteIndex; + } + $this->defaultRouteIndex++; + + return $name; + } + + abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php new file mode 100644 index 0000000000..8097cd67f9 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Config\Resource\DirectoryResource; + +/** + * AnnotationDirectoryLoader loads routing information from annotations set + * on PHP classes and methods. + * + * @author Fabien Potencier + */ +class AnnotationDirectoryLoader extends AnnotationFileLoader +{ + /** + * Loads from annotations from a directory. + * + * @param string $path A directory path + * @param string $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed + */ + public function load($path, $type = null) + { + $dir = $this->locator->locate($path); + + $collection = new RouteCollection(); + $collection->addResource(new DirectoryResource($dir, '/\.php$/')); + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if (!$file->isFile() || '.php' !== substr($file->getFilename(), -4)) { + continue; + } + + if ($class = $this->findClass($file)) { + $refl = new \ReflectionClass($class); + if ($refl->isAbstract()) { + continue; + } + + $collection->addCollection($this->loader->load($class, $type)); + } + } + + return $collection; + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + */ + public function supports($resource, $type = null) + { + try { + $path = $this->locator->locate($resource); + } catch (\Exception $e) { + return false; + } + + return is_string($resource) && is_dir($path) && (!$type || 'annotation' === $type); + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php new file mode 100644 index 0000000000..49e1cb2f77 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\FileLocator; + +/** + * AnnotationFileLoader loads routing information from annotations set + * on a PHP class and its methods. + * + * @author Fabien Potencier + */ +class AnnotationFileLoader extends FileLoader +{ + protected $loader; + + /** + * Constructor. + * + * @param FileLocator $locator A FileLocator instance + * @param AnnotationClassLoader $loader An AnnotationClassLoader instance + * @param string|array $paths A path or an array of paths where to look for resources + */ + public function __construct(FileLocator $locator, AnnotationClassLoader $loader, $paths = array()) + { + if (!function_exists('token_get_all')) { + throw new \RuntimeException('The Tokenizer extension is required for the routing annotation loaders.'); + } + + parent::__construct($locator, $paths); + + $this->loader = $loader; + } + + /** + * Loads from annotations from a file. + * + * @param string $file A PHP file path + * @param string $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When the file does not exist or its routes cannot be parsed + */ + public function load($file, $type = null) + { + $path = $this->locator->locate($file); + + $collection = new RouteCollection(); + if ($class = $this->findClass($path)) { + $collection->addResource(new FileResource($path)); + $collection->addCollection($this->loader->load($class, $type)); + } + + return $collection; + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + */ + public function supports($resource, $type = null) + { + return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'annotation' === $type); + } + + /** + * Returns the full class name for the first class in the file. + * + * @param string $file A PHP file path + * + * @return string|false Full class name if found, false otherwise + */ + protected function findClass($file) + { + $class = false; + $namespace = false; + $tokens = token_get_all(file_get_contents($file)); + for ($i = 0, $count = count($tokens); $i < $count; $i++) { + $token = $tokens[$i]; + + if (!is_array($token)) { + continue; + } + + if (true === $class && T_STRING === $token[0]) { + return $namespace.'\\'.$token[1]; + } + + if (true === $namespace && T_STRING === $token[0]) { + $namespace = ''; + do { + $namespace .= $token[1]; + $token = $tokens[++$i]; + } while ($i < $count && is_array($token) && in_array($token[0], array(T_NS_SEPARATOR, T_STRING))); + } + + if (T_CLASS === $token[0]) { + $class = true; + } + + if (T_NAMESPACE === $token[0]) { + $namespace = true; + } + } + + return false; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php new file mode 100644 index 0000000000..ca49c8fa35 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\Loader; + +/** + * ClosureLoader loads routes from a PHP closure. + * + * The Closure must return a RouteCollection instance. + * + * @author Fabien Potencier + * + * @api + */ +class ClosureLoader extends Loader +{ + /** + * Loads a Closure. + * + * @param \Closure $closure A Closure + * @param string $type The resource type + * + * @api + */ + public function load($closure, $type = null) + { + return call_user_func($closure); + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + * + * @api + */ + public function supports($resource, $type = null) + { + return $resource instanceof \Closure && (!$type || 'closure' === $type); + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php new file mode 100644 index 0000000000..ffd31f9444 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Loader\FileLoader; + +/** + * PhpFileLoader loads routes from a PHP file. + * + * The file must return a RouteCollection instance. + * + * @author Fabien Potencier + * + * @api + */ +class PhpFileLoader extends FileLoader +{ + /** + * Loads a PHP file. + * + * @param mixed $file A PHP file path + * @param string $type The resource type + * + * @api + */ + public function load($file, $type = null) + { + // the loader variable is exposed to the included file below + $loader = $this; + + $path = $this->locator->locate($file); + $this->setCurrentDir(dirname($path)); + + $collection = include $path; + $collection->addResource(new FileResource($path)); + + return $collection; + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + * + * @api + */ + public function supports($resource, $type = null) + { + return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'php' === $type); + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php new file mode 100644 index 0000000000..5dad9db3fa --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php @@ -0,0 +1,224 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Routing\Route; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Loader\FileLoader; + +/** + * XmlFileLoader loads XML routing files. + * + * @author Fabien Potencier + * + * @api + */ +class XmlFileLoader extends FileLoader +{ + /** + * Loads an XML file. + * + * @param string $file An XML file path + * @param string $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When a tag can't be parsed + * + * @api + */ + public function load($file, $type = null) + { + $path = $this->locator->locate($file); + + $xml = $this->loadFile($path); + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($path)); + + // process routes and imports + foreach ($xml->documentElement->childNodes as $node) { + if (!$node instanceof \DOMElement) { + continue; + } + + $this->parseNode($collection, $node, $path, $file); + } + + return $collection; + } + + /** + * Parses a node from a loaded XML file. + * + * @param RouteCollection $collection the collection to associate with the node + * @param DOMElement $node the node to parse + * @param string $path the path of the XML file being processed + * @param string $file + */ + protected function parseNode(RouteCollection $collection, \DOMElement $node, $path, $file) + { + switch ($node->tagName) { + case 'route': + $this->parseRoute($collection, $node, $path); + break; + case 'import': + $resource = (string) $node->getAttribute('resource'); + $type = (string) $node->getAttribute('type'); + $prefix = (string) $node->getAttribute('prefix'); + $this->setCurrentDir(dirname($path)); + $collection->addCollection($this->import($resource, ('' !== $type ? $type : null), false, $file), $prefix); + break; + default: + throw new \InvalidArgumentException(sprintf('Unable to parse tag "%s"', $node->tagName)); + } + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + * + * @api + */ + public function supports($resource, $type = null) + { + return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'xml' === $type); + } + + /** + * Parses a route and adds it to the RouteCollection. + * + * @param RouteCollection $collection A RouteCollection instance + * @param \DOMElement $definition Route definition + * @param string $file An XML file path + * + * @throws \InvalidArgumentException When the definition cannot be parsed + */ + protected function parseRoute(RouteCollection $collection, \DOMElement $definition, $file) + { + $defaults = array(); + $requirements = array(); + $options = array(); + + foreach ($definition->childNodes as $node) { + if (!$node instanceof \DOMElement) { + continue; + } + + switch ($node->tagName) { + case 'default': + $defaults[(string) $node->getAttribute('key')] = trim((string) $node->nodeValue); + break; + case 'option': + $options[(string) $node->getAttribute('key')] = trim((string) $node->nodeValue); + break; + case 'requirement': + $requirements[(string) $node->getAttribute('key')] = trim((string) $node->nodeValue); + break; + default: + throw new \InvalidArgumentException(sprintf('Unable to parse tag "%s"', $node->tagName)); + } + } + + $route = new Route((string) $definition->getAttribute('pattern'), $defaults, $requirements, $options); + + $collection->add((string) $definition->getAttribute('id'), $route); + } + + /** + * Loads an XML file. + * + * @param string $file An XML file path + * + * @return \DOMDocument + * + * @throws \InvalidArgumentException When loading of XML file returns error + */ + protected function loadFile($file) + { + $internalErrors = libxml_use_internal_errors(true); + $disableEntities = libxml_disable_entity_loader(true); + libxml_clear_errors(); + + $dom = new \DOMDocument(); + $dom->validateOnParse = true; + if (!$dom->loadXML(file_get_contents($file), LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) { + libxml_disable_entity_loader($disableEntities); + + throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($internalErrors))); + } + $dom->normalizeDocument(); + + libxml_use_internal_errors($internalErrors); + libxml_disable_entity_loader($disableEntities); + + foreach ($dom->childNodes as $child) { + if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { + throw new \InvalidArgumentException('Document types are not allowed.'); + } + } + + $this->validate($dom); + + return $dom; + } + + /** + * Validates a loaded XML file. + * + * @param \DOMDocument $dom A loaded XML file + * + * @throws \InvalidArgumentException When XML doesn't validate its XSD schema + */ + protected function validate(\DOMDocument $dom) + { + $location = __DIR__.'/schema/routing/routing-1.0.xsd'; + + $current = libxml_use_internal_errors(true); + libxml_clear_errors(); + + if (!$dom->schemaValidate($location)) { + throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($current))); + } + libxml_use_internal_errors($current); + } + + /** + * Retrieves libxml errors and clears them. + * + * @return array An array of libxml error strings + */ + private function getXmlErrors($internalErrors) + { + $errors = array(); + foreach (libxml_get_errors() as $error) { + $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)', + LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', + $error->code, + trim($error->message), + $error->file ? $error->file : 'n/a', + $error->line, + $error->column + ); + } + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return $errors; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php new file mode 100644 index 0000000000..ee72383435 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Routing\Route; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Yaml\Yaml; +use Symfony\Component\Config\Loader\FileLoader; + +/** + * YamlFileLoader loads Yaml routing files. + * + * @author Fabien Potencier + * + * @api + */ +class YamlFileLoader extends FileLoader +{ + private static $availableKeys = array( + 'type', 'resource', 'prefix', 'pattern', 'options', 'defaults', 'requirements' + ); + + /** + * Loads a Yaml file. + * + * @param string $file A Yaml file path + * @param string $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When route can't be parsed + * + * @api + */ + public function load($file, $type = null) + { + $path = $this->locator->locate($file); + + $config = Yaml::parse($path); + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($path)); + + // empty file + if (null === $config) { + $config = array(); + } + + // not an array + if (!is_array($config)) { + throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $file)); + } + + foreach ($config as $name => $config) { + $config = $this->normalizeRouteConfig($config); + + if (isset($config['resource'])) { + $type = isset($config['type']) ? $config['type'] : null; + $prefix = isset($config['prefix']) ? $config['prefix'] : null; + $this->setCurrentDir(dirname($path)); + $collection->addCollection($this->import($config['resource'], $type, false, $file), $prefix); + } else { + $this->parseRoute($collection, $name, $config, $path); + } + } + + return $collection; + } + + /** + * Returns true if this class supports the given resource. + * + * @param mixed $resource A resource + * @param string $type The resource type + * + * @return Boolean True if this class supports the given resource, false otherwise + * + * @api + */ + public function supports($resource, $type = null) + { + return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'yaml' === $type); + } + + /** + * Parses a route and adds it to the RouteCollection. + * + * @param RouteCollection $collection A RouteCollection instance + * @param string $name Route name + * @param array $config Route definition + * @param string $file A Yaml file path + * + * @throws \InvalidArgumentException When config pattern is not defined for the given route + */ + protected function parseRoute(RouteCollection $collection, $name, $config, $file) + { + $defaults = isset($config['defaults']) ? $config['defaults'] : array(); + $requirements = isset($config['requirements']) ? $config['requirements'] : array(); + $options = isset($config['options']) ? $config['options'] : array(); + + if (!isset($config['pattern'])) { + throw new \InvalidArgumentException(sprintf('You must define a "pattern" for the "%s" route.', $name)); + } + + $route = new Route($config['pattern'], $defaults, $requirements, $options); + + $collection->add($name, $route); + } + + /** + * Normalize route configuration. + * + * @param array $config A resource config + * + * @return array + * + * @throws InvalidArgumentException if one of the provided config keys is not supported + */ + private function normalizeRouteConfig(array $config) + { + foreach ($config as $key => $value) { + if (!in_array($key, self::$availableKeys)) { + throw new \InvalidArgumentException(sprintf( + 'Yaml routing loader does not support given key: "%s". Expected one of the (%s).', + $key, implode(', ', self::$availableKeys) + )); + } + } + + return $config; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd new file mode 100644 index 0000000000..a9554e64df --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php new file mode 100644 index 0000000000..3003dfdebb --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Exception\MethodNotAllowedException; + +/** + * ApacheUrlMatcher matches URL based on Apache mod_rewrite matching (see ApacheMatcherDumper). + * + * @author Fabien Potencier + */ +class ApacheUrlMatcher extends UrlMatcher +{ + /** + * Tries to match a URL based on Apache mod_rewrite matching. + * + * Returns false if no route matches the URL. + * + * @param string $pathinfo The pathinfo to be parsed + * + * @return array An array of parameters + * + * @throws MethodNotAllowedException If the current method is not allowed + */ + public function match($pathinfo) + { + $parameters = array(); + $defaults = array(); + $allow = array(); + $match = false; + + foreach ($_SERVER as $key => $value) { + $name = $key; + + if (0 === strpos($name, 'REDIRECT_')) { + $name = substr($name, 9); + } + + if (0 === strpos($name, '_ROUTING_DEFAULTS_')) { + $name = substr($name, 18); + $defaults[$name] = $value; + } elseif (0 === strpos($name, '_ROUTING_')) { + $name = substr($name, 9); + if ('_route' == $name) { + $match = true; + $parameters[$name] = $value; + } elseif (0 === strpos($name, '_allow_')) { + $allow[] = substr($name, 7); + } else { + $parameters[$name] = $value; + } + } else { + continue; + } + + unset($_SERVER[$key]); + } + + if ($match) { + return $this->mergeDefaults($parameters, $defaults); + } elseif (0 < count($allow)) { + throw new MethodNotAllowedException($allow); + } else { + return parent::match($pathinfo); + } + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php new file mode 100644 index 0000000000..4f03b8d393 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +/** + * Dumps a set of Apache mod_rewrite rules. + * + * @author Fabien Potencier + * @author Kris Wallsmith + */ +class ApacheMatcherDumper extends MatcherDumper +{ + /** + * Dumps a set of Apache mod_rewrite rules. + * + * Available options: + * + * * script_name: The script name (app.php by default) + * * base_uri: The base URI ("" by default) + * + * @param array $options An array of options + * + * @return string A string to be used as Apache rewrite rules + * + * @throws \LogicException When the route regex is invalid + */ + public function dump(array $options = array()) + { + $options = array_merge(array( + 'script_name' => 'app.php', + 'base_uri' => '', + ), $options); + + $options['script_name'] = self::escape($options['script_name'], ' ', '\\'); + + $rules = array("# skip \"real\" requests\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule .* - [QSA,L]"); + $methodVars = array(); + + foreach ($this->getRoutes()->all() as $name => $route) { + $compiledRoute = $route->compile(); + + // prepare the apache regex + $regex = $compiledRoute->getRegex(); + $delimiter = $regex[0]; + $regexPatternEnd = strrpos($regex, $delimiter); + if (strlen($regex) < 2 || 0 === $regexPatternEnd) { + throw new \LogicException('The "%s" route regex "%s" is invalid', $name, $regex); + } + $regex = preg_replace('/\?P<.+?>/', '', substr($regex, 1, $regexPatternEnd - 1)); + $regex = '^'.self::escape(preg_quote($options['base_uri']).substr($regex, 1), ' ', '\\'); + + $hasTrailingSlash = '/$' == substr($regex, -2) && '^/$' != $regex; + + $variables = array('E=_ROUTING__route:'.$name); + foreach ($compiledRoute->getVariables() as $i => $variable) { + $variables[] = 'E=_ROUTING_'.$variable.':%'.($i + 1); + } + foreach ($route->getDefaults() as $key => $value) { + $variables[] = 'E=_ROUTING_DEFAULTS_'.$key.':'.strtr($value, array( + ':' => '\\:', + '=' => '\\=', + '\\' => '\\\\', + ' ' => '\\ ', + )); + } + $variables = implode(',', $variables); + + $rule = array("# $name"); + + // method mismatch + if ($req = $route->getRequirement('_method')) { + $methods = explode('|', strtoupper($req)); + // GET and HEAD are equivalent + if (in_array('GET', $methods) && !in_array('HEAD', $methods)) { + $methods[] = 'HEAD'; + } + $allow = array(); + foreach ($methods as $method) { + $methodVars[] = $method; + $allow[] = 'E=_ROUTING__allow_'.$method.':1'; + } + + $rule[] = "RewriteCond %{REQUEST_URI} $regex"; + $rule[] = sprintf("RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]", implode('|', $methods)); + $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow)); + } + + // redirect with trailing slash appended + if ($hasTrailingSlash) { + $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$'; + $rule[] = 'RewriteRule .* $0/ [QSA,L,R=301]'; + } + + // the main rule + $rule[] = "RewriteCond %{REQUEST_URI} $regex"; + $rule[] = "RewriteRule .* {$options['script_name']} [QSA,L,$variables]"; + + $rules[] = implode("\n", $rule); + } + + if (0 < count($methodVars)) { + $rule = array('# 405 Method Not Allowed'); + $methodVars = array_values(array_unique($methodVars)); + foreach ($methodVars as $i => $methodVar) { + $rule[] = sprintf('RewriteCond %%{_ROUTING__allow_%s} !-z%s', $methodVar, isset($methodVars[$i + 1]) ? ' [OR]' : ''); + } + $rule[] = sprintf('RewriteRule .* %s [QSA,L]', $options['script_name']); + + $rules[] = implode("\n", $rule); + } + + return implode("\n\n", $rules)."\n"; + } + + /** + * Escapes a string. + * + * @param string $string The string to be escaped + * @param string $char The character to be escaped + * @param string $with The character to be used for escaping + * + * @return string The escaped string + */ + private static function escape($string, $char, $with) + { + $escaped = false; + $output = ''; + foreach (str_split($string) as $symbol) { + if ($escaped) { + $output .= $symbol; + $escaped = false; + continue; + } + if ($symbol === $char) { + $output .= $with.$char; + continue; + } + if ($symbol === $with) { + $escaped = true; + } + $output .= $symbol; + } + + return $output; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php new file mode 100644 index 0000000000..423368b57e --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * MatcherDumper is the abstract class for all built-in matcher dumpers. + * + * @author Fabien Potencier + */ +abstract class MatcherDumper implements MatcherDumperInterface +{ + private $routes; + + /** + * Constructor. + * + * @param RouteCollection $routes The RouteCollection to dump + */ + public function __construct(RouteCollection $routes) + { + $this->routes = $routes; + } + + /** + * Gets the routes to dump. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRoutes() + { + return $this->routes; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php new file mode 100644 index 0000000000..fe09e067d7 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +/** + * MatcherDumperInterface is the interface that all matcher dumper classes must implement. + * + * @author Fabien Potencier + */ +interface MatcherDumperInterface +{ + /** + * Dumps a set of routes to a PHP class. + * + * Available options: + * + * * class: The class name + * * base_class: The base class name + * + * @param array $options An array of options + * + * @return string A PHP class representing the matcher class + */ + public function dump(array $options = array()); + + /** + * Gets the routes to match. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRoutes(); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php new file mode 100644 index 0000000000..fdaad513a1 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php @@ -0,0 +1,293 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * PhpMatcherDumper creates a PHP class able to match URLs for a given set of routes. + * + * @author Fabien Potencier + */ +class PhpMatcherDumper extends MatcherDumper +{ + /** + * Dumps a set of routes to a PHP class. + * + * Available options: + * + * * class: The class name + * * base_class: The base class name + * + * @param array $options An array of options + * + * @return string A PHP class representing the matcher class + */ + public function dump(array $options = array()) + { + $options = array_merge(array( + 'class' => 'ProjectUrlMatcher', + 'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', + ), $options); + + // trailing slash support is only enabled if we know how to redirect the user + $interfaces = class_implements($options['base_class']); + $supportsRedirections = isset($interfaces['Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface']); + + return + $this->startClass($options['class'], $options['base_class']). + $this->addConstructor(). + $this->addMatcher($supportsRedirections). + $this->endClass() + ; + } + + private function addMatcher($supportsRedirections) + { + // we need to deep clone the routes as we will modify the structure to optimize the dump + $code = implode("\n", $this->compileRoutes(clone $this->getRoutes(), $supportsRedirections)); + + return <<getIterator(); + $keys = array_keys($routeIterator->getArrayCopy()); + $keysCount = count($keys); + + $i = 0; + foreach ($routeIterator as $name => $route) { + $i++; + + if ($route instanceof RouteCollection) { + $prefix = $route->getPrefix(); + $optimizable = $prefix && count($route->all()) > 1 && false === strpos($route->getPrefix(), '{'); + $indent = ''; + if ($optimizable) { + for ($j = $i; $j < $keysCount; $j++) { + if ($keys[$j] === null) { + continue; + } + + $testRoute = $routeIterator->offsetGet($keys[$j]); + $isCollection = ($testRoute instanceof RouteCollection); + + $testPrefix = $isCollection ? $testRoute->getPrefix() : $testRoute->getPattern(); + + if (0 === strpos($testPrefix, $prefix)) { + $routeIterator->offsetUnset($keys[$j]); + + if ($isCollection) { + $route->addCollection($testRoute); + } else { + $route->add($keys[$j], $testRoute); + } + + $i++; + $keys[$j] = null; + } + } + + if ($prefix !== $parentPrefix) { + $code[] = sprintf(" if (0 === strpos(\$pathinfo, %s)) {", var_export($prefix, true)); + $indent = ' '; + } + } + + foreach ($this->compileRoutes($route, $supportsRedirections, $prefix) as $line) { + foreach (explode("\n", $line) as $l) { + if ($l) { + $code[] = $indent.$l; + } else { + $code[] = $l; + } + } + } + + if ($optimizable && $prefix !== $parentPrefix) { + $code[] = " }\n"; + } + } else { + foreach ($this->compileRoute($route, $name, $supportsRedirections, $parentPrefix) as $line) { + $code[] = $line; + } + } + } + + return $code; + } + + private function compileRoute(Route $route, $name, $supportsRedirections, $parentPrefix = null) + { + $code = array(); + $compiledRoute = $route->compile(); + $conditions = array(); + $hasTrailingSlash = false; + $matches = false; + if (!count($compiledRoute->getVariables()) && false !== preg_match('#^(.)\^(?P.*?)\$\1#', $compiledRoute->getRegex(), $m)) { + if ($supportsRedirections && substr($m['url'], -1) === '/') { + $conditions[] = sprintf("rtrim(\$pathinfo, '/') === %s", var_export(rtrim(str_replace('\\', '', $m['url']), '/'), true)); + $hasTrailingSlash = true; + } else { + $conditions[] = sprintf("\$pathinfo === %s", var_export(str_replace('\\', '', $m['url']), true)); + } + } else { + if ($compiledRoute->getStaticPrefix() && $compiledRoute->getStaticPrefix() != $parentPrefix) { + $conditions[] = sprintf("0 === strpos(\$pathinfo, %s)", var_export($compiledRoute->getStaticPrefix(), true)); + } + + $regex = $compiledRoute->getRegex(); + if ($supportsRedirections && $pos = strpos($regex, '/$')) { + $regex = substr($regex, 0, $pos).'/?$'.substr($regex, $pos + 2); + $hasTrailingSlash = true; + } + $conditions[] = sprintf("preg_match(%s, \$pathinfo, \$matches)", var_export($regex, true)); + + $matches = true; + } + + $conditions = implode(' && ', $conditions); + + $gotoname = 'not_'.preg_replace('/[^A-Za-z0-9_]/', '', $name); + + $code[] = <<getRequirement('_method')) { + $methods = explode('|', strtoupper($req)); + // GET and HEAD are equivalent + if (in_array('GET', $methods) && !in_array('HEAD', $methods)) { + $methods[] = 'HEAD'; + } + if (1 === count($methods)) { + $code[] = <<context->getMethod() != '$methods[0]') { + \$allow[] = '$methods[0]'; + goto $gotoname; + } +EOF; + } else { + $methods = implode('\', \'', $methods); + $code[] = <<context->getMethod(), array('$methods'))) { + \$allow = array_merge(\$allow, array('$methods')); + goto $gotoname; + } +EOF; + } + } + + if ($hasTrailingSlash) { + $code[] = sprintf(<<redirect(\$pathinfo.'/', '%s'); + } +EOF + , $name); + } + + if ($scheme = $route->getRequirement('_scheme')) { + if (!$supportsRedirections) { + throw new \LogicException('The "_scheme" requirement is only supported for route dumper that implements RedirectableUrlMatcherInterface.'); + } + + $code[] = sprintf(<<context->getScheme() !== '$scheme') { + return \$this->redirect(\$pathinfo, '%s', '$scheme'); + } +EOF + , $name); + } + + // optimize parameters array + if (true === $matches && $compiledRoute->getDefaults()) { + $code[] = sprintf(" return array_merge(\$this->mergeDefaults(\$matches, %s), array('_route' => '%s'));" + , str_replace("\n", '', var_export($compiledRoute->getDefaults(), true)), $name); + } elseif (true === $matches) { + $code[] = sprintf(" \$matches['_route'] = '%s';", $name); + $code[] = sprintf(" return \$matches;", $name); + } elseif ($compiledRoute->getDefaults()) { + $code[] = sprintf(' return %s;', str_replace("\n", '', var_export(array_merge($compiledRoute->getDefaults(), array('_route' => $name)), true))); + } else { + $code[] = sprintf(" return array('_route' => '%s');", $name); + } + $code[] = " }"; + + if ($req) { + $code[] = " $gotoname:"; + } + + $code[] = ''; + + return $code; + } + + private function startClass($class, $baseClass) + { + return <<context = \$context; + } + +EOF; + } + + private function endClass() + { + return << + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Exception\ResourceNotFoundException; + +/** + * @author Fabien Potencier + * + * @api + */ +abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface +{ + private $trailingSlashTest = false; + + /** + * @see UrlMatcher::match() + * + * @api + */ + public function match($pathinfo) + { + try { + $parameters = parent::match($pathinfo); + } catch (ResourceNotFoundException $e) { + if ('/' === substr($pathinfo, -1)) { + throw $e; + } + + // try with a / at the end + $this->trailingSlashTest = true; + + return $this->match($pathinfo.'/'); + } + + if ($this->trailingSlashTest) { + $this->trailingSlashTest = false; + + return $this->redirect($pathinfo, null); + } + + return $parameters; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php new file mode 100644 index 0000000000..929ae9cc78 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +/** + * RedirectableUrlMatcherInterface knows how to redirect the user. + * + * @author Fabien Potencier + * + * @api + */ +interface RedirectableUrlMatcherInterface +{ + /** + * Redirects the user to another URL. + * + * @param string $path The path info to redirect to. + * @param string $route The route that matched + * @param string $scheme The URL scheme (null to keep the current one) + * + * @return array An array of parameters + * + * @api + */ + public function redirect($path, $route, $scheme = null); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php new file mode 100644 index 0000000000..5ff8070ea0 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Routing\RequestContext; + +/** + * UrlMatcher matches URL based on a set of routes. + * + * @author Fabien Potencier + * + * @api + */ +class UrlMatcher implements UrlMatcherInterface +{ + protected $context; + protected $allow; + + private $routes; + + /** + * Constructor. + * + * @param RouteCollection $routes A RouteCollection instance + * @param RequestContext $context The context + * + * @api + */ + public function __construct(RouteCollection $routes, RequestContext $context) + { + $this->routes = $routes; + $this->context = $context; + } + + /** + * Sets the request context. + * + * @param RequestContext $context The context + * + * @api + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + } + + /** + * Gets the request context. + * + * @return RequestContext The context + */ + public function getContext() + { + return $this->context; + } + + /** + * Tries to match a URL with a set of routes. + * + * @param string $pathinfo The path info to be parsed + * + * @return array An array of parameters + * + * @throws ResourceNotFoundException If the resource could not be found + * @throws MethodNotAllowedException If the resource was found but the request method is not allowed + * + * @api + */ + public function match($pathinfo) + { + $this->allow = array(); + + if ($ret = $this->matchCollection($pathinfo, $this->routes)) { + return $ret; + } + + throw 0 < count($this->allow) + ? new MethodNotAllowedException(array_unique(array_map('strtoupper', $this->allow))) + : new ResourceNotFoundException(); + } + + protected function matchCollection($pathinfo, RouteCollection $routes) + { + $pathinfo = urldecode($pathinfo); + + foreach ($routes as $name => $route) { + if ($route instanceof RouteCollection) { + if (false === strpos($route->getPrefix(), '{') && $route->getPrefix() !== substr($pathinfo, 0, strlen($route->getPrefix()))) { + continue; + } + + if (!$ret = $this->matchCollection($pathinfo, $route)) { + continue; + } + + return $ret; + } + + $compiledRoute = $route->compile(); + + // check the static prefix of the URL first. Only use the more expensive preg_match when it matches + if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) { + continue; + } + + if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) { + continue; + } + + // check HTTP method requirement + if ($req = $route->getRequirement('_method')) { + // HEAD and GET are equivalent as per RFC + if ('HEAD' === $method = $this->context->getMethod()) { + $method = 'GET'; + } + + if (!in_array($method, $req = explode('|', strtoupper($req)))) { + $this->allow = array_merge($this->allow, $req); + + continue; + } + } + + return array_merge($this->mergeDefaults($matches, $route->getDefaults()), array('_route' => $name)); + } + } + + protected function mergeDefaults($params, $defaults) + { + $parameters = $defaults; + foreach ($params as $key => $value) { + if (!is_int($key)) { + $parameters[$key] = rawurldecode($value); + } + } + + return $parameters; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php new file mode 100644 index 0000000000..5823d3201b --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * UrlMatcherInterface is the interface that all URL matcher classes must implement. + * + * @author Fabien Potencier + * + * @api + */ +interface UrlMatcherInterface extends RequestContextAwareInterface +{ + /** + * Tries to match a URL with a set of routes. + * + * @param string $pathinfo The path info to be parsed + * + * @return array An array of parameters + * + * @throws ResourceNotFoundException If the resource could not be found + * @throws MethodNotAllowedException If the resource was found but the request method is not allowed + * + * @api + */ + public function match($pathinfo); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/README.md b/3rdparty/symfony/routing/Symfony/Component/Routing/README.md new file mode 100644 index 0000000000..eb72334d2e --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/README.md @@ -0,0 +1,32 @@ +Routing Component +================= + +Routing associates a request with the code that will convert it to a response. + +The example below demonstrates how you can set up a fully working routing +system: + + use Symfony\Component\HttpFoundation\Request; + use Symfony\Component\Routing\Matcher\UrlMatcher; + use Symfony\Component\Routing\RequestContext; + use Symfony\Component\Routing\RouteCollection; + use Symfony\Component\Routing\Route; + + $routes = new RouteCollection(); + $routes->add('hello', new Route('/hello', array('controller' => 'foo'))); + + $context = new RequestContext(); + + // this is optional and can be done without a Request instance + $context->fromRequest(Request::createFromGlobals()); + + $matcher = new UrlMatcher($routes, $context); + + $parameters = $matcher->match('/hello'); + +Resources +--------- + +Unit tests: + +https://github.com/symfony/symfony/tree/master/tests/Symfony/Tests/Component/Routing diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContext.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContext.php new file mode 100644 index 0000000000..fef85b6bb3 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContext.php @@ -0,0 +1,250 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * Holds information about the current request. + * + * @author Fabien Potencier + * + * @api + */ +class RequestContext +{ + private $baseUrl; + private $method; + private $host; + private $scheme; + private $httpPort; + private $httpsPort; + private $parameters; + + /** + * Constructor. + * + * @param string $baseUrl The base URL + * @param string $method The HTTP method + * @param string $host The HTTP host name + * @param string $scheme The HTTP scheme + * @param integer $httpPort The HTTP port + * @param integer $httpsPort The HTTPS port + * + * @api + */ + public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443) + { + $this->baseUrl = $baseUrl; + $this->method = strtoupper($method); + $this->host = $host; + $this->scheme = strtolower($scheme); + $this->httpPort = $httpPort; + $this->httpsPort = $httpsPort; + $this->parameters = array(); + } + + /** + * Gets the base URL. + * + * @return string The base URL + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * Sets the base URL. + * + * @param string $baseUrl The base URL + * + * @api + */ + public function setBaseUrl($baseUrl) + { + $this->baseUrl = $baseUrl; + } + + /** + * Gets the HTTP method. + * + * The method is always an uppercased string. + * + * @return string The HTTP method + */ + public function getMethod() + { + return $this->method; + } + + /** + * Sets the HTTP method. + * + * @param string $method The HTTP method + * + * @api + */ + public function setMethod($method) + { + $this->method = strtoupper($method); + } + + /** + * Gets the HTTP host. + * + * @return string The HTTP host + */ + public function getHost() + { + return $this->host; + } + + /** + * Sets the HTTP host. + * + * @param string $host The HTTP host + * + * @api + */ + public function setHost($host) + { + $this->host = $host; + } + + /** + * Gets the HTTP scheme. + * + * @return string The HTTP scheme + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Sets the HTTP scheme. + * + * @param string $scheme The HTTP scheme + * + * @api + */ + public function setScheme($scheme) + { + $this->scheme = strtolower($scheme); + } + + /** + * Gets the HTTP port. + * + * @return string The HTTP port + */ + public function getHttpPort() + { + return $this->httpPort; + } + + /** + * Sets the HTTP port. + * + * @param string $httpPort The HTTP port + * + * @api + */ + public function setHttpPort($httpPort) + { + $this->httpPort = $httpPort; + } + + /** + * Gets the HTTPS port. + * + * @return string The HTTPS port + */ + public function getHttpsPort() + { + return $this->httpsPort; + } + + /** + * Sets the HTTPS port. + * + * @param string $httpsPort The HTTPS port + * + * @api + */ + public function setHttpsPort($httpsPort) + { + $this->httpsPort = $httpsPort; + } + + /** + * Returns the parameters. + * + * @return array The parameters + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Sets the parameters. + * + * This method implements a fluent interface. + * + * @param array $parameters The parameters + * + * @return Route The current Route instance + */ + public function setParameters(array $parameters) + { + $this->parameters = $parameters; + + return $this; + } + + /** + * Gets a parameter value. + * + * @param string $name A parameter name + * + * @return mixed The parameter value + */ + public function getParameter($name) + { + return isset($this->parameters[$name]) ? $this->parameters[$name] : null; + } + + /** + * Checks if a parameter value is set for the given parameter. + * + * @param string $name A parameter name + * + * @return Boolean true if the parameter value is set, false otherwise + */ + public function hasParameter($name) + { + return array_key_exists($name, $this->parameters); + } + + /** + * Sets a parameter value. + * + * @param string $name A parameter name + * @param mixed $parameter The parameter value + * + * @api + */ + public function setParameter($name, $parameter) + { + $this->parameters[$name] = $parameter; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php new file mode 100644 index 0000000000..38443a88b7 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * @api + */ +interface RequestContextAwareInterface +{ + /** + * Sets the request context. + * + * @param RequestContext $context The context + * + * @api + */ + public function setContext(RequestContext $context); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Route.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Route.php new file mode 100644 index 0000000000..548568334d --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Route.php @@ -0,0 +1,312 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * A Route describes a route and its parameters. + * + * @author Fabien Potencier + * + * @api + */ +class Route +{ + private $pattern; + private $defaults; + private $requirements; + private $options; + private $compiled; + + private static $compilers = array(); + + /** + * Constructor. + * + * Available options: + * + * * compiler_class: A class name able to compile this route instance (RouteCompiler by default) + * + * @param string $pattern The pattern to match + * @param array $defaults An array of default parameter values + * @param array $requirements An array of requirements for parameters (regexes) + * @param array $options An array of options + * + * @api + */ + public function __construct($pattern, array $defaults = array(), array $requirements = array(), array $options = array()) + { + $this->setPattern($pattern); + $this->setDefaults($defaults); + $this->setRequirements($requirements); + $this->setOptions($options); + } + + public function __clone() + { + $this->compiled = null; + } + + /** + * Returns the pattern. + * + * @return string The pattern + */ + public function getPattern() + { + return $this->pattern; + } + + /** + * Sets the pattern. + * + * This method implements a fluent interface. + * + * @param string $pattern The pattern + * + * @return Route The current Route instance + */ + public function setPattern($pattern) + { + $this->pattern = trim($pattern); + + // a route must start with a slash + if (empty($this->pattern) || '/' !== $this->pattern[0]) { + $this->pattern = '/'.$this->pattern; + } + + return $this; + } + + /** + * Returns the options. + * + * @return array The options + */ + public function getOptions() + { + return $this->options; + } + + /** + * Sets the options. + * + * This method implements a fluent interface. + * + * @param array $options The options + * + * @return Route The current Route instance + */ + public function setOptions(array $options) + { + $this->options = array_merge(array( + 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler', + ), $options); + + return $this; + } + + /** + * Sets an option value. + * + * This method implements a fluent interface. + * + * @param string $name An option name + * @param mixed $value The option value + * + * @return Route The current Route instance + * + * @api + */ + public function setOption($name, $value) + { + $this->options[$name] = $value; + + return $this; + } + + /** + * Get an option value. + * + * @param string $name An option name + * + * @return mixed The option value + */ + public function getOption($name) + { + return isset($this->options[$name]) ? $this->options[$name] : null; + } + + /** + * Returns the defaults. + * + * @return array The defaults + */ + public function getDefaults() + { + return $this->defaults; + } + + /** + * Sets the defaults. + * + * This method implements a fluent interface. + * + * @param array $defaults The defaults + * + * @return Route The current Route instance + */ + public function setDefaults(array $defaults) + { + $this->defaults = array(); + foreach ($defaults as $name => $default) { + $this->defaults[(string) $name] = $default; + } + + return $this; + } + + /** + * Gets a default value. + * + * @param string $name A variable name + * + * @return mixed The default value + */ + public function getDefault($name) + { + return isset($this->defaults[$name]) ? $this->defaults[$name] : null; + } + + /** + * Checks if a default value is set for the given variable. + * + * @param string $name A variable name + * + * @return Boolean true if the default value is set, false otherwise + */ + public function hasDefault($name) + { + return array_key_exists($name, $this->defaults); + } + + /** + * Sets a default value. + * + * @param string $name A variable name + * @param mixed $default The default value + * + * @return Route The current Route instance + * + * @api + */ + public function setDefault($name, $default) + { + $this->defaults[(string) $name] = $default; + + return $this; + } + + /** + * Returns the requirements. + * + * @return array The requirements + */ + public function getRequirements() + { + return $this->requirements; + } + + /** + * Sets the requirements. + * + * This method implements a fluent interface. + * + * @param array $requirements The requirements + * + * @return Route The current Route instance + */ + public function setRequirements(array $requirements) + { + $this->requirements = array(); + foreach ($requirements as $key => $regex) { + $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); + } + + return $this; + } + + /** + * Returns the requirement for the given key. + * + * @param string $key The key + * + * @return string The regex + */ + public function getRequirement($key) + { + return isset($this->requirements[$key]) ? $this->requirements[$key] : null; + } + + /** + * Sets a requirement for the given key. + * + * @param string $key The key + * @param string $regex The regex + * + * @return Route The current Route instance + * + * @api + */ + public function setRequirement($key, $regex) + { + $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); + + return $this; + } + + /** + * Compiles the route. + * + * @return CompiledRoute A CompiledRoute instance + */ + public function compile() + { + if (null !== $this->compiled) { + return $this->compiled; + } + + $class = $this->getOption('compiler_class'); + + if (!isset(self::$compilers[$class])) { + self::$compilers[$class] = new $class; + } + + return $this->compiled = self::$compilers[$class]->compile($this); + } + + private function sanitizeRequirement($key, $regex) + { + if (is_array($regex)) { + throw new \InvalidArgumentException(sprintf('Routing requirements must be a string, array given for "%s"', $key)); + } + + if ('^' == $regex[0]) { + $regex = substr($regex, 1); + } + + if ('$' == substr($regex, -1)) { + $regex = substr($regex, 0, -1); + } + + return $regex; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCollection.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCollection.php new file mode 100644 index 0000000000..b3289d337c --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCollection.php @@ -0,0 +1,259 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Config\Resource\ResourceInterface; + +/** + * A RouteCollection represents a set of Route instances. + * + * When adding a route, it overrides existing routes with the + * same name defined in the instance or its children and parents. + * + * @author Fabien Potencier + * + * @api + */ +class RouteCollection implements \IteratorAggregate +{ + private $routes; + private $resources; + private $prefix; + private $parent; + + /** + * Constructor. + * + * @api + */ + public function __construct() + { + $this->routes = array(); + $this->resources = array(); + $this->prefix = ''; + } + + public function __clone() + { + foreach ($this->routes as $name => $route) { + $this->routes[$name] = clone $route; + if ($route instanceof RouteCollection) { + $this->routes[$name]->setParent($this); + } + } + } + + /** + * Gets the parent RouteCollection. + * + * @return RouteCollection The parent RouteCollection + */ + public function getParent() + { + return $this->parent; + } + + /** + * Sets the parent RouteCollection. + * + * @param RouteCollection $parent The parent RouteCollection + */ + public function setParent(RouteCollection $parent) + { + $this->parent = $parent; + } + + /** + * Gets the current RouteCollection as an Iterator. + * + * @return \ArrayIterator An \ArrayIterator interface + */ + public function getIterator() + { + return new \ArrayIterator($this->routes); + } + + /** + * Adds a route. + * + * @param string $name The route name + * @param Route $route A Route instance + * + * @throws \InvalidArgumentException When route name contains non valid characters + * + * @api + */ + public function add($name, Route $route) + { + if (!preg_match('/^[a-z0-9A-Z_.]+$/', $name)) { + throw new \InvalidArgumentException(sprintf('The provided route name "%s" contains non valid characters. A route name must only contain digits (0-9), letters (a-z and A-Z), underscores (_) and dots (.).', $name)); + } + + $parent = $this; + while ($parent->getParent()) { + $parent = $parent->getParent(); + } + + if ($parent) { + $parent->remove($name); + } + + $this->routes[$name] = $route; + } + + /** + * Returns the array of routes. + * + * @return array An array of routes + */ + public function all() + { + $routes = array(); + foreach ($this->routes as $name => $route) { + if ($route instanceof RouteCollection) { + $routes = array_merge($routes, $route->all()); + } else { + $routes[$name] = $route; + } + } + + return $routes; + } + + /** + * Gets a route by name. + * + * @param string $name The route name + * + * @return Route $route A Route instance + */ + public function get($name) + { + // get the latest defined route + foreach (array_reverse($this->routes) as $routes) { + if (!$routes instanceof RouteCollection) { + continue; + } + + if (null !== $route = $routes->get($name)) { + return $route; + } + } + + if (isset($this->routes[$name])) { + return $this->routes[$name]; + } + } + + /** + * Removes a route by name. + * + * @param string $name The route name + */ + public function remove($name) + { + if (isset($this->routes[$name])) { + unset($this->routes[$name]); + } + + foreach ($this->routes as $routes) { + if ($routes instanceof RouteCollection) { + $routes->remove($name); + } + } + } + + /** + * Adds a route collection to the current set of routes (at the end of the current set). + * + * @param RouteCollection $collection A RouteCollection instance + * @param string $prefix An optional prefix to add before each pattern of the route collection + * + * @api + */ + public function addCollection(RouteCollection $collection, $prefix = '') + { + $collection->setParent($this); + $collection->addPrefix($prefix); + + // remove all routes with the same name in all existing collections + foreach (array_keys($collection->all()) as $name) { + $this->remove($name); + } + + $this->routes[] = $collection; + } + + /** + * Adds a prefix to all routes in the current set. + * + * @param string $prefix An optional prefix to add before each pattern of the route collection + * + * @api + */ + public function addPrefix($prefix) + { + // a prefix must not end with a slash + $prefix = rtrim($prefix, '/'); + + if (!$prefix) { + return; + } + + // a prefix must start with a slash + if ('/' !== $prefix[0]) { + $prefix = '/'.$prefix; + } + + $this->prefix = $prefix.$this->prefix; + + foreach ($this->routes as $name => $route) { + if ($route instanceof RouteCollection) { + $route->addPrefix($prefix); + } else { + $route->setPattern($prefix.$route->getPattern()); + } + } + } + + public function getPrefix() + { + return $this->prefix; + } + + /** + * Returns an array of resources loaded to build this collection. + * + * @return ResourceInterface[] An array of resources + */ + public function getResources() + { + $resources = $this->resources; + foreach ($this as $routes) { + if ($routes instanceof RouteCollection) { + $resources = array_merge($resources, $routes->getResources()); + } + } + + return array_unique($resources); + } + + /** + * Adds a resource for this collection. + * + * @param ResourceInterface $resource A resource instance + */ + public function addResource(ResourceInterface $resource) + { + $this->resources[] = $resource; + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompiler.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompiler.php new file mode 100644 index 0000000000..72ececc5ca --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompiler.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * RouteCompiler compiles Route instances to CompiledRoute instances. + * + * @author Fabien Potencier + */ +class RouteCompiler implements RouteCompilerInterface +{ + /** + * Compiles the current route instance. + * + * @param Route $route A Route instance + * + * @return CompiledRoute A CompiledRoute instance + */ + public function compile(Route $route) + { + $pattern = $route->getPattern(); + $len = strlen($pattern); + $tokens = array(); + $variables = array(); + $pos = 0; + preg_match_all('#.\{([\w\d_]+)\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + foreach ($matches as $match) { + if ($text = substr($pattern, $pos, $match[0][1] - $pos)) { + $tokens[] = array('text', $text); + } + $seps = array($pattern[$pos]); + $pos = $match[0][1] + strlen($match[0][0]); + $var = $match[1][0]; + + if ($req = $route->getRequirement($var)) { + $regexp = $req; + } else { + if ($pos !== $len) { + $seps[] = $pattern[$pos]; + } + $regexp = sprintf('[^%s]+?', preg_quote(implode('', array_unique($seps)), '#')); + } + + $tokens[] = array('variable', $match[0][0][0], $regexp, $var); + + if (in_array($var, $variables)) { + throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $route->getPattern(), $var)); + } + + $variables[] = $var; + } + + if ($pos < $len) { + $tokens[] = array('text', substr($pattern, $pos)); + } + + // find the first optional token + $firstOptional = INF; + for ($i = count($tokens) - 1; $i >= 0; $i--) { + $token = $tokens[$i]; + if ('variable' === $token[0] && $route->hasDefault($token[3])) { + $firstOptional = $i; + } else { + break; + } + } + + // compute the matching regexp + $regexp = ''; + for ($i = 0, $nbToken = count($tokens); $i < $nbToken; $i++) { + $regexp .= $this->computeRegexp($tokens, $i, $firstOptional); + } + + return new CompiledRoute( + $route, + 'text' === $tokens[0][0] ? $tokens[0][1] : '', + sprintf("#^%s$#s", $regexp), + array_reverse($tokens), + $variables + ); + } + + /** + * Computes the regexp used to match the token. + * + * @param array $tokens The route tokens + * @param integer $index The index of the current token + * @param integer $firstOptional The index of the first optional token + * + * @return string The regexp + */ + private function computeRegexp(array $tokens, $index, $firstOptional) + { + $token = $tokens[$index]; + if ('text' === $token[0]) { + // Text tokens + return preg_quote($token[1], '#'); + } else { + // Variable tokens + if (0 === $index && 0 === $firstOptional && 1 == count($tokens)) { + // When the only token is an optional variable token, the separator is required + return sprintf('%s(?P<%s>%s)?', preg_quote($token[1], '#'), $token[3], $token[2]); + } else { + $nbTokens = count($tokens); + $regexp = sprintf('%s(?P<%s>%s)', preg_quote($token[1], '#'), $token[3], $token[2]); + if ($index >= $firstOptional) { + // Enclose each optional tokens in a subpattern to make it optional + $regexp = "(?:$regexp"; + if ($nbTokens - 1 == $index) { + // Close the optional subpatterns + $regexp .= str_repeat(")?", $nbTokens - $firstOptional); + } + } + + return $regexp; + } + } + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php new file mode 100644 index 0000000000..5c988adafb --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * RouteCompilerInterface is the interface that all RouteCompiler classes must implements. + * + * @author Fabien Potencier + */ +interface RouteCompilerInterface +{ + /** + * Compiles the current route instance. + * + * @param Route $route A Route instance + * + * @return CompiledRoute A CompiledRoute instance + */ + public function compile(Route $route); +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/Router.php b/3rdparty/symfony/routing/Symfony/Component/Routing/Router.php new file mode 100644 index 0000000000..eadb2231e1 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/Router.php @@ -0,0 +1,263 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\Config\ConfigCache; + +/** + * The Router class is an example of the integration of all pieces of the + * routing system for easier use. + * + * @author Fabien Potencier + */ +class Router implements RouterInterface +{ + protected $matcher; + protected $generator; + protected $defaults; + protected $context; + protected $loader; + protected $collection; + protected $resource; + protected $options; + + /** + * Constructor. + * + * @param LoaderInterface $loader A LoaderInterface instance + * @param mixed $resource The main resource to load + * @param array $options An array of options + * @param RequestContext $context The context + * @param array $defaults The default values + */ + public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, array $defaults = array()) + { + $this->loader = $loader; + $this->resource = $resource; + $this->context = null === $context ? new RequestContext() : $context; + $this->defaults = $defaults; + $this->setOptions($options); + } + + /** + * Sets options. + * + * Available options: + * + * * cache_dir: The cache directory (or null to disable caching) + * * debug: Whether to enable debugging or not (false by default) + * * resource_type: Type hint for the main resource (optional) + * + * @param array $options An array of options + * + * @throws \InvalidArgumentException When unsupported option is provided + */ + public function setOptions(array $options) + { + $this->options = array( + 'cache_dir' => null, + 'debug' => false, + 'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', + 'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', + 'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper', + 'generator_cache_class' => 'ProjectUrlGenerator', + 'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', + 'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', + 'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper', + 'matcher_cache_class' => 'ProjectUrlMatcher', + 'resource_type' => null, + ); + + // check option names and live merge, if errors are encountered Exception will be thrown + $invalid = array(); + $isInvalid = false; + foreach ($options as $key => $value) { + if (array_key_exists($key, $this->options)) { + $this->options[$key] = $value; + } else { + $isInvalid = true; + $invalid[] = $key; + } + } + + if ($isInvalid) { + throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('\', \'', $invalid))); + } + } + + /** + * Sets an option. + * + * @param string $key The key + * @param mixed $value The value + * + * @throws \InvalidArgumentException + */ + public function setOption($key, $value) + { + if (!array_key_exists($key, $this->options)) { + throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); + } + + $this->options[$key] = $value; + } + + /** + * Gets an option value. + * + * @param string $key The key + * + * @return mixed The value + * + * @throws \InvalidArgumentException + */ + public function getOption($key) + { + if (!array_key_exists($key, $this->options)) { + throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); + } + + return $this->options[$key]; + } + + /** + * Gets the RouteCollection instance associated with this Router. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRouteCollection() + { + if (null === $this->collection) { + $this->collection = $this->loader->load($this->resource, $this->options['resource_type']); + } + + return $this->collection; + } + + /** + * Sets the request context. + * + * @param RequestContext $context The context + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + + $this->getMatcher()->setContext($context); + $this->getGenerator()->setContext($context); + } + + /** + * Gets the request context. + * + * @return RequestContext The context + */ + public function getContext() + { + return $this->context; + } + + /** + * Generates a URL from the given parameters. + * + * @param string $name The name of the route + * @param mixed $parameters An array of parameters + * @param Boolean $absolute Whether to generate an absolute URL + * + * @return string The generated URL + */ + public function generate($name, $parameters = array(), $absolute = false) + { + return $this->getGenerator()->generate($name, $parameters, $absolute); + } + + /** + * Tries to match a URL with a set of routes. + * + * Returns false if no route matches the URL. + * + * @param string $url URL to be parsed + * + * @return array|false An array of parameters or false if no route matches + */ + public function match($url) + { + return $this->getMatcher()->match($url); + } + + /** + * Gets the UrlMatcher instance associated with this Router. + * + * @return UrlMatcherInterface A UrlMatcherInterface instance + */ + public function getMatcher() + { + if (null !== $this->matcher) { + return $this->matcher; + } + + if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) { + return $this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context, $this->defaults); + } + + $class = $this->options['matcher_cache_class']; + $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']); + if (!$cache->isFresh($class)) { + $dumper = new $this->options['matcher_dumper_class']($this->getRouteCollection()); + + $options = array( + 'class' => $class, + 'base_class' => $this->options['matcher_base_class'], + ); + + $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources()); + } + + require_once $cache; + + return $this->matcher = new $class($this->context, $this->defaults); + } + + /** + * Gets the UrlGenerator instance associated with this Router. + * + * @return UrlGeneratorInterface A UrlGeneratorInterface instance + */ + public function getGenerator() + { + if (null !== $this->generator) { + return $this->generator; + } + + if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) { + return $this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->defaults); + } + + $class = $this->options['generator_cache_class']; + $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']); + if (!$cache->isFresh($class)) { + $dumper = new $this->options['generator_dumper_class']($this->getRouteCollection()); + + $options = array( + 'class' => $class, + 'base_class' => $this->options['generator_base_class'], + ); + + $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources()); + } + + require_once $cache; + + return $this->generator = new $class($this->context, $this->defaults); + } +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/RouterInterface.php b/3rdparty/symfony/routing/Symfony/Component/Routing/RouterInterface.php new file mode 100644 index 0000000000..961342bf09 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/RouterInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Routing\Matcher\UrlMatcherInterface; + +/** + * RouterInterface is the interface that all Router classes must implements. + * + * This interface is the concatenation of UrlMatcherInterface and UrlGeneratorInterface. + * + * @author Fabien Potencier + */ +interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface +{ +} diff --git a/3rdparty/symfony/routing/Symfony/Component/Routing/composer.json b/3rdparty/symfony/routing/Symfony/Component/Routing/composer.json new file mode 100644 index 0000000000..8d29398b24 --- /dev/null +++ b/3rdparty/symfony/routing/Symfony/Component/Routing/composer.json @@ -0,0 +1,29 @@ +{ + "name": "symfony/routing", + "type": "library", + "description": "Symfony Routing Component", + "keywords": [], + "homepage": "http://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.2" + }, + "suggest": { + "symfony/config": "self.version", + "symfony/yaml": "self.version" + }, + "autoload": { + "psr-0": { "Symfony\\Component\\Routing": "" } + }, + "target-dir": "Symfony/Component/Routing" +} diff --git a/composer.json b/composer.json deleted file mode 100644 index 7916b15cb9..0000000000 --- a/composer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "description": "ownCloud gives you universal access to your files/contacts/calendar through a web interface or WebDAV.", - "homepage": "http://owncloud.org", - "license": "AGPL-3.0+", - "support": { - "email": "owncloud@kde.org", - "irc": "irc://irc.freenode.org/owncloud", - "forum": "http://forum.owncloud.org/", - "issues": "https://github.com/owncloud/core/issues" - }, - "require": { - "php": ">=5.3.2", - "symfony/routing": "2.0.*" - }, - "config": { - "vendor-dir": "3rdparty" - } -} From f151376ad5beff46043645578add910b7e98a0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Sat, 27 Oct 2012 17:05:00 +0200 Subject: [PATCH 072/481] remove remaining line from merge conflict --- apps/files_versions/lib/versions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 56664427fb..2f27cd0e66 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -275,5 +275,4 @@ class Storage { $view = \OCP\Files::getStorage('files_versions'); return $view->deleteAll('', true); } -} ->>>>>>> 12ea922... fix broken paths in versions app +} From d6953fa5ed796699d82b82473317b700dfbcfa72 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 17:44:47 +0200 Subject: [PATCH 073/481] Remove wrongly committed files --- apps/files/templates/index.php_orig | 90 ----------------------------- apps/files/templates/index.php_test | 90 ----------------------------- 2 files changed, 180 deletions(-) delete mode 100644 apps/files/templates/index.php_orig delete mode 100644 apps/files/templates/index.php_test diff --git a/apps/files/templates/index.php_orig b/apps/files/templates/index.php_orig deleted file mode 100644 index aff484f0a7..0000000000 --- a/apps/files/templates/index.php_orig +++ /dev/null @@ -1,90 +0,0 @@ - -

    - - -
    -
    - t('New');?> - -
    -
    - - - - - - - - - -
    -
    -
    - -
    - -
    -
    - - - - -
    -
    - - -
    t('Nothing in here. Upload something!')?>
    - - - - - - - - - - - - - -
    - - t( 'Name' ); ?> - - - - Download" /> t('Download')?> - - - t( 'Size' ); ?> - t( 'Modified' ); ?> - - - - t('Unshare')?> <?php echo $l->t('Unshare')?>" /> - - t('Delete')?> <?php echo $l->t('Delete')?>" /> - - -
    -
    -
    -

    - t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?> -

    -
    -
    -

    - t('Files are being scanned, please wait.');?> -

    -

    - t('Current scanning');?> -

    -
    - - - diff --git a/apps/files/templates/index.php_test b/apps/files/templates/index.php_test deleted file mode 100644 index a509333aa4..0000000000 --- a/apps/files/templates/index.php_test +++ /dev/null @@ -1,90 +0,0 @@ - -
    - - -
    -
    - t('New');?> - -
    -
    -
    - - - - - - - -
    -
    -
    -
    - -
    - -
    -
    - - - - -
    -
    - - -
    t('Nothing in here. Upload something!')?>
    - - - - - - - - - - - - - -
    - - t( 'Name' ); ?> - - - - Download" /> t('Download')?> - - - t( 'Size' ); ?> - t( 'Modified' ); ?> - - - - t('Unshare')?> <?php echo $l->t('Unshare')?>" /> - - t('Delete')?> <?php echo $l->t('Delete')?>" /> - - -
    -
    -
    -

    - t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?> -

    -
    -
    -

    - t('Files are being scanned, please wait.');?> -

    -

    - t('Current scanning');?> -

    -
    - - - From fecfeac55d762ec80c9305b55e7140588bfe5dd5 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 17:45:09 +0200 Subject: [PATCH 074/481] Fix introduced style errors --- core/lostpassword/controller.php | 12 ++++--- core/routes.php | 2 +- lib/base.php | 3 +- lib/ocs.php | 61 +++++++++++++++++--------------- lib/route.php | 6 +++- lib/router.php | 8 ++--- 6 files changed, 52 insertions(+), 40 deletions(-) diff --git a/core/lostpassword/controller.php b/core/lostpassword/controller.php index e616fe7dff..523520dc75 100644 --- a/core/lostpassword/controller.php +++ b/core/lostpassword/controller.php @@ -8,14 +8,16 @@ class OC_Core_LostPassword_Controller { protected static function displayLostPasswordPage($error, $requested) { - OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => $error, 'requested' => $requested)); + OC_Template::printGuestPage('core/lostpassword', 'lostpassword', + array('error' => $error, 'requested' => $requested)); } protected static function displayResetPasswordPage($success, $args) { $route_args = array(); $route_args['token'] = $args['token']; $route_args['user'] = $args['user']; - OC_Template::printGuestPage('core/lostpassword', 'resetpassword', array('success' => $success, 'args' => $route_args)); + OC_Template::printGuestPage('core/lostpassword', 'resetpassword', + array('success' => $success, 'args' => $route_args)); } protected static function checkToken($user, $token) { @@ -29,10 +31,12 @@ class OC_Core_LostPassword_Controller { public static function sendEmail($args) { if (OC_User::userExists($_POST['user'])) { $token = hash('sha256', OC_Util::generate_random_bytes(30).OC_Config::getValue('passwordsalt', '')); - OC_Preferences::setValue($_POST['user'], 'owncloud', 'lostpassword', hash('sha256', $token)); // Hash the token again to prevent timing attacks + OC_Preferences::setValue($_POST['user'], 'owncloud', 'lostpassword', + hash('sha256', $token)); // Hash the token again to prevent timing attacks $email = OC_Preferences::getValue($_POST['user'], 'settings', 'email', ''); if (!empty($email)) { - $link = OC_Helper::linkToRoute('core_lostpassword_reset', array('user' => $_POST['user'], 'token' => $token)); + $link = OC_Helper::linkToRoute('core_lostpassword_reset', + array('user' => $_POST['user'], 'token' => $token)); $link = OC_Helper::makeURLAbsolute($link); $tmpl = new OC_Template('core/lostpassword', 'email'); diff --git a/core/routes.php b/core/routes.php index 7cf2749884..186fa8ae56 100644 --- a/core/routes.php +++ b/core/routes.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -require_once('settings/routes.php'); +require_once 'settings/routes.php'; // Core ajax actions // AppConfig diff --git a/lib/base.php b/lib/base.php index f810b1f186..d7d5eef325 100644 --- a/lib/base.php +++ b/lib/base.php @@ -516,7 +516,8 @@ class OC{ } $file_ext = substr($param['file'], -3); if ($file_ext != 'php' - || !self::loadAppScriptFile($param)) { + || !self::loadAppScriptFile($param)) + { header('HTTP/1.0 404 Not Found'); } } diff --git a/lib/ocs.php b/lib/ocs.php index 60577ec5d5..1a0abf0e36 100644 --- a/lib/ocs.php +++ b/lib/ocs.php @@ -111,8 +111,8 @@ class OC_OCS { $format = $parameters['format']; $login = OC_OCS::readData('post', 'login', 'text'); $passwd = OC_OCS::readData('post', 'password', 'text'); - OC_OCS::personCheck($format,$login,$passwd); - }) + OC_OCS::personCheck($format, $login, $passwd); + }) ->requirements(array('format'=>'xml|json')); // ACTIVITY @@ -125,7 +125,7 @@ class OC_OCS { $pagesize = OC_OCS::readData('get', 'pagesize', 'int', 10); if($pagesize<1 or $pagesize>100) $pagesize=10; OC_OCS::activityGet($format, $page, $pagesize); - }) + }) ->requirements(array('format'=>'xml|json')); // activityput - POST ACTIVITY $router->create('activity_put', '/activity.{format}') @@ -134,8 +134,8 @@ class OC_OCS { ->action(function ($parameters) { $format = $parameters['format']; $message = OC_OCS::readData('post', 'message', 'text'); - OC_OCS::activityPut($format,$message); - }) + OC_OCS::activityPut($format, $message); + }) ->requirements(array('format'=>'xml|json')); // PRIVATEDATA @@ -148,7 +148,7 @@ class OC_OCS { $app = addslashes(strip_tags($parameters['app'])); $key = addslashes(strip_tags($parameters['key'])); OC_OCS::privateDataGet($format, $app, $key); - }) + }) ->requirements(array('format'=>'xml|json')); // set - POST DATA $router->create('privatedata_set', @@ -161,7 +161,7 @@ class OC_OCS { $key = addslashes(strip_tags($parameters['key'])); $value=OC_OCS::readData('post', 'value', 'text'); OC_OCS::privateDataSet($format, $app, $key, $value); - }) + }) ->requirements(array('format'=>'xml|json')); // delete - POST DATA $router->create('privatedata_delete', @@ -173,7 +173,7 @@ class OC_OCS { $app = addslashes(strip_tags($parameters['app'])); $key = addslashes(strip_tags($parameters['key'])); OC_OCS::privateDataDelete($format, $app, $key); - }) + }) ->requirements(array('format'=>'xml|json')); // CLOUD @@ -184,7 +184,7 @@ class OC_OCS { ->action(function ($parameters) { $format = $parameters['format']; OC_OCS::systemwebapps($format); - }) + }) ->requirements(array('format'=>'xml|json')); // quotaget @@ -195,7 +195,7 @@ class OC_OCS { $format = $parameters['format']; $user = $parameters['user']; OC_OCS::quotaGet($format, $user); - }) + }) ->requirements(array('format'=>'xml|json')); // quotaset $router->create('quota_set', @@ -207,7 +207,7 @@ class OC_OCS { $user = $parameters['user']; $quota = self::readData('post', 'quota', 'int'); OC_OCS::quotaSet($format, $user, $quota); - }) + }) ->requirements(array('format'=>'xml|json')); // keygetpublic @@ -217,8 +217,8 @@ class OC_OCS { ->action(function ($parameters) { $format = $parameters['format']; $user = $parameters['user']; - OC_OCS::publicKeyGet($format,$user); - }) + OC_OCS::publicKeyGet($format, $user); + }) ->requirements(array('format'=>'xml|json')); // keygetprivate @@ -228,8 +228,8 @@ class OC_OCS { ->action(function ($parameters) { $format = $parameters['format']; $user = $parameters['user']; - OC_OCS::privateKeyGet($format,$user); - }) + OC_OCS::privateKeyGet($format, $user); + }) ->requirements(array('format'=>'xml|json')); @@ -247,7 +247,10 @@ class OC_OCS { try { $router->match($_SERVER['PATH_INFO']); } catch (ResourceNotFoundException $e) { - $txt='Invalid query, please check the syntax. API specifications are here: http://www.freedesktop.org/wiki/Specifications/open-collaboration-services. DEBUG OUTPUT:'."\n"; + $txt='Invalid query, please check the syntax. ' + .'API specifications are here: ' + .'http://www.freedesktop.org/wiki/Specifications/open-collaboration-services.' + .'DEBUG OUTPUT:'."\n"; $txt.=OC_OCS::getdebugoutput(); echo(OC_OCS::generatexml($format, 'failed', 999, $txt)); } catch (MethodNotAllowedException $e) { @@ -323,7 +326,7 @@ class OC_OCS { * @param int $itemsperpage * @return string xml/json */ - private static function generateXml($format,$status,$statuscode,$message,$data=array(),$tag='',$tagattribute='',$dimension=-1,$itemscount='',$itemsperpage='') { + private static function generateXml($format, $status, $statuscode, $message, $data=array(), $tag='', $tagattribute='', $dimension=-1, $itemscount='', $itemsperpage='') { if($format=='json') { $json=array(); $json['status']=$status; @@ -343,7 +346,7 @@ class OC_OCS { xmlwriter_write_element($writer, 'status', $status); xmlwriter_write_element($writer, 'statuscode', $statuscode); xmlwriter_write_element($writer, 'message', $message); - if($itemscount<>'') xmlwriter_write_element($writer,'totalitems',$itemscount); + if($itemscount<>'') xmlwriter_write_element($writer, 'totalitems', $itemscount); if(!empty($itemsperpage)) xmlwriter_write_element($writer, 'itemsperpage', $itemsperpage); xmlwriter_end_element($writer); if($dimension=='0') { @@ -358,7 +361,7 @@ class OC_OCS { xmlwriter_end_element($writer); }elseif($dimension=='2') { - xmlwriter_start_element($writer,'data'); + xmlwriter_start_element($writer, 'data'); foreach($data as $entry) { xmlwriter_start_element($writer, $tag); if(!empty($tagattribute)) { @@ -413,14 +416,14 @@ class OC_OCS { } } - public static function toXml($writer,$data,$node) { + public static function toXml($writer, $data, $node) { foreach($data as $key => $value) { if (is_numeric($key)) { $key = $node; } if (is_array($value)) { xmlwriter_start_element($writer, $key); - OC_OCS::toxml($writer,$value, $node); + OC_OCS::toxml($writer, $value, $node); xmlwriter_end_element($writer); }else{ xmlwriter_write_element($writer, $key, $value); @@ -453,7 +456,7 @@ class OC_OCS { * @param string $passwd * @return string xml/json */ - private static function personCheck($format,$login,$passwd) { + private static function personCheck($format, $login, $passwd) { if($login<>'') { if(OC_User::login($login, $passwd)) { $xml['person']['personid']=$login; @@ -480,7 +483,7 @@ class OC_OCS { //TODO - $txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'activity', 'full', 2, $totalcount,$pagesize); + $txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'activity', 'full', 2, $totalcount, $pagesize); echo($txt); } @@ -490,7 +493,7 @@ class OC_OCS { * @param string $message * @return string xml/json */ - private static function activityPut($format,$message) { + private static function activityPut($format, $message) { // not implemented in ownCloud $user=OC_OCS::checkpassword(); echo(OC_OCS::generatexml($format, 'ok', 100, '')); @@ -621,7 +624,7 @@ class OC_OCS { foreach($apps as $app) { $info=OC_App::getAppInfo($app); if(isset($info['standalone'])) { - $newvalue=array('name'=>$info['name'],'url'=>OC_Helper::linkToAbsolute($app,''),'icon'=>''); + $newvalue=array('name'=>$info['name'], 'url'=>OC_Helper::linkToAbsolute($app, ''), 'icon'=>''); $values[]=$newvalue; } @@ -638,7 +641,7 @@ class OC_OCS { * @param string $user * @return string xml/json */ - private static function quotaGet($format,$user) { + private static function quotaGet($format, $user) { $login=OC_OCS::checkpassword(); if(OC_Group::inGroup($login, 'admin') or ($login==$user)) { @@ -677,7 +680,7 @@ class OC_OCS { * @param string $quota * @return string xml/json */ - private static function quotaSet($format,$user,$quota) { + private static function quotaSet($format, $user, $quota) { $login=OC_OCS::checkpassword(); if(OC_Group::inGroup($login, 'admin')) { @@ -700,7 +703,7 @@ class OC_OCS { * @param string $user * @return string xml/json */ - private static function publicKeyGet($format,$user) { + private static function publicKeyGet($format, $user) { $login=OC_OCS::checkpassword(); if(OC_User::userExists($user)) { @@ -718,7 +721,7 @@ class OC_OCS { * @param string $user * @return string xml/json */ - private static function privateKeyGet($format,$user) { + private static function privateKeyGet($format, $user) { $login=OC_OCS::checkpassword(); if(OC_Group::inGroup($login, 'admin') or ($login==$user)) { diff --git a/lib/route.php b/lib/route.php index 89af829d3d..d5233d7986 100644 --- a/lib/route.php +++ b/lib/route.php @@ -106,7 +106,11 @@ class OC_Route extends Route { * @param $file */ public function actionInclude($file) { - $function = create_function('$param', 'unset($param["_route"]);$_GET=array_merge($_GET,$param);unset($param);require_once "'.$file.'";'); + $function = create_function('$param', + 'unset($param["_route"]);' + .'$_GET=array_merge($_GET,$param);' + .'unset($param);' + .'require_once "'.$file.'";'); $this->action($function); } } diff --git a/lib/router.php b/lib/router.php index a471a06802..d5adb72055 100644 --- a/lib/router.php +++ b/lib/router.php @@ -35,9 +35,9 @@ class OC_Router { public function loadRoutes() { foreach(OC_APP::getEnabledApps() as $app){ $file = OC_App::getAppPath($app).'/appinfo/routes.php'; - if(file_exists($file)){ + if(file_exists($file)) { $this->useCollection($app); - require_once($file); + require_once $file; $collection = $this->getCollection($app); $this->root->addCollection($collection, '/apps/'.$app); } @@ -81,7 +81,7 @@ class OC_Router { * * @param string $url The url to find */ - public function match($url) { + public function match($url) { $matcher = new UrlMatcher($this->root, $this->context); $parameters = $matcher->match($url); if (isset($parameters['action'])) { @@ -93,7 +93,7 @@ class OC_Router { unset($parameters['action']); call_user_func($action, $parameters); } elseif (isset($parameters['file'])) { - include ($parameters['file']); + include $parameters['file']; } else { throw new Exception('no action available'); } From b942c1253e5d9acb0a7e3fdbbc3df21246f27f2c Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 14:40:13 +0200 Subject: [PATCH 075/481] remove TODO comment, it's done --- apps/user_ldap/lib/access.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index d343945149..82a375b50e 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -526,7 +526,6 @@ abstract class Access { return; } //if count is bigger, then the server does not support paged search. Instead, he did a normal search. We set a flag here, so the callee knows how to deal with it. - //TODO: Instead, slice findings or selection later if($findings['count'] <= $limit) { $this->pagedSearchedSuccessful = true; } From 246221a677373d5ab709395e6f4e08576a3118a8 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 24 Oct 2012 18:24:06 +0200 Subject: [PATCH 076/481] LDAP: fix again proper check if groups are enabled --- apps/user_ldap/group_ldap.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index f1411782ad..2aaabc2ab1 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -28,7 +28,9 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface { public function setConnector(lib\Connection &$connection) { parent::setConnector($connection); - if(!empty($this->connection->ldapGroupFilter) && !empty($this->connection->ldapGroupMemberAssocAttr)) { + $filter = $this->connection->ldapGroupFilter; + $gassoc = $this->connection->ldapGroupMemberAssocAttr; + if(!empty($filter) && !empty($gassoc)) { $this->enabled = true; } } From 977c4d184402fee27e262dffa00a7ea32ba5fe2c Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 14:55:17 +0200 Subject: [PATCH 077/481] LDAP: use the correct attribute in filter --- apps/user_ldap/user_ldap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 916d3f1d46..2b78919801 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -116,7 +116,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface { $search = empty($search) ? '*' : '*'.$search.'*'; $filter = $this->combineFilterWithAnd(array( $this->connection->ldapUserFilter, - $this->connection->ldapGroupDisplayName.'='.$search + $this->connection->ldapUserDisplayName.'='.$search )); \OCP\Util::writeLog('user_ldap', 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter, \OCP\Util::DEBUG); From a053da58ce1c29071654814ce32d083b054ea542 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 17:32:55 +0200 Subject: [PATCH 078/481] LDAP: be careful which limit is send to possible paged LDAP search --- apps/user_ldap/user_ldap.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 2b78919801..69e470c78a 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -112,7 +112,10 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface { return $ldap_users; } - //prepare search filter + // if we'd pass -1 to LDAP search, we'd end up in a Protocol error. With a limit of 0, we get 0 results. So we pass null. + if($limit <= 0) { + $limit = null; + } $search = empty($search) ? '*' : '*'.$search.'*'; $filter = $this->combineFilterWithAnd(array( $this->connection->ldapUserFilter, From 33aa630af3cedf146b1c51575200f8a723ae1fa3 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 17:35:39 +0200 Subject: [PATCH 079/481] LDAP: add error handling for failed searches --- apps/user_ldap/lib/access.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 82a375b50e..fa8546f1ce 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -515,6 +515,11 @@ abstract class Access { $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset); $sr = ldap_search($link_resource, $base, $filter, $attr); + if(!$sr) { + \OCP\Util::writeLog('user_ldap', 'Error when searching: '.ldap_error($link_resource).' code '.ldap_errno($link_resource), \OCP\Util::ERROR); + \OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR); + return array(); + } $findings = ldap_get_entries($link_resource, $sr ); if($pagedSearchOK) { \OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO); From 5b3c9518dc2e41c2da314c183678e03f799c2415 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 17:36:08 +0200 Subject: [PATCH 080/481] LDAP: improve slicing --- apps/user_ldap/lib/access.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index fa8546f1ce..9b870a8c6d 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -585,10 +585,14 @@ abstract class Access { } $findings = $selection; } - if(!$this->pagedSearchedSuccessful + //we slice the findings, when + //a) paged search insuccessful, though attempted + //b) no paged search, but limit set + if((!$this->pagedSearchedSuccessful + && $pagedSearchOK) || ( - !is_null($limit) - || !is_null($offset) + !$pagedSearchOK + && !is_null($limit) ) ) { $findings = array_slice($findings, intval($offset), $limit); @@ -775,6 +779,7 @@ abstract class Access { $pagedSearchOK = false; if($this->connection->hasPagedResultSupport && !is_null($limit)) { $offset = intval($offset); //can be null + \OCP\Util::writeLog('user_ldap', 'initializing paged search for Filter'.$filter.' base '.$base.' attr '.print_r($attr, true). ' limit ' .$limit.' offset '.$offset, \OCP\Util::DEBUG); //get the cookie from the search for the previous search, required by LDAP $cookie = $this->getPagedResultCookie($filter, $limit, $offset); if(empty($cookie) && ($offset > 0)) { From 1b2279c9353f189a5a10d632be5691e147230212 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 17:36:55 +0200 Subject: [PATCH 081/481] LDAP: getGroups to use paged searches --- apps/user_ldap/group_ldap.php | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 2aaabc2ab1..dafe2c0c31 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -206,22 +206,30 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface { if(!$this->enabled) { return array(); } + $cachekey = 'getGroups-'.$search.'-'.$limit.'-'.$offset; - if($this->connection->isCached('getGroups')) { - $ldap_groups = $this->connection->getFromCache('getGroups'); - } else { - $ldap_groups = $this->fetchListOfGroups($this->connection->ldapGroupFilter, array($this->connection->ldapGroupDisplayName, 'dn')); - $ldap_groups = $this->ownCloudGroupNames($ldap_groups); - $this->connection->writeToCache('getGroups', $ldap_groups); + //Check cache before driving unnecessary searches + \OCP\Util::writeLog('user_ldap', 'getGroups '.$cachekey, \OCP\Util::DEBUG); + $ldap_groups = $this->connection->getFromCache($cachekey); + if(!is_null($ldap_groups)) { + return $ldap_groups; } - $this->groupSearch = $search; - if(!empty($this->groupSearch)) { - $ldap_groups = array_filter($ldap_groups, array($this, 'groupMatchesFilter')); - } - if($limit = -1) { + + // if we'd pass -1 to LDAP search, we'd end up in a Protocol error. With a limit of 0, we get 0 results. So we pass null. + if($limit <= 0) { $limit = null; } - return array_slice($ldap_groups, $offset, $limit); + $search = empty($search) ? '*' : '*'.$search.'*'; + $filter = $this->combineFilterWithAnd(array( + $this->connection->ldapGroupFilter, + $this->connection->ldapGroupDisplayName.'='.$search + )); + \OCP\Util::writeLog('user_ldap', 'getGroups Filter '.$filter, \OCP\Util::DEBUG); + $ldap_groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName, 'dn'), $limit, $offset); + $ldap_groups = $this->ownCloudGroupNames($ldap_groups); + + $this->connection->writeToCache($cachekey, $ldap_groups); + return $ldap_groups; } public function groupMatchesFilter($group) { From b390da3eba41f31c20f7c0f2925dedc840343290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 27 Oct 2012 19:36:24 +0200 Subject: [PATCH 082/481] don't enable apps twice --- tests/enable_all.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/enable_all.php b/tests/enable_all.php index 02e35518d6..74145e55e1 100644 --- a/tests/enable_all.php +++ b/tests/enable_all.php @@ -15,6 +15,4 @@ OC_App::enable('mozilla_sync'); OC_App::enable('news'); OC_App::enable('provisioning_api'); OC_App::enable('user_external'); -OC_App::enable('provisioning_api'); -OC_App::enable('provisioning_api'); From 3f85432df9d269908fc1bea66133246d4efce656 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 19:15:13 +0200 Subject: [PATCH 083/481] LDAP: make filter in readAttribute configurable --- apps/user_ldap/lib/access.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 9b870a8c6d..f1e2143cfa 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -44,7 +44,7 @@ abstract class Access { * * Reads an attribute from an LDAP entry */ - public function readAttribute($dn, $attr) { + public function readAttribute($dn, $attr, $filter = 'objectClass=*') { if(!$this->checkConnection()) { \OCP\Util::writeLog('user_ldap', 'No LDAP Connector assigned, access impossible for readAttribute.', \OCP\Util::WARN); return false; @@ -55,13 +55,17 @@ abstract class Access { \OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG); return false; } - $rr = @ldap_read($cr, $dn, 'objectClass=*', array($attr)); + $rr = @ldap_read($cr, $dn, $filter, array($attr)); if(!is_resource($rr)) { \OCP\Util::writeLog('user_ldap', 'readAttribute '.$attr.' failed for DN '.$dn, \OCP\Util::DEBUG); //in case an error occurs , e.g. object does not exist return false; } $er = ldap_first_entry($cr, $rr); + if(!is_resource($er)) { + //did not match the filter, return false + return false; + } //LDAP attributes are not case sensitive $result = \OCP\Util::mb_array_change_key_case(ldap_get_attributes($cr, $er), MB_CASE_LOWER, 'UTF-8'); $attr = mb_strtolower($attr, 'UTF-8'); From 58828d205facd67ba953eb9b7846ef27bede2d55 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 27 Oct 2012 19:42:50 +0200 Subject: [PATCH 084/481] LDAP: usersInGroup now also does LDAP serverside search. --- apps/user_ldap/group_ldap.php | 71 ++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index dafe2c0c31..6c6cc5679b 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -139,61 +139,72 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface { if(!$this->enabled) { return array(); } - $this->groupSearch = $search; - if($this->connection->isCached('usersInGroup'.$gid)) { - $groupUsers = $this->connection->getFromCache('usersInGroup'.$gid); - if(!empty($this->groupSearch)) { - $groupUsers = array_filter($groupUsers, array($this, 'groupMatchesFilter')); - } - if($limit == -1) { - $limit = null; - } - return array_slice($groupUsers, $offset, $limit); + $cachekey = 'usersInGroup-'.$gid.'-'.$search.'-'.$limit.'-'.$offset; + // check for cache of the exact query + $groupUsers = $this->connection->getFromCache($cachekey); + if(!is_null($groupUsers)) { + return $groupUsers; } + // check for cache of the query without limit and offset + $groupUsers = $this->connection->getFromCache('usersInGroup-'.$gid.'-'.$search); + if(!is_null($groupUsers)) { + $groupUsers = array_slice($groupUsers, $offset, $limit); + $this->connection->writeToCache($cachekey, $groupUsers); + return $groupUsers; + } + + if($limit == -1) { + $limit = null; + } $groupDN = $this->groupname2dn($gid); if(!$groupDN) { - $this->connection->writeToCache('usersInGroup'.$gid, array()); + // group couldn't be found, return empty resultset + $this->connection->writeToCache($cachekey, array()); return array(); } $members = $this->readAttribute($groupDN, $this->connection->ldapGroupMemberAssocAttr); if(!$members) { - $this->connection->writeToCache('usersInGroup'.$gid, array()); + //in case users could not be retrieved, return empty resultset + $this->connection->writeToCache($cachekey, array()); return array(); } - $result = array(); + $search = empty($search) ? '*' : '*'.$search.'*'; + $groupUsers = array(); $isMemberUid = (strtolower($this->connection->ldapGroupMemberAssocAttr) == 'memberuid'); foreach($members as $member) { if($isMemberUid) { - $filter = \OCP\Util::mb_str_replace('%uid', $member, $this->connection->ldapLoginFilter, 'UTF-8'); + //we got uids, need to get their DNs to 'tranlsate' them to usernames + $filter = $this->combineFilterWithAnd(array( + \OCP\Util::mb_str_replace('%uid', $member, $this->connection>ldapLoginFilter, 'UTF-8'), + $this->connection->ldapUserDisplayName.'='.$search + )); $ldap_users = $this->fetchListOfUsers($filter, 'dn'); if(count($ldap_users) < 1) { continue; } - $result[] = $this->dn2username($ldap_users[0]); - continue; + $groupUsers[] = $this->dn2username($ldap_users[0]); } else { + //we got DNs, check if we need to filter by search or we can give back all of them + if($search != '*') { + if(!$this->readAttribute($member, $this->connection->ldapUserDisplayName, $this->connection->ldapUserDisplayName.'='.$search)) { + continue; + } + } + // dn2username will also check if the users belong to the allowed base if($ocname = $this->dn2username($member)) { - $result[] = $ocname; + $groupUsers[] = $ocname; } } } - if(!$isMemberUid) { - $result = array_intersect($result, \OCP\User::getUsers()); - } - $groupUsers = array_unique($result, SORT_LOCALE_STRING); - $this->connection->writeToCache('usersInGroup'.$gid, $groupUsers); - - if(!empty($this->groupSearch)) { - $groupUsers = array_filter($groupUsers, array($this, 'groupMatchesFilter')); - } - if($limit == -1) { - $limit = null; - } - return array_slice($groupUsers, $offset, $limit); + natsort($groupUsers); + $this->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers); + $groupUsers = array_slice($groupUsers, $offset, $limit); + $this->connection->writeToCache($cachekey, $groupUsers); + return $groupUsers; } /** From 6f5d0ec9a9deaa0894161e001fd34baecf57f131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 27 Oct 2012 19:44:18 +0200 Subject: [PATCH 085/481] don't enable user_external --- tests/enable_all.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/enable_all.php b/tests/enable_all.php index 74145e55e1..0ea8d231ce 100644 --- a/tests/enable_all.php +++ b/tests/enable_all.php @@ -14,5 +14,5 @@ OC_App::enable('files_archive'); OC_App::enable('mozilla_sync'); OC_App::enable('news'); OC_App::enable('provisioning_api'); -OC_App::enable('user_external'); +#OC_App::enable('user_external'); From fefc4e17074b96ef944716ae7a6850fbfe76e55d Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Sat, 27 Oct 2012 17:25:10 -0400 Subject: [PATCH 086/481] Load all apps in core share ajax file for apps to register their share backends --- core/ajax/share.php | 1 + 1 file changed, 1 insertion(+) diff --git a/core/ajax/share.php b/core/ajax/share.php index 0fa162fb37..efe01dff88 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -21,6 +21,7 @@ OC_JSON::checkLoggedIn(); OCP\JSON::callCheck(); +OC_App::loadApps(); if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) { switch ($_POST['action']) { From 1a08ef6a0649727d4b835c001de96a407162c479 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 28 Oct 2012 00:02:29 +0200 Subject: [PATCH 087/481] [tx-robot] updated from transifex --- apps/files_external/l10n/nl.php | 4 +- apps/files_versions/l10n/nl.php | 2 +- core/l10n/ar.php | 4 +- core/l10n/bg_BG.php | 2 - core/l10n/ca.php | 4 +- core/l10n/cs_CZ.php | 4 +- core/l10n/da.php | 4 +- core/l10n/de.php | 4 +- core/l10n/de_DE.php | 6 +-- core/l10n/el.php | 4 +- core/l10n/eo.php | 4 +- core/l10n/es.php | 4 +- core/l10n/es_AR.php | 2 - core/l10n/et_EE.php | 4 +- core/l10n/eu.php | 4 +- core/l10n/fa.php | 4 +- core/l10n/fi_FI.php | 4 +- core/l10n/fr.php | 4 +- core/l10n/gl.php | 4 +- core/l10n/he.php | 4 +- core/l10n/hr.php | 4 +- core/l10n/hu_HU.php | 4 +- core/l10n/ia.php | 4 +- core/l10n/id.php | 4 +- core/l10n/it.php | 4 +- core/l10n/ja_JP.php | 4 +- core/l10n/ka_GE.php | 4 +- core/l10n/ko.php | 4 +- core/l10n/lb.php | 4 +- core/l10n/lt_LT.php | 4 +- core/l10n/lv.php | 2 - core/l10n/mk.php | 4 +- core/l10n/ms_MY.php | 4 +- core/l10n/nb_NO.php | 4 +- core/l10n/nl.php | 4 +- core/l10n/nn_NO.php | 4 +- core/l10n/oc.php | 4 +- core/l10n/pl.php | 4 +- core/l10n/pt_BR.php | 4 +- core/l10n/pt_PT.php | 2 - core/l10n/ro.php | 4 +- core/l10n/ru.php | 4 +- core/l10n/ru_RU.php | 4 +- core/l10n/si_LK.php | 2 +- core/l10n/sk_SK.php | 2 - core/l10n/sl.php | 4 +- core/l10n/sr.php | 4 +- core/l10n/sr@latin.php | 2 - core/l10n/sv.php | 4 +- core/l10n/ta_LK.php | 4 +- core/l10n/th_TH.php | 4 +- core/l10n/tr.php | 4 +- core/l10n/uk.php | 2 +- core/l10n/vi.php | 2 - core/l10n/zh_CN.GB2312.php | 4 +- core/l10n/zh_CN.php | 2 - core/l10n/zh_TW.php | 4 +- l10n/ar/core.po | 68 ++++++++++++++-------------- l10n/bg_BG/core.po | 68 ++++++++++++++-------------- l10n/ca/core.po | 68 ++++++++++++++-------------- l10n/cs_CZ/core.po | 68 ++++++++++++++-------------- l10n/da/core.po | 68 ++++++++++++++-------------- l10n/de/core.po | 68 ++++++++++++++-------------- l10n/de_DE/core.po | 70 ++++++++++++++--------------- l10n/de_DE/settings.po | 60 ++++++++++++------------- l10n/el/core.po | 68 ++++++++++++++-------------- l10n/eo/core.po | 68 ++++++++++++++-------------- l10n/es/core.po | 68 ++++++++++++++-------------- l10n/es/lib.po | 9 ++-- l10n/es_AR/core.po | 24 +++++----- l10n/et_EE/core.po | 68 ++++++++++++++-------------- l10n/eu/core.po | 68 ++++++++++++++-------------- l10n/fa/core.po | 68 ++++++++++++++-------------- l10n/fi_FI/core.po | 68 ++++++++++++++-------------- l10n/fr/core.po | 68 ++++++++++++++-------------- l10n/gl/core.po | 68 ++++++++++++++-------------- l10n/he/core.po | 68 ++++++++++++++-------------- l10n/hi/core.po | 64 +++++++++++++------------- l10n/hr/core.po | 68 ++++++++++++++-------------- l10n/hu_HU/core.po | 68 ++++++++++++++-------------- l10n/ia/core.po | 68 ++++++++++++++-------------- l10n/id/core.po | 68 ++++++++++++++-------------- l10n/it/core.po | 68 ++++++++++++++-------------- l10n/ja_JP/core.po | 68 ++++++++++++++-------------- l10n/ka_GE/core.po | 68 ++++++++++++++-------------- l10n/ko/core.po | 68 ++++++++++++++-------------- l10n/ku_IQ/core.po | 64 +++++++++++++------------- l10n/lb/core.po | 68 ++++++++++++++-------------- l10n/lt_LT/core.po | 68 ++++++++++++++-------------- l10n/lv/core.po | 68 ++++++++++++++-------------- l10n/mk/core.po | 68 ++++++++++++++-------------- l10n/ms_MY/core.po | 68 ++++++++++++++-------------- l10n/nb_NO/core.po | 68 ++++++++++++++-------------- l10n/nl/core.po | 68 ++++++++++++++-------------- l10n/nl/files_external.po | 8 ++-- l10n/nl/files_versions.po | 6 +-- l10n/nl/settings.po | 61 +++++++++++++------------ l10n/nn_NO/core.po | 68 ++++++++++++++-------------- l10n/oc/core.po | 68 ++++++++++++++-------------- l10n/pl/core.po | 68 ++++++++++++++-------------- l10n/pl_PL/core.po | 64 +++++++++++++------------- l10n/pt_BR/core.po | 68 ++++++++++++++-------------- l10n/pt_PT/core.po | 24 +++++----- l10n/ro/core.po | 68 ++++++++++++++-------------- l10n/ru/core.po | 68 ++++++++++++++-------------- l10n/ru_RU/core.po | 68 ++++++++++++++-------------- l10n/si_LK/core.po | 64 +++++++++++++------------- l10n/sk_SK/core.po | 24 +++++----- l10n/sl/core.po | 68 ++++++++++++++-------------- l10n/sr/core.po | 68 ++++++++++++++-------------- l10n/sr@latin/core.po | 68 ++++++++++++++-------------- l10n/sv/core.po | 68 ++++++++++++++-------------- l10n/ta_LK/core.po | 68 ++++++++++++++-------------- l10n/templates/core.pot | 16 +++---- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 30 ++++++------- l10n/templates/user_ldap.pot | 2 +- l10n/th_TH/core.po | 68 ++++++++++++++-------------- l10n/tr/core.po | 68 ++++++++++++++-------------- l10n/uk/core.po | 64 +++++++++++++------------- l10n/vi/core.po | 24 +++++----- l10n/zh_CN.GB2312/core.po | 68 ++++++++++++++-------------- l10n/zh_CN/core.po | 24 +++++----- l10n/zh_TW/core.po | 68 ++++++++++++++-------------- lib/l10n/es.php | 1 + settings/l10n/de_DE.php | 20 ++++----- settings/l10n/nl.php | 20 ++++----- 132 files changed, 2027 insertions(+), 2132 deletions(-) diff --git a/apps/files_external/l10n/nl.php b/apps/files_external/l10n/nl.php index 87ab87cfc9..d0c0b02b8f 100644 --- a/apps/files_external/l10n/nl.php +++ b/apps/files_external/l10n/nl.php @@ -11,13 +11,13 @@ "Configuration" => "Configuratie", "Options" => "Opties", "Applicable" => "Van toepassing", -"Add mount point" => "Voeg aankoppelpunt toe", +"Add mount point" => "Aankoppelpunt toevoegen", "None set" => "Niets ingesteld", "All Users" => "Alle gebruikers", "Groups" => "Groepen", "Users" => "Gebruikers", "Delete" => "Verwijder", -"Enable User External Storage" => "Zet gebruiker's externe opslag aan", +"Enable User External Storage" => "Externe opslag voor gebruikers activeren", "Allow users to mount their own external storage" => "Sta gebruikers toe om hun eigen externe opslag aan te koppelen", "SSL root certificates" => "SSL root certificaten", "Import Root Certificate" => "Importeer root certificaat" diff --git a/apps/files_versions/l10n/nl.php b/apps/files_versions/l10n/nl.php index 1cf875048d..f9b5507621 100644 --- a/apps/files_versions/l10n/nl.php +++ b/apps/files_versions/l10n/nl.php @@ -4,5 +4,5 @@ "Versions" => "Versies", "This will delete all existing backup versions of your files" => "Dit zal alle bestaande backup versies van uw bestanden verwijderen", "Files Versioning" => "Bestand versies", -"Enable" => "Zet aan" +"Enable" => "Activeer" ); diff --git a/core/l10n/ar.php b/core/l10n/ar.php index b924066409..c7cbacbf64 100644 --- a/core/l10n/ar.php +++ b/core/l10n/ar.php @@ -4,8 +4,6 @@ "Password" => "كلمة السر", "Use the following link to reset your password: {link}" => "استخدم هذه الوصلة لاسترجاع كلمة السر: {link}", "You will receive a link to reset your password via Email." => "سوف نرسل لك بريد يحتوي على وصلة لتجديد كلمة السر.", -"Requested" => "تم طلب", -"Login failed!" => "محاولة دخول فاشلة!", "Username" => "إسم المستخدم", "Request reset" => "طلب تعديل", "Your password was reset" => "لقد تم تعديل كلمة السر", @@ -30,7 +28,6 @@ "Database name" => "إسم قاعدة البيانات", "Database host" => "خادم قاعدة البيانات", "Finish setup" => "انهاء التعديلات", -"web services under your control" => "خدمات الوب تحت تصرفك", "Sunday" => "الاحد", "Monday" => "الأثنين", "Tuesday" => "الثلاثاء", @@ -50,6 +47,7 @@ "October" => "تشرين الاول", "November" => "تشرين الثاني", "December" => "كانون الاول", +"web services under your control" => "خدمات الوب تحت تصرفك", "Log out" => "الخروج", "Lost your password?" => "هل نسيت كلمة السر؟", "remember" => "تذكر", diff --git a/core/l10n/bg_BG.php b/core/l10n/bg_BG.php index 5d8ed05181..b63062e8d3 100644 --- a/core/l10n/bg_BG.php +++ b/core/l10n/bg_BG.php @@ -9,8 +9,6 @@ "Error" => "Грешка", "Password" => "Парола", "You will receive a link to reset your password via Email." => "Ще получите връзка за нулиране на паролата Ви.", -"Requested" => "Заявено", -"Login failed!" => "Входа пропадна!", "Username" => "Потребител", "Request reset" => "Нулиране на заявка", "Your password was reset" => "Вашата парола е нулирана", diff --git a/core/l10n/ca.php b/core/l10n/ca.php index 2445e378ab..b2d2f18077 100644 --- a/core/l10n/ca.php +++ b/core/l10n/ca.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "estableix de nou la contrasenya Owncloud", "Use the following link to reset your password: {link}" => "Useu l'enllaç següent per restablir la contrasenya: {link}", "You will receive a link to reset your password via Email." => "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya.", -"Requested" => "Sol·licitat", -"Login failed!" => "No s'ha pogut iniciar la sessió", "Username" => "Nom d'usuari", "Request reset" => "Sol·licita reinicialització", "Your password was reset" => "La vostra contrasenya s'ha reinicialitzat", @@ -70,7 +68,6 @@ "Database tablespace" => "Espai de taula de la base de dades", "Database host" => "Ordinador central de la base de dades", "Finish setup" => "Acaba la configuració", -"web services under your control" => "controleu els vostres serveis web", "Sunday" => "Diumenge", "Monday" => "Dilluns", "Tuesday" => "Dimarts", @@ -90,6 +87,7 @@ "October" => "Octubre", "November" => "Novembre", "December" => "Desembre", +"web services under your control" => "controleu els vostres serveis web", "Log out" => "Surt", "Automatic logon rejected!" => "L'ha rebutjat l'acceditació automàtica!", "If you did not change your password recently, your account may be compromised!" => "Se no heu canviat la contrasenya recentment el vostre compte pot estar compromès!", diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php index 4f882b30a2..c3c2ca709c 100644 --- a/core/l10n/cs_CZ.php +++ b/core/l10n/cs_CZ.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Obnovení hesla pro ownCloud", "Use the following link to reset your password: {link}" => "Heslo obnovíte použitím následujícího odkazu: {link}", "You will receive a link to reset your password via Email." => "Bude Vám e-mailem zaslán odkaz pro obnovu hesla.", -"Requested" => "Požadováno", -"Login failed!" => "Přihlášení selhalo.", "Username" => "Uživatelské jméno", "Request reset" => "Vyžádat obnovu", "Your password was reset" => "Vaše heslo bylo obnoveno", @@ -70,7 +68,6 @@ "Database tablespace" => "Tabulkový prostor databáze", "Database host" => "Hostitel databáze", "Finish setup" => "Dokončit nastavení", -"web services under your control" => "webové služby pod Vaší kontrolou", "Sunday" => "Neděle", "Monday" => "Pondělí", "Tuesday" => "Úterý", @@ -90,6 +87,7 @@ "October" => "Říjen", "November" => "Listopad", "December" => "Prosinec", +"web services under your control" => "webové služby pod Vaší kontrolou", "Log out" => "Odhlásit se", "Automatic logon rejected!" => "Automatické přihlášení odmítnuto.", "If you did not change your password recently, your account may be compromised!" => "V nedávné době jste nezměnili své heslo, Váš účet může být kompromitován.", diff --git a/core/l10n/da.php b/core/l10n/da.php index cb2bc9df06..2614d37689 100644 --- a/core/l10n/da.php +++ b/core/l10n/da.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Nulstil ownCloud kodeord", "Use the following link to reset your password: {link}" => "Anvend følgende link til at nulstille din adgangskode: {link}", "You will receive a link to reset your password via Email." => "Du vil modtage et link til at nulstille dit kodeord via email.", -"Requested" => "Forespugt", -"Login failed!" => "Login fejlede!", "Username" => "Brugernavn", "Request reset" => "Anmod om nulstilling", "Your password was reset" => "Dit kodeord blev nulstillet", @@ -70,7 +68,6 @@ "Database tablespace" => "Database tabelplads", "Database host" => "Databasehost", "Finish setup" => "Afslut opsætning", -"web services under your control" => "Webtjenester under din kontrol", "Sunday" => "Søndag", "Monday" => "Mandag", "Tuesday" => "Tirsdag", @@ -90,6 +87,7 @@ "October" => "Oktober", "November" => "November", "December" => "December", +"web services under your control" => "Webtjenester under din kontrol", "Log out" => "Log ud", "Automatic logon rejected!" => "Automatisk login afvist!", "If you did not change your password recently, your account may be compromised!" => "Hvis du ikke har ændret din adgangskode for nylig, har nogen muligvis tiltvunget sig adgang til din konto!", diff --git a/core/l10n/de.php b/core/l10n/de.php index 251cc4baf0..3c92f02858 100644 --- a/core/l10n/de.php +++ b/core/l10n/de.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud-Passwort zurücksetzen", "Use the following link to reset your password: {link}" => "Nutze den nachfolgenden Link, um Dein Passwort zurückzusetzen: {link}", "You will receive a link to reset your password via Email." => "Du erhälst einen Link per E-Mail, um Dein Passwort zurückzusetzen.", -"Requested" => "Angefragt", -"Login failed!" => "Login fehlgeschlagen!", "Username" => "Benutzername", "Request reset" => "Beantrage Zurücksetzung", "Your password was reset" => "Dein Passwort wurde zurückgesetzt.", @@ -70,7 +68,6 @@ "Database tablespace" => "Datenbank-Tablespace", "Database host" => "Datenbank-Host", "Finish setup" => "Installation abschließen", -"web services under your control" => "Web-Services unter Ihrer Kontrolle", "Sunday" => "Sonntag", "Monday" => "Montag", "Tuesday" => "Dienstag", @@ -90,6 +87,7 @@ "October" => "Oktober", "November" => "November", "December" => "Dezember", +"web services under your control" => "Web-Services unter Ihrer Kontrolle", "Log out" => "Abmelden", "Automatic logon rejected!" => "Automatischer Login zurückgewiesen!", "If you did not change your password recently, your account may be compromised!" => "Wenn du Dein Passwort nicht änderst, könnte dein Account kompromitiert werden!", diff --git a/core/l10n/de_DE.php b/core/l10n/de_DE.php index 78f8269e81..cf45023767 100644 --- a/core/l10n/de_DE.php +++ b/core/l10n/de_DE.php @@ -8,7 +8,7 @@ "No" => "Nein", "Yes" => "Ja", "Ok" => "OK", -"No categories selected for deletion." => "Es wurde keine Kategorien zum Löschen ausgewählt.", +"No categories selected for deletion." => "Es wurden keine Kategorien zum Löschen ausgewählt.", "Error" => "Fehler", "Error while sharing" => "Fehler beim Freigeben", "Error while unsharing" => "Fehler beim Aufheben der Freigabe", @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud-Passwort zurücksetzen", "Use the following link to reset your password: {link}" => "Nutzen Sie den nachfolgenden Link, um Ihr Passwort zurückzusetzen: {link}", "You will receive a link to reset your password via Email." => "Sie erhalten einen Link per E-Mail, um Ihr Passwort zurückzusetzen.", -"Requested" => "Angefragt", -"Login failed!" => "Login fehlgeschlagen!", "Username" => "Benutzername", "Request reset" => "Beantrage Zurücksetzung", "Your password was reset" => "Ihr Passwort wurde zurückgesetzt.", @@ -70,7 +68,6 @@ "Database tablespace" => "Datenbank-Tablespace", "Database host" => "Datenbank-Host", "Finish setup" => "Installation abschließen", -"web services under your control" => "Web-Services unter Ihrer Kontrolle", "Sunday" => "Sonntag", "Monday" => "Montag", "Tuesday" => "Dienstag", @@ -90,6 +87,7 @@ "October" => "Oktober", "November" => "November", "December" => "Dezember", +"web services under your control" => "Web-Services unter Ihrer Kontrolle", "Log out" => "Abmelden", "Automatic logon rejected!" => "Automatische Anmeldung verweigert.", "If you did not change your password recently, your account may be compromised!" => "Wenn Sie Ihr Passwort nicht kürzlich geändert haben könnte Ihr Konto gefährdet sein.", diff --git a/core/l10n/el.php b/core/l10n/el.php index 67f4c4ba88..1c4329048d 100644 --- a/core/l10n/el.php +++ b/core/l10n/el.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Επαναφορά κωδικού ownCloud", "Use the following link to reset your password: {link}" => "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}", "You will receive a link to reset your password via Email." => "Θα λάβετε ένα σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας μέσω ηλεκτρονικού ταχυδρομείου.", -"Requested" => "Ζητήθησαν", -"Login failed!" => "Η σύνδεση απέτυχε!", "Username" => "Όνομα Χρήστη", "Request reset" => "Επαναφορά αίτησης", "Your password was reset" => "Ο κωδικός πρόσβασής σας επαναφέρθηκε", @@ -68,7 +66,6 @@ "Database tablespace" => "Κενά Πινάκων Βάσης Δεδομένων", "Database host" => "Διακομιστής βάσης δεδομένων", "Finish setup" => "Ολοκλήρωση εγκατάστασης", -"web services under your control" => "Υπηρεσίες web υπό τον έλεγχό σας", "Sunday" => "Κυριακή", "Monday" => "Δευτέρα", "Tuesday" => "Τρίτη", @@ -88,6 +85,7 @@ "October" => "Οκτώβριος", "November" => "Νοέμβριος", "December" => "Δεκέμβριος", +"web services under your control" => "Υπηρεσίες web υπό τον έλεγχό σας", "Log out" => "Αποσύνδεση", "Automatic logon rejected!" => "Απορρίφθηκε η αυτόματη σύνδεση!", "Please change your password to secure your account again." => "Παρακαλώ αλλάξτε τον κωδικό σας για να ασφαλίσετε πάλι τον λογαριασμό σας.", diff --git a/core/l10n/eo.php b/core/l10n/eo.php index e01f46cec6..e98f6c1616 100644 --- a/core/l10n/eo.php +++ b/core/l10n/eo.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "La pasvorto de ownCloud restariĝis.", "Use the following link to reset your password: {link}" => "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", "You will receive a link to reset your password via Email." => "Vi ricevos ligilon retpoŝte por rekomencigi vian pasvorton.", -"Requested" => "Petita", -"Login failed!" => "Ensaluto malsukcesis!", "Username" => "Uzantonomo", "Request reset" => "Peti rekomencigon", "Your password was reset" => "Via pasvorto rekomencis", @@ -64,7 +62,6 @@ "Database tablespace" => "Datumbaza tabelospaco", "Database host" => "Datumbaza gastigo", "Finish setup" => "Fini la instalon", -"web services under your control" => "TTT-servoj sub via kontrolo", "Sunday" => "dimanĉo", "Monday" => "lundo", "Tuesday" => "mardo", @@ -84,6 +81,7 @@ "October" => "Oktobro", "November" => "Novembro", "December" => "Decembro", +"web services under your control" => "TTT-servoj sub via kontrolo", "Log out" => "Elsaluti", "Lost your password?" => "Ĉu vi perdis vian pasvorton?", "remember" => "memori", diff --git a/core/l10n/es.php b/core/l10n/es.php index 173ad5de87..c9b58ef7cd 100644 --- a/core/l10n/es.php +++ b/core/l10n/es.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Reiniciar contraseña de ownCloud", "Use the following link to reset your password: {link}" => "Utiliza el siguiente enlace para restablecer tu contraseña: {link}", "You will receive a link to reset your password via Email." => "Recibirás un enlace por correo electrónico para restablecer tu contraseña", -"Requested" => "Pedido", -"Login failed!" => "¡Fallo al iniciar sesión!", "Username" => "Nombre de usuario", "Request reset" => "Solicitar restablecimiento", "Your password was reset" => "Tu contraseña se ha restablecido", @@ -70,7 +68,6 @@ "Database tablespace" => "Espacio de tablas de la base de datos", "Database host" => "Host de la base de datos", "Finish setup" => "Completar la instalación", -"web services under your control" => "servicios web bajo tu control", "Sunday" => "Domingo", "Monday" => "Lunes", "Tuesday" => "Martes", @@ -90,6 +87,7 @@ "October" => "Octubre", "November" => "Noviembre", "December" => "Diciembre", +"web services under your control" => "servicios web bajo tu control", "Log out" => "Salir", "Automatic logon rejected!" => "¡Inicio de sesión automático rechazado!", "If you did not change your password recently, your account may be compromised!" => "Si usted no ha cambiado su contraseña recientemente, ¡puede que su cuenta esté comprometida!", diff --git a/core/l10n/es_AR.php b/core/l10n/es_AR.php index 2c3973e895..622fc65a77 100644 --- a/core/l10n/es_AR.php +++ b/core/l10n/es_AR.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Restablecer contraseña de ownCloud", "Use the following link to reset your password: {link}" => "Usá este enlace para restablecer tu contraseña: {link}", "You will receive a link to reset your password via Email." => "Vas a recibir un enlace por e-mail para restablecer tu contraseña", -"Requested" => "Pedido", -"Login failed!" => "¡Error al iniciar sesión!", "Username" => "Nombre de usuario", "Request reset" => "Solicitar restablecimiento", "Your password was reset" => "Tu contraseña fue restablecida", diff --git a/core/l10n/et_EE.php b/core/l10n/et_EE.php index 14c5c66bea..710547f2a1 100644 --- a/core/l10n/et_EE.php +++ b/core/l10n/et_EE.php @@ -32,8 +32,6 @@ "ownCloud password reset" => "ownCloud parooli taastamine", "Use the following link to reset your password: {link}" => "Kasuta järgnevat linki oma parooli taastamiseks: {link}", "You will receive a link to reset your password via Email." => "Sinu parooli taastamise link saadetakse sulle e-postile.", -"Requested" => "Kohustuslik", -"Login failed!" => "Sisselogimine ebaõnnestus!", "Username" => "Kasutajanimi", "Request reset" => "Päringu taastamine", "Your password was reset" => "Sinu parool on taastatud", @@ -61,7 +59,6 @@ "Database tablespace" => "Andmebaasi tabeliruum", "Database host" => "Andmebaasi host", "Finish setup" => "Lõpeta seadistamine", -"web services under your control" => "veebiteenused sinu kontrolli all", "Sunday" => "Pühapäev", "Monday" => "Esmaspäev", "Tuesday" => "Teisipäev", @@ -81,6 +78,7 @@ "October" => "Oktoober", "November" => "November", "December" => "Detsember", +"web services under your control" => "veebiteenused sinu kontrolli all", "Log out" => "Logi välja", "Lost your password?" => "Kaotasid oma parooli?", "remember" => "pea meeles", diff --git a/core/l10n/eu.php b/core/l10n/eu.php index 6afe5b4feb..f370ee315d 100644 --- a/core/l10n/eu.php +++ b/core/l10n/eu.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "ownCloud-en pasahitza berrezarri", "Use the following link to reset your password: {link}" => "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", "You will receive a link to reset your password via Email." => "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez.", -"Requested" => "Eskatuta", -"Login failed!" => "Saio hasierak huts egin du!", "Username" => "Erabiltzaile izena", "Request reset" => "Eskaera berrezarri da", "Your password was reset" => "Zure pasahitza berrezarri da", @@ -65,7 +63,6 @@ "Database tablespace" => "Datu basearen taula-lekua", "Database host" => "Datubasearen hostalaria", "Finish setup" => "Bukatu konfigurazioa", -"web services under your control" => "web zerbitzuak zure kontrolpean", "Sunday" => "Igandea", "Monday" => "Astelehena", "Tuesday" => "Asteartea", @@ -85,6 +82,7 @@ "October" => "Urria", "November" => "Azaroa", "December" => "Abendua", +"web services under your control" => "web zerbitzuak zure kontrolpean", "Log out" => "Saioa bukatu", "Lost your password?" => "Galdu duzu pasahitza?", "remember" => "gogoratu", diff --git a/core/l10n/fa.php b/core/l10n/fa.php index 23e58d2efb..bf548d2d78 100644 --- a/core/l10n/fa.php +++ b/core/l10n/fa.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "پسورد ابرهای شما تغییرکرد", "Use the following link to reset your password: {link}" => "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", "You will receive a link to reset your password via Email." => "شما یک نامه الکترونیکی حاوی یک لینک جهت بازسازی گذرواژه دریافت خواهید کرد.", -"Requested" => "درخواست", -"Login failed!" => "ورود ناموفق بود", "Username" => "شناسه", "Request reset" => "درخواست دوباره سازی", "Your password was reset" => "گذرواژه شما تغییرکرد", @@ -42,7 +40,6 @@ "Database name" => "نام پایگاه داده", "Database host" => "هاست پایگاه داده", "Finish setup" => "اتمام نصب", -"web services under your control" => "سرویس وب تحت کنترل شما", "Sunday" => "یکشنبه", "Monday" => "دوشنبه", "Tuesday" => "سه شنبه", @@ -62,6 +59,7 @@ "October" => "اکتبر", "November" => "نوامبر", "December" => "دسامبر", +"web services under your control" => "سرویس وب تحت کنترل شما", "Log out" => "خروج", "Lost your password?" => "آیا گذرواژه تان را به یاد نمی آورید؟", "remember" => "بیاد آوری", diff --git a/core/l10n/fi_FI.php b/core/l10n/fi_FI.php index 0c8e7896db..9891649692 100644 --- a/core/l10n/fi_FI.php +++ b/core/l10n/fi_FI.php @@ -34,8 +34,6 @@ "ownCloud password reset" => "ownCloud-salasanan nollaus", "Use the following link to reset your password: {link}" => "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}", "You will receive a link to reset your password via Email." => "Saat sähköpostitse linkin nollataksesi salasanan.", -"Requested" => "Tilattu", -"Login failed!" => "Kirjautuminen epäonnistui!", "Username" => "Käyttäjätunnus", "Request reset" => "Tilaus lähetetty", "Your password was reset" => "Salasanasi nollattiin", @@ -64,7 +62,6 @@ "Database tablespace" => "Tietokannan taulukkotila", "Database host" => "Tietokantapalvelin", "Finish setup" => "Viimeistele asennus", -"web services under your control" => "verkkopalvelut hallinnassasi", "Sunday" => "Sunnuntai", "Monday" => "Maanantai", "Tuesday" => "Tiistai", @@ -84,6 +81,7 @@ "October" => "Lokakuu", "November" => "Marraskuu", "December" => "Joulukuu", +"web services under your control" => "verkkopalvelut hallinnassasi", "Log out" => "Kirjaudu ulos", "Lost your password?" => "Unohditko salasanasi?", "remember" => "muista", diff --git a/core/l10n/fr.php b/core/l10n/fr.php index c9f2f57852..597f58172d 100644 --- a/core/l10n/fr.php +++ b/core/l10n/fr.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "Réinitialisation de votre mot de passe Owncloud", "Use the following link to reset your password: {link}" => "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}", "You will receive a link to reset your password via Email." => "Vous allez recevoir un e-mail contenant un lien pour réinitialiser votre mot de passe.", -"Requested" => "Demande envoyée", -"Login failed!" => "Nom d'utilisateur ou e-mail invalide", "Username" => "Nom d'utilisateur", "Request reset" => "Demander la réinitialisation", "Your password was reset" => "Votre mot de passe a été réinitialisé", @@ -67,7 +65,6 @@ "Database tablespace" => "Tablespaces de la base de données", "Database host" => "Serveur de la base de données", "Finish setup" => "Terminer l'installation", -"web services under your control" => "services web sous votre contrôle", "Sunday" => "Dimanche", "Monday" => "Lundi", "Tuesday" => "Mardi", @@ -87,6 +84,7 @@ "October" => "octobre", "November" => "novembre", "December" => "décembre", +"web services under your control" => "services web sous votre contrôle", "Log out" => "Se déconnecter", "Automatic logon rejected!" => "Connexion automatique rejetée !", "If you did not change your password recently, your account may be compromised!" => "Si vous n'avez pas changé votre mot de passe récemment, votre compte risque d'être compromis !", diff --git a/core/l10n/gl.php b/core/l10n/gl.php index 1b35cd2fd8..97f0ec9862 100644 --- a/core/l10n/gl.php +++ b/core/l10n/gl.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "Restablecer contrasinal de ownCloud", "Use the following link to reset your password: {link}" => "Use a seguinte ligazón para restablecer o contrasinal: {link}", "You will receive a link to reset your password via Email." => "Recibirá unha ligazón por correo electrónico para restablecer o contrasinal", -"Requested" => "Solicitado", -"Login failed!" => "Fallou a conexión.", "Username" => "Nome de usuario", "Request reset" => "Petición de restablecemento", "Your password was reset" => "O contrasinal foi restablecido", @@ -42,7 +40,6 @@ "Database name" => "Nome da base de datos", "Database host" => "Servidor da base de datos", "Finish setup" => "Rematar configuración", -"web services under your control" => "servizos web baixo o seu control", "Sunday" => "Domingo", "Monday" => "Luns", "Tuesday" => "Martes", @@ -62,6 +59,7 @@ "October" => "Outubro", "November" => "Novembro", "December" => "Nadal", +"web services under your control" => "servizos web baixo o seu control", "Log out" => "Desconectar", "Lost your password?" => "Perdeu o contrasinal?", "remember" => "lembrar", diff --git a/core/l10n/he.php b/core/l10n/he.php index 2038191142..f0ba4198d6 100644 --- a/core/l10n/he.php +++ b/core/l10n/he.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "איפוס הססמה של ownCloud", "Use the following link to reset your password: {link}" => "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", "You will receive a link to reset your password via Email." => "יישלח לתיבת הדוא״ל שלך קישור לאיפוס הססמה.", -"Requested" => "נדרש", -"Login failed!" => "הכניסה נכשלה!", "Username" => "שם משתמש", "Request reset" => "בקשת איפוס", "Your password was reset" => "הססמה שלך אופסה", @@ -42,7 +40,6 @@ "Database tablespace" => "מרחב הכתובות של מסד הנתונים", "Database host" => "שרת בסיס נתונים", "Finish setup" => "סיום התקנה", -"web services under your control" => "שירותי רשת בשליטתך", "Sunday" => "יום ראשון", "Monday" => "יום שני", "Tuesday" => "יום שלישי", @@ -62,6 +59,7 @@ "October" => "אוקטובר", "November" => "נובמבר", "December" => "דצמבר", +"web services under your control" => "שירותי רשת בשליטתך", "Log out" => "התנתקות", "Lost your password?" => "שכחת את ססמתך?", "remember" => "שמירת הססמה", diff --git a/core/l10n/hr.php b/core/l10n/hr.php index f9a4268dde..d1d6e9cfc6 100644 --- a/core/l10n/hr.php +++ b/core/l10n/hr.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "ownCloud resetiranje lozinke", "Use the following link to reset your password: {link}" => "Koristite ovaj link da biste poništili lozinku: {link}", "You will receive a link to reset your password via Email." => "Primit ćete link kako biste poništili zaporku putem e-maila.", -"Requested" => "Zahtijevano", -"Login failed!" => "Prijava nije uspjela!", "Username" => "Korisničko ime", "Request reset" => "Zahtjev za resetiranjem", "Your password was reset" => "Vaša lozinka je resetirana", @@ -63,7 +61,6 @@ "Database tablespace" => "Database tablespace", "Database host" => "Poslužitelj baze podataka", "Finish setup" => "Završi postavljanje", -"web services under your control" => "web usluge pod vašom kontrolom", "Sunday" => "nedelja", "Monday" => "ponedeljak", "Tuesday" => "utorak", @@ -83,6 +80,7 @@ "October" => "Listopad", "November" => "Studeni", "December" => "Prosinac", +"web services under your control" => "web usluge pod vašom kontrolom", "Log out" => "Odjava", "Lost your password?" => "Izgubili ste lozinku?", "remember" => "zapamtiti", diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php index 377f57bc32..7c3ce250cf 100644 --- a/core/l10n/hu_HU.php +++ b/core/l10n/hu_HU.php @@ -15,8 +15,6 @@ "ownCloud password reset" => "ownCloud jelszó-visszaállítás", "Use the following link to reset your password: {link}" => "Használja az alábbi linket a jelszó-visszaállításhoz: {link}", "You will receive a link to reset your password via Email." => "Egy e-mailben kap értesítést a jelszóváltoztatás módjáról.", -"Requested" => "Kérés elküldve", -"Login failed!" => "Belépés sikertelen!", "Username" => "Felhasználónév", "Request reset" => "Visszaállítás igénylése", "Your password was reset" => "Jelszó megváltoztatva", @@ -43,7 +41,6 @@ "Database name" => "Adatbázis név", "Database host" => "Adatbázis szerver", "Finish setup" => "Beállítás befejezése", -"web services under your control" => "webszolgáltatások az irányításod alatt", "Sunday" => "Vasárnap", "Monday" => "Hétfő", "Tuesday" => "Kedd", @@ -63,6 +60,7 @@ "October" => "Október", "November" => "November", "December" => "December", +"web services under your control" => "webszolgáltatások az irányításod alatt", "Log out" => "Kilépés", "Lost your password?" => "Elfelejtett jelszó?", "remember" => "emlékezzen", diff --git a/core/l10n/ia.php b/core/l10n/ia.php index 479b1a424c..07cc118f0e 100644 --- a/core/l10n/ia.php +++ b/core/l10n/ia.php @@ -4,8 +4,6 @@ "Cancel" => "Cancellar", "Password" => "Contrasigno", "ownCloud password reset" => "Reinitialisation del contrasigno de ownCLoud", -"Requested" => "Requestate", -"Login failed!" => "Initio de session fallite!", "Username" => "Nomine de usator", "Request reset" => "Requestar reinitialisation", "Your password was reset" => "Tu contrasigno esseva reinitialisate", @@ -30,7 +28,6 @@ "Database password" => "Contrasigno de base de datos", "Database name" => "Nomine de base de datos", "Database host" => "Hospite de base de datos", -"web services under your control" => "servicios web sub tu controlo", "Sunday" => "Dominica", "Monday" => "Lunedi", "Tuesday" => "Martedi", @@ -50,6 +47,7 @@ "October" => "Octobre", "November" => "Novembre", "December" => "Decembre", +"web services under your control" => "servicios web sub tu controlo", "Log out" => "Clauder le session", "Lost your password?" => "Tu perdeva le contrasigno?", "remember" => "memora", diff --git a/core/l10n/id.php b/core/l10n/id.php index f733165673..2b7072fd7c 100644 --- a/core/l10n/id.php +++ b/core/l10n/id.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "reset password ownCloud", "Use the following link to reset your password: {link}" => "Gunakan tautan berikut untuk mereset password anda: {link}", "You will receive a link to reset your password via Email." => "Anda akan mendapatkan link untuk mereset password anda lewat Email.", -"Requested" => "Telah diminta", -"Login failed!" => "Login gagal!", "Username" => "Username", "Request reset" => "Meminta reset", "Your password was reset" => "Password anda telah direset", @@ -68,7 +66,6 @@ "Database tablespace" => "tablespace basis data", "Database host" => "Host database", "Finish setup" => "Selesaikan instalasi", -"web services under your control" => "web service dibawah kontrol anda", "Sunday" => "minggu", "Monday" => "senin", "Tuesday" => "selasa", @@ -88,6 +85,7 @@ "October" => "Oktober", "November" => "Nopember", "December" => "Desember", +"web services under your control" => "web service dibawah kontrol anda", "Log out" => "Keluar", "Automatic logon rejected!" => "login otomatis ditolak!", "If you did not change your password recently, your account may be compromised!" => "apabila anda tidak merubah kata kunci belakangan ini, akun anda dapat di gunakan orang lain!", diff --git a/core/l10n/it.php b/core/l10n/it.php index f85e7f89c4..1f718ed55d 100644 --- a/core/l10n/it.php +++ b/core/l10n/it.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Ripristino password di ownCloud", "Use the following link to reset your password: {link}" => "Usa il collegamento seguente per ripristinare la password: {link}", "You will receive a link to reset your password via Email." => "Riceverai un collegamento per ripristinare la tua password via email", -"Requested" => "Richiesto", -"Login failed!" => "Accesso non riuscito!", "Username" => "Nome utente", "Request reset" => "Richiesta di ripristino", "Your password was reset" => "La password è stata ripristinata", @@ -70,7 +68,6 @@ "Database tablespace" => "Spazio delle tabelle del database", "Database host" => "Host del database", "Finish setup" => "Termina la configurazione", -"web services under your control" => "servizi web nelle tue mani", "Sunday" => "Domenica", "Monday" => "Lunedì", "Tuesday" => "Martedì", @@ -90,6 +87,7 @@ "October" => "Ottobre", "November" => "Novembre", "December" => "Dicembre", +"web services under your control" => "servizi web nelle tue mani", "Log out" => "Esci", "Automatic logon rejected!" => "Accesso automatico rifiutato.", "If you did not change your password recently, your account may be compromised!" => "Se non hai cambiato la password recentemente, il tuo account potrebbe essere stato compromesso.", diff --git a/core/l10n/ja_JP.php b/core/l10n/ja_JP.php index a6b533a65d..180bf026b0 100644 --- a/core/l10n/ja_JP.php +++ b/core/l10n/ja_JP.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloudのパスワードをリセットします", "Use the following link to reset your password: {link}" => "パスワードをリセットするには次のリンクをクリックして下さい: {link}", "You will receive a link to reset your password via Email." => "メールでパスワードをリセットするリンクが届きます。", -"Requested" => "送信されました", -"Login failed!" => "ログインに失敗しました!", "Username" => "ユーザ名", "Request reset" => "リセットを要求します。", "Your password was reset" => "あなたのパスワードはリセットされました。", @@ -70,7 +68,6 @@ "Database tablespace" => "データベースの表領域", "Database host" => "データベースのホスト名", "Finish setup" => "セットアップを完了します", -"web services under your control" => "管理下にあるウェブサービス", "Sunday" => "日", "Monday" => "月", "Tuesday" => "火", @@ -90,6 +87,7 @@ "October" => "10月", "November" => "11月", "December" => "12月", +"web services under your control" => "管理下にあるウェブサービス", "Log out" => "ログアウト", "Automatic logon rejected!" => "自動ログインは拒否されました!", "If you did not change your password recently, your account may be compromised!" => "最近パスワードを変更していない場合、あなたのアカウントは危険にさらされているかもしれません。", diff --git a/core/l10n/ka_GE.php b/core/l10n/ka_GE.php index 7e43fa322d..ac98e1f9d1 100644 --- a/core/l10n/ka_GE.php +++ b/core/l10n/ka_GE.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "ownCloud პაროლის შეცვლა", "Use the following link to reset your password: {link}" => "გამოიყენე შემდეგი ლინკი პაროლის შესაცვლელად: {link}", "You will receive a link to reset your password via Email." => "თქვენ მოგივათ პაროლის შესაცვლელი ლინკი მეილზე", -"Requested" => "მოთხოვნილი", -"Login failed!" => "შესვლა ვერ მოხერხდა!", "Username" => "მომხმარებელი", "Request reset" => "რესეტის მოთხოვნა", "Your password was reset" => "თქვენი პაროლი შეცვლილია", @@ -66,7 +64,6 @@ "Database tablespace" => "ბაზის ცხრილის ზომა", "Database host" => "ბაზის ჰოსტი", "Finish setup" => "კონფიგურაციის დასრულება", -"web services under your control" => "თქვენი კონტროლის ქვეშ მყოფი ვებ სერვისები", "Sunday" => "კვირა", "Monday" => "ორშაბათი", "Tuesday" => "სამშაბათი", @@ -86,6 +83,7 @@ "October" => "ოქტომბერი", "November" => "ნოემბერი", "December" => "დეკემბერი", +"web services under your control" => "თქვენი კონტროლის ქვეშ მყოფი ვებ სერვისები", "Log out" => "გამოსვლა", "Automatic logon rejected!" => "ავტომატური შესვლა უარყოფილია!", "Lost your password?" => "დაგავიწყდათ პაროლი?", diff --git a/core/l10n/ko.php b/core/l10n/ko.php index fd3fd68f3b..a8fdab7c6e 100644 --- a/core/l10n/ko.php +++ b/core/l10n/ko.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "ownCloud 비밀번호 재설정", "Use the following link to reset your password: {link}" => "다음 링크를 사용하여 암호를 초기화할 수 있습니다: {link}", "You will receive a link to reset your password via Email." => "전자 우편으로 암호 재설정 링크를 보냈습니다.", -"Requested" => "요청함", -"Login failed!" => "로그인 실패!", "Username" => "사용자 이름", "Request reset" => "요청 초기화", "Your password was reset" => "암호가 재설정되었습니다", @@ -42,7 +40,6 @@ "Database name" => "데이터베이스 이름", "Database host" => "데이터베이스 호스트", "Finish setup" => "설치 완료", -"web services under your control" => "내가 관리하는 웹 서비스", "Sunday" => "일요일", "Monday" => "월요일", "Tuesday" => "화요일", @@ -62,6 +59,7 @@ "October" => "10월", "November" => "11월", "December" => "12월", +"web services under your control" => "내가 관리하는 웹 서비스", "Log out" => "로그아웃", "Lost your password?" => "암호를 잊으셨습니까?", "remember" => "기억하기", diff --git a/core/l10n/lb.php b/core/l10n/lb.php index e09ab57793..507efd7a4b 100644 --- a/core/l10n/lb.php +++ b/core/l10n/lb.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "ownCloud Passwuert reset", "Use the following link to reset your password: {link}" => "Benotz folgende Link fir däi Passwuert ze reseten: {link}", "You will receive a link to reset your password via Email." => "Du kriss en Link fir däin Passwuert nei ze setzen via Email geschéckt.", -"Requested" => "Gefrot", -"Login failed!" => "Falschen Login!", "Username" => "Benotzernumm", "Request reset" => "Reset ufroen", "Your password was reset" => "Dän Passwuert ass zeréck gesat gin", @@ -43,7 +41,6 @@ "Database tablespace" => "Datebank Tabelle-Gréisst", "Database host" => "Datebank Server", "Finish setup" => "Installatioun ofschléissen", -"web services under your control" => "Web Servicer ënnert denger Kontroll", "Sunday" => "Sonndes", "Monday" => "Méindes", "Tuesday" => "Dënschdes", @@ -63,6 +60,7 @@ "October" => "Oktober", "November" => "November", "December" => "Dezember", +"web services under your control" => "Web Servicer ënnert denger Kontroll", "Log out" => "Ausloggen", "Lost your password?" => "Passwuert vergiess?", "remember" => "verhalen", diff --git a/core/l10n/lt_LT.php b/core/l10n/lt_LT.php index 5a5a22afe2..11ee84b5da 100644 --- a/core/l10n/lt_LT.php +++ b/core/l10n/lt_LT.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud slaptažodžio atkūrimas", "Use the following link to reset your password: {link}" => "Slaptažodio atkūrimui naudokite šią nuorodą: {link}", "You will receive a link to reset your password via Email." => "Elektroniniu paštu gausite nuorodą, su kuria galėsite iš naujo nustatyti slaptažodį.", -"Requested" => "Užklausta", -"Login failed!" => "Prisijungti nepavyko!", "Username" => "Prisijungimo vardas", "Request reset" => "Prašyti nustatymo iš najo", "Your password was reset" => "Jūsų slaptažodis buvo nustatytas iš naujo", @@ -70,7 +68,6 @@ "Database tablespace" => "Duomenų bazės loginis saugojimas", "Database host" => "Duomenų bazės serveris", "Finish setup" => "Baigti diegimą", -"web services under your control" => "jūsų valdomos web paslaugos", "Sunday" => "Sekmadienis", "Monday" => "Pirmadienis", "Tuesday" => "Antradienis", @@ -90,6 +87,7 @@ "October" => "Spalis", "November" => "Lapkritis", "December" => "Gruodis", +"web services under your control" => "jūsų valdomos web paslaugos", "Log out" => "Atsijungti", "Automatic logon rejected!" => "Automatinis prisijungimas atmestas!", "If you did not change your password recently, your account may be compromised!" => "Jei paskutinių metu nekeitėte savo slaptažodžio, Jūsų paskyra gali būti pavojuje!", diff --git a/core/l10n/lv.php b/core/l10n/lv.php index 6a813037ad..5543c7a56d 100644 --- a/core/l10n/lv.php +++ b/core/l10n/lv.php @@ -5,8 +5,6 @@ "Unshare" => "Pārtraukt līdzdalīšanu", "Use the following link to reset your password: {link}" => "Izmantojiet šo linku lai mainītu paroli", "You will receive a link to reset your password via Email." => "Jūs savā epastā saņemsiet interneta saiti, caur kuru varēsiet atjaunot paroli.", -"Requested" => "Obligāts", -"Login failed!" => "Neizdevās ielogoties.", "Username" => "Lietotājvārds", "Request reset" => "Pieprasīt paroles maiņu", "Your password was reset" => "Jūsu parole tika nomainīta", diff --git a/core/l10n/mk.php b/core/l10n/mk.php index 3612a735c6..9e3c94750c 100644 --- a/core/l10n/mk.php +++ b/core/l10n/mk.php @@ -14,8 +14,6 @@ "ownCloud password reset" => "ресетирање на лозинка за ownCloud", "Use the following link to reset your password: {link}" => "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}", "You will receive a link to reset your password via Email." => "Ќе добиете врска по е-пошта за да може да ја ресетирате Вашата лозинка.", -"Requested" => "Побарано", -"Login failed!" => "Најавата не успеа!", "Username" => "Корисничко име", "Request reset" => "Побарајте ресетирање", "Your password was reset" => "Вашата лозинка беше ресетирана", @@ -41,7 +39,6 @@ "Database name" => "Име на база", "Database host" => "Сервер со база", "Finish setup" => "Заврши го подесувањето", -"web services under your control" => "веб сервиси под Ваша контрола", "Sunday" => "Недела", "Monday" => "Понеделник", "Tuesday" => "Вторник", @@ -61,6 +58,7 @@ "October" => "Октомври", "November" => "Ноември", "December" => "Декември", +"web services under your control" => "веб сервиси под Ваша контрола", "Log out" => "Одјава", "Lost your password?" => "Ја заборавивте лозинката?", "remember" => "запамти", diff --git a/core/l10n/ms_MY.php b/core/l10n/ms_MY.php index 624248a7db..7cb0dbb10b 100644 --- a/core/l10n/ms_MY.php +++ b/core/l10n/ms_MY.php @@ -13,8 +13,6 @@ "ownCloud password reset" => "Set semula kata lalaun ownCloud", "Use the following link to reset your password: {link}" => "Guna pautan berikut untuk menetapkan semula kata laluan anda: {link}", "You will receive a link to reset your password via Email." => "Anda akan menerima pautan untuk menetapkan semula kata laluan anda melalui emel", -"Requested" => "Meminta", -"Login failed!" => "Log masuk gagal!", "Username" => "Nama pengguna", "Request reset" => "Permintaan set semula", "Your password was reset" => "Kata laluan anda telah diset semula", @@ -41,7 +39,6 @@ "Database name" => "Nama pangkalan data", "Database host" => "Hos pangkalan data", "Finish setup" => "Setup selesai", -"web services under your control" => "Perkhidmatan web di bawah kawalan anda", "Sunday" => "Ahad", "Monday" => "Isnin", "Tuesday" => "Selasa", @@ -61,6 +58,7 @@ "October" => "Oktober", "November" => "November", "December" => "Disember", +"web services under your control" => "Perkhidmatan web di bawah kawalan anda", "Log out" => "Log keluar", "Lost your password?" => "Hilang kata laluan?", "remember" => "ingat", diff --git a/core/l10n/nb_NO.php b/core/l10n/nb_NO.php index 17e1fd03d9..1242109e35 100644 --- a/core/l10n/nb_NO.php +++ b/core/l10n/nb_NO.php @@ -15,8 +15,6 @@ "ownCloud password reset" => "Tilbakestill ownCloud passord", "Use the following link to reset your password: {link}" => "Bruk følgende lenke for å tilbakestille passordet ditt: {link}", "You will receive a link to reset your password via Email." => "Du burde motta detaljer om å tilbakestille passordet ditt via epost.", -"Requested" => "Anmodning", -"Login failed!" => "Innloggingen var ikke vellykket.", "Username" => "Brukernavn", "Request reset" => "Anmod tilbakestilling", "Your password was reset" => "Passordet ditt ble tilbakestilt", @@ -44,7 +42,6 @@ "Database tablespace" => "Database tabellområde", "Database host" => "Databasevert", "Finish setup" => "Fullfør oppsetting", -"web services under your control" => "nettjenester under din kontroll", "Sunday" => "Søndag", "Monday" => "Mandag", "Tuesday" => "Tirsdag", @@ -64,6 +61,7 @@ "October" => "Oktober", "November" => "November", "December" => "Desember", +"web services under your control" => "nettjenester under din kontroll", "Log out" => "Logg ut", "Lost your password?" => "Mistet passordet ditt?", "remember" => "husk", diff --git a/core/l10n/nl.php b/core/l10n/nl.php index 8f452cc15a..e3016ee444 100644 --- a/core/l10n/nl.php +++ b/core/l10n/nl.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud wachtwoord herstellen", "Use the following link to reset your password: {link}" => "Gebruik de volgende link om je wachtwoord te resetten: {link}", "You will receive a link to reset your password via Email." => "U ontvangt een link om uw wachtwoord opnieuw in te stellen via e-mail.", -"Requested" => "Gevraagd", -"Login failed!" => "Login mislukt!", "Username" => "Gebruikersnaam", "Request reset" => "Resetaanvraag", "Your password was reset" => "Je wachtwoord is gewijzigd", @@ -70,7 +68,6 @@ "Database tablespace" => "Database tablespace", "Database host" => "Database server", "Finish setup" => "Installatie afronden", -"web services under your control" => "Webdiensten in eigen beheer", "Sunday" => "Zondag", "Monday" => "Maandag", "Tuesday" => "Dinsdag", @@ -90,6 +87,7 @@ "October" => "oktober", "November" => "november", "December" => "december", +"web services under your control" => "Webdiensten in eigen beheer", "Log out" => "Afmelden", "Automatic logon rejected!" => "Automatische aanmelding geweigerd!", "If you did not change your password recently, your account may be compromised!" => "Als u uw wachtwoord niet onlangs heeft aangepast, kan uw account overgenomen zijn!", diff --git a/core/l10n/nn_NO.php b/core/l10n/nn_NO.php index 7714f99e8a..e62e0dea73 100644 --- a/core/l10n/nn_NO.php +++ b/core/l10n/nn_NO.php @@ -5,8 +5,6 @@ "Password" => "Passord", "Use the following link to reset your password: {link}" => "Bruk føljane link til å tilbakestille passordet ditt: {link}", "You will receive a link to reset your password via Email." => "Du vil få ei lenkje for å nullstilla passordet via epost.", -"Requested" => "Førespurt", -"Login failed!" => "Feil ved innlogging!", "Username" => "Brukarnamn", "Request reset" => "Be om nullstilling", "Your password was reset" => "Passordet ditt er nullstilt", @@ -30,7 +28,6 @@ "Database name" => "Databasenamn", "Database host" => "Databasetenar", "Finish setup" => "Fullfør oppsettet", -"web services under your control" => "Vev tjenester under din kontroll", "Sunday" => "Søndag", "Monday" => "Måndag", "Tuesday" => "Tysdag", @@ -50,6 +47,7 @@ "October" => "Oktober", "November" => "November", "December" => "Desember", +"web services under your control" => "Vev tjenester under din kontroll", "Log out" => "Logg ut", "Lost your password?" => "Gløymt passordet?", "remember" => "hugs", diff --git a/core/l10n/oc.php b/core/l10n/oc.php index 28d5c25ac4..c37e84530d 100644 --- a/core/l10n/oc.php +++ b/core/l10n/oc.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "senhal d'ownCloud tornat botar", "Use the following link to reset your password: {link}" => "Utiliza lo ligam seguent per tornar botar lo senhal : {link}", "You will receive a link to reset your password via Email." => "Reçaupràs un ligam per tornar botar ton senhal via corrièl.", -"Requested" => "Requesit", -"Login failed!" => "Fracàs de login", "Username" => "Nom d'usancièr", "Request reset" => "Tornar botar requesit", "Your password was reset" => "Ton senhal es estat tornat botar", @@ -64,7 +62,6 @@ "Database tablespace" => "Espandi de taula de basa de donadas", "Database host" => "Òste de basa de donadas", "Finish setup" => "Configuracion acabada", -"web services under your control" => "Services web jos ton contraròtle", "Sunday" => "Dimenge", "Monday" => "Diluns", "Tuesday" => "Dimarç", @@ -84,6 +81,7 @@ "October" => "Octobre", "November" => "Novembre", "December" => "Decembre", +"web services under your control" => "Services web jos ton contraròtle", "Log out" => "Sortida", "Lost your password?" => "L'as perdut lo senhal ?", "remember" => "bremba-te", diff --git a/core/l10n/pl.php b/core/l10n/pl.php index ed6978a2dc..5ceb65534c 100644 --- a/core/l10n/pl.php +++ b/core/l10n/pl.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "restart hasła", "Use the following link to reset your password: {link}" => "Proszę użyć tego odnośnika do zresetowania hasła: {link}", "You will receive a link to reset your password via Email." => "Odnośnik służący do resetowania hasła zostanie wysłany na adres e-mail.", -"Requested" => "Żądane", -"Login failed!" => "Nie udało się zalogować!", "Username" => "Nazwa użytkownika", "Request reset" => "Żądanie resetowania", "Your password was reset" => "Zresetowano hasło", @@ -70,7 +68,6 @@ "Database tablespace" => "Obszar tabel bazy danych", "Database host" => "Komputer bazy danych", "Finish setup" => "Zakończ konfigurowanie", -"web services under your control" => "usługi internetowe pod kontrolą", "Sunday" => "Niedziela", "Monday" => "Poniedziałek", "Tuesday" => "Wtorek", @@ -90,6 +87,7 @@ "October" => "Październik", "November" => "Listopad", "December" => "Grudzień", +"web services under your control" => "usługi internetowe pod kontrolą", "Log out" => "Wylogowuje użytkownika", "Automatic logon rejected!" => "Automatyczne logowanie odrzucone!", "If you did not change your password recently, your account may be compromised!" => "Jeśli nie było zmianie niedawno hasło, Twoje konto może być zagrożone!", diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php index bbe016e228..f40328407f 100644 --- a/core/l10n/pt_BR.php +++ b/core/l10n/pt_BR.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "Redefinir senha ownCloud", "Use the following link to reset your password: {link}" => "Use o seguinte link para redefinir sua senha: {link}", "You will receive a link to reset your password via Email." => "Você receberá um link para redefinir sua senha via e-mail.", -"Requested" => "Solicitado", -"Login failed!" => "Falha ao fazer o login!", "Username" => "Nome de Usuário", "Request reset" => "Pedido de reposição", "Your password was reset" => "Sua senha foi mudada", @@ -67,7 +65,6 @@ "Database tablespace" => "Espaço de tabela do banco de dados", "Database host" => "Banco de dados do host", "Finish setup" => "Concluir configuração", -"web services under your control" => "web services sob seu controle", "Sunday" => "Domingo", "Monday" => "Segunda-feira", "Tuesday" => "Terça-feira", @@ -87,6 +84,7 @@ "October" => "Outubro", "November" => "Novembro", "December" => "Dezembro", +"web services under your control" => "web services sob seu controle", "Log out" => "Sair", "Please change your password to secure your account again." => "Por favor troque sua senha para tornar sua conta segura novamente.", "Lost your password?" => "Esqueçeu sua senha?", diff --git a/core/l10n/pt_PT.php b/core/l10n/pt_PT.php index 3780e830f6..c9daa645c4 100644 --- a/core/l10n/pt_PT.php +++ b/core/l10n/pt_PT.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Reposição da password ownCloud", "Use the following link to reset your password: {link}" => "Use o seguinte endereço para repor a sua password: {link}", "You will receive a link to reset your password via Email." => "Vai receber um endereço para repor a sua password", -"Requested" => "Pedido", -"Login failed!" => "Conexão falhado!", "Username" => "Utilizador", "Request reset" => "Pedir reposição", "Your password was reset" => "A sua password foi reposta", diff --git a/core/l10n/ro.php b/core/l10n/ro.php index c7cba8aad6..d0551be248 100644 --- a/core/l10n/ro.php +++ b/core/l10n/ro.php @@ -34,8 +34,6 @@ "ownCloud password reset" => "Resetarea parolei ownCloud ", "Use the following link to reset your password: {link}" => "Folosește următorul link pentru a reseta parola: {link}", "You will receive a link to reset your password via Email." => "Vei primi un mesaj prin care vei putea reseta parola via email", -"Requested" => "Solicitat", -"Login failed!" => "Autentificare eșuată", "Username" => "Utilizator", "Request reset" => "Cerere trimisă", "Your password was reset" => "Parola a fost resetată", @@ -64,7 +62,6 @@ "Database tablespace" => "Tabela de spațiu a bazei de date", "Database host" => "Bază date", "Finish setup" => "Finalizează instalarea", -"web services under your control" => "servicii web controlate de tine", "Sunday" => "Duminică", "Monday" => "Luni", "Tuesday" => "Marți", @@ -84,6 +81,7 @@ "October" => "Octombrie", "November" => "Noiembrie", "December" => "Decembrie", +"web services under your control" => "servicii web controlate de tine", "Log out" => "Ieșire", "Lost your password?" => "Ai uitat parola?", "remember" => "amintește", diff --git a/core/l10n/ru.php b/core/l10n/ru.php index b68c5367aa..7131beff98 100644 --- a/core/l10n/ru.php +++ b/core/l10n/ru.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Сброс пароля ", "Use the following link to reset your password: {link}" => "Используйте следующую ссылку чтобы сбросить пароль: {link}", "You will receive a link to reset your password via Email." => "На ваш адрес Email выслана ссылка для сброса пароля.", -"Requested" => "Запрошено", -"Login failed!" => "Не удалось войти!", "Username" => "Имя пользователя", "Request reset" => "Запросить сброс", "Your password was reset" => "Ваш пароль был сброшен", @@ -70,7 +68,6 @@ "Database tablespace" => "Табличое пространство базы данных", "Database host" => "Хост базы данных", "Finish setup" => "Завершить установку", -"web services under your control" => "Сетевые службы под твоим контролем", "Sunday" => "Воскресенье", "Monday" => "Понедельник", "Tuesday" => "Вторник", @@ -90,6 +87,7 @@ "October" => "Октябрь", "November" => "Ноябрь", "December" => "Декабрь", +"web services under your control" => "Сетевые службы под твоим контролем", "Log out" => "Выйти", "Automatic logon rejected!" => "Автоматический вход в систему отключен!", "If you did not change your password recently, your account may be compromised!" => "Если Вы недавно не меняли свой пароль, то Ваша учетная запись может быть скомпрометирована!", diff --git a/core/l10n/ru_RU.php b/core/l10n/ru_RU.php index 065803eeb4..a84b4d18f0 100644 --- a/core/l10n/ru_RU.php +++ b/core/l10n/ru_RU.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Переназначение пароля", "Use the following link to reset your password: {link}" => "Воспользуйтесь следующей ссылкой для переназначения пароля: {link}", "You will receive a link to reset your password via Email." => "Вы получите ссылку для восстановления пароля по электронной почте.", -"Requested" => "Запрашиваемое", -"Login failed!" => "Войти не удалось!", "Username" => "Имя пользователя", "Request reset" => "Сброс запроса", "Your password was reset" => "Ваш пароль был переустановлен", @@ -70,7 +68,6 @@ "Database tablespace" => "Табличная область базы данных", "Database host" => "Сервер базы данных", "Finish setup" => "Завершение настройки", -"web services under your control" => "веб-сервисы под Вашим контролем", "Sunday" => "Воскресенье", "Monday" => "Понедельник", "Tuesday" => "Вторник", @@ -90,6 +87,7 @@ "October" => "Октябрь", "November" => "Ноябрь", "December" => "Декабрь", +"web services under your control" => "веб-сервисы под Вашим контролем", "Log out" => "Выйти", "Automatic logon rejected!" => "Автоматический вход в систему отклонен!", "If you did not change your password recently, your account may be compromised!" => "Если Вы недавно не меняли пароль, Ваш аккаунт может быть подвергнут опасности!", diff --git a/core/l10n/si_LK.php b/core/l10n/si_LK.php index a57c8b5854..eaab6ba5d8 100644 --- a/core/l10n/si_LK.php +++ b/core/l10n/si_LK.php @@ -19,7 +19,6 @@ "Help" => "උදව්", "Add" => "එක් කරන්න", "Data folder" => "දත්ත ෆෝල්ඩරය", -"web services under your control" => "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්", "Sunday" => "ඉරිදා", "Monday" => "සඳුදා", "Tuesday" => "අඟහරුවාදා", @@ -39,5 +38,6 @@ "October" => "ඔක්තෝබර්", "November" => "නොවැම්බර්", "December" => "දෙසැම්බර්", +"web services under your control" => "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්", "next" => "ඊළඟ" ); diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php index 0a7a86676a..5746ae07a6 100644 --- a/core/l10n/sk_SK.php +++ b/core/l10n/sk_SK.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Obnovenie hesla pre ownCloud", "Use the following link to reset your password: {link}" => "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}", "You will receive a link to reset your password via Email." => "Odkaz pre obnovenie hesla obdržíte e-mailom.", -"Requested" => "Požiadané", -"Login failed!" => "Prihlásenie zlyhalo!", "Username" => "Prihlasovacie meno", "Request reset" => "Požiadať o obnovenie", "Your password was reset" => "Vaše heslo bolo obnovené", diff --git a/core/l10n/sl.php b/core/l10n/sl.php index 2c698d87fc..6c63ba0466 100644 --- a/core/l10n/sl.php +++ b/core/l10n/sl.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "Ponastavitev gesla ownCloud", "Use the following link to reset your password: {link}" => "Uporabite naslednjo povezavo za ponastavitev gesla: {link}", "You will receive a link to reset your password via Email." => "Na elektronski naslov boste prejeli povezavo za ponovno nastavitev gesla.", -"Requested" => "Zahtevano", -"Login failed!" => "Prijava je spodletela!", "Username" => "Uporabniško Ime", "Request reset" => "Zahtevaj ponastavitev", "Your password was reset" => "Geslo je ponastavljeno", @@ -65,7 +63,6 @@ "Database tablespace" => "Razpredelnica podatkovne zbirke", "Database host" => "Gostitelj podatkovne zbirke", "Finish setup" => "Dokončaj namestitev", -"web services under your control" => "spletne storitve pod vašim nadzorom", "Sunday" => "nedelja", "Monday" => "ponedeljek", "Tuesday" => "torek", @@ -85,6 +82,7 @@ "October" => "oktober", "November" => "november", "December" => "december", +"web services under your control" => "spletne storitve pod vašim nadzorom", "Log out" => "Odjava", "Automatic logon rejected!" => "Samodejno prijavljanje je zavrnjeno!", "Please change your password to secure your account again." => "Spremenite geslo za izboljšanje zaščite računa.", diff --git a/core/l10n/sr.php b/core/l10n/sr.php index a8aa0d86c1..b2576c4444 100644 --- a/core/l10n/sr.php +++ b/core/l10n/sr.php @@ -4,8 +4,6 @@ "Password" => "Лозинка", "Use the following link to reset your password: {link}" => "Овом везом ресетујте своју лозинку: {link}", "You will receive a link to reset your password via Email." => "Добићете везу за ресетовање лозинке путем е-поште.", -"Requested" => "Захтевано", -"Login failed!" => "Несупела пријава!", "Username" => "Корисничко име", "Request reset" => "Захтевај ресетовање", "Your password was reset" => "Ваша лозинка је ресетована", @@ -29,7 +27,6 @@ "Database name" => "Име базе", "Database host" => "Домаћин базе", "Finish setup" => "Заврши подешавање", -"web services under your control" => "веб сервиси под контролом", "Sunday" => "Недеља", "Monday" => "Понедељак", "Tuesday" => "Уторак", @@ -49,6 +46,7 @@ "October" => "Октобар", "November" => "Новембар", "December" => "Децембар", +"web services under your control" => "веб сервиси под контролом", "Log out" => "Одјава", "Lost your password?" => "Изгубили сте лозинку?", "remember" => "упамти", diff --git a/core/l10n/sr@latin.php b/core/l10n/sr@latin.php index 71e8bf35d3..af48a84572 100644 --- a/core/l10n/sr@latin.php +++ b/core/l10n/sr@latin.php @@ -3,8 +3,6 @@ "Cancel" => "Otkaži", "Password" => "Lozinka", "You will receive a link to reset your password via Email." => "Dobićete vezu za resetovanje lozinke putem e-pošte.", -"Requested" => "Zahtevano", -"Login failed!" => "Nesupela prijava!", "Username" => "Korisničko ime", "Request reset" => "Zahtevaj resetovanje", "Your password was reset" => "Vaša lozinka je resetovana", diff --git a/core/l10n/sv.php b/core/l10n/sv.php index 68acd37912..86c841bbaa 100644 --- a/core/l10n/sv.php +++ b/core/l10n/sv.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud lösenordsåterställning", "Use the following link to reset your password: {link}" => "Använd följande länk för att återställa lösenordet: {link}", "You will receive a link to reset your password via Email." => "Du får en länk att återställa ditt lösenord via e-post.", -"Requested" => "Begärd", -"Login failed!" => "Misslyckad inloggning!", "Username" => "Användarnamn", "Request reset" => "Begär återställning", "Your password was reset" => "Ditt lösenord har återställts", @@ -70,7 +68,6 @@ "Database tablespace" => "Databas tabellutrymme", "Database host" => "Databasserver", "Finish setup" => "Avsluta installation", -"web services under your control" => "webbtjänster under din kontroll", "Sunday" => "Söndag", "Monday" => "Måndag", "Tuesday" => "Tisdag", @@ -90,6 +87,7 @@ "October" => "Oktober", "November" => "November", "December" => "December", +"web services under your control" => "webbtjänster under din kontroll", "Log out" => "Logga ut", "Automatic logon rejected!" => "Automatisk inloggning inte tillåten!", "If you did not change your password recently, your account may be compromised!" => "Om du inte har ändrat ditt lösenord nyligen så kan ditt konto vara manipulerat!", diff --git a/core/l10n/ta_LK.php b/core/l10n/ta_LK.php index 4fe2f96690..808929b8f3 100644 --- a/core/l10n/ta_LK.php +++ b/core/l10n/ta_LK.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "ownCloud இன் கடவுச்சொல் மீளமைப்பு", "Use the following link to reset your password: {link}" => "உங்கள் கடவுச்சொல்லை மீளமைக்க பின்வரும் இணைப்பை பயன்படுத்தவும் : {இணைப்பு}", "You will receive a link to reset your password via Email." => "நீங்கள் மின்னஞ்சல் மூலம் உங்களுடைய கடவுச்சொல்லை மீளமைப்பதற்கான இணைப்பை பெறுவீர்கள். ", -"Requested" => "கோரப்பட்டது", -"Login failed!" => "புகுபதிகை தவறானது!", "Username" => "பயனாளர் பெயர்", "Request reset" => "கோரிக்கை மீளமைப்பு", "Your password was reset" => "உங்களுடைய கடவுச்சொல் மீளமைக்கப்பட்டது", @@ -70,7 +68,6 @@ "Database tablespace" => "தரவுத்தள அட்டவணை", "Database host" => "தரவுத்தள ஓம்புனர்", "Finish setup" => "அமைப்பை முடிக்க", -"web services under your control" => "உங்கள் கட்டுப்பாட்டின் கீழ் இணைய சேவைகள்", "Sunday" => "ஞாயிற்றுக்கிழமை", "Monday" => "திங்கட்கிழமை", "Tuesday" => "செவ்வாய்க்கிழமை", @@ -90,6 +87,7 @@ "October" => "ஐப்பசி", "November" => "கார்த்திகை", "December" => "மார்கழி", +"web services under your control" => "உங்கள் கட்டுப்பாட்டின் கீழ் இணைய சேவைகள்", "Log out" => "விடுபதிகை செய்க", "Automatic logon rejected!" => "தன்னிச்சையான புகுபதிகை நிராகரிப்பட்டது!", "If you did not change your password recently, your account may be compromised!" => "உங்களுடைய கடவுச்சொல்லை அண்மையில் மாற்றவில்லையின், உங்களுடைய கணக்கு சமரசமாகிவிடும்!", diff --git a/core/l10n/th_TH.php b/core/l10n/th_TH.php index 75dade377e..b349018d0d 100644 --- a/core/l10n/th_TH.php +++ b/core/l10n/th_TH.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "รีเซ็ตรหัสผ่าน ownCloud", "Use the following link to reset your password: {link}" => "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", "You will receive a link to reset your password via Email." => "คุณจะได้รับลิงค์เพื่อกำหนดรหัสผ่านใหม่ทางอีเมล์", -"Requested" => "ส่งคำร้องเรียบร้อยแล้ว", -"Login failed!" => "ไม่สามารถเข้าสู่ระบบได้!", "Username" => "ชื่อผู้ใช้งาน", "Request reset" => "ขอเปลี่ยนรหัสใหม่", "Your password was reset" => "รหัสผ่านของคุณถูกเปลี่ยนเรียบร้อยแล้ว", @@ -65,7 +63,6 @@ "Database tablespace" => "พื้นที่ตารางในฐานข้อมูล", "Database host" => "Database host", "Finish setup" => "ติดตั้งเรียบร้อยแล้ว", -"web services under your control" => "web services under your control", "Sunday" => "วันอาทิตย์", "Monday" => "วันจันทร์", "Tuesday" => "วันอังคาร", @@ -85,6 +82,7 @@ "October" => "ตุลาคม", "November" => "พฤศจิกายน", "December" => "ธันวาคม", +"web services under your control" => "web services under your control", "Log out" => "ออกจากระบบ", "Lost your password?" => "ลืมรหัสผ่าน?", "remember" => "จำรหัสผ่าน", diff --git a/core/l10n/tr.php b/core/l10n/tr.php index d61821f7c4..faaef3d4fe 100644 --- a/core/l10n/tr.php +++ b/core/l10n/tr.php @@ -15,8 +15,6 @@ "ownCloud password reset" => "ownCloud parola sıfırlama", "Use the following link to reset your password: {link}" => "Bu bağlantıyı kullanarak parolanızı sıfırlayın: {link}", "You will receive a link to reset your password via Email." => "Parolanızı sıfırlamak için bir bağlantı Eposta olarak gönderilecek.", -"Requested" => "İstendi", -"Login failed!" => "Giriş başarısız!", "Username" => "Kullanıcı adı", "Request reset" => "Sıfırlama iste", "Your password was reset" => "Parolanız sıfırlandı", @@ -44,7 +42,6 @@ "Database tablespace" => "Veritabanı tablo alanı", "Database host" => "Veritabanı sunucusu", "Finish setup" => "Kurulumu tamamla", -"web services under your control" => "kontrolünüzdeki web servisleri", "Sunday" => "Pazar", "Monday" => "Pazartesi", "Tuesday" => "Salı", @@ -64,6 +61,7 @@ "October" => "Ekim", "November" => "Kasım", "December" => "Aralık", +"web services under your control" => "kontrolünüzdeki web servisleri", "Log out" => "Çıkış yap", "Lost your password?" => "Parolanızı mı unuttunuz?", "remember" => "hatırla", diff --git a/core/l10n/uk.php b/core/l10n/uk.php index 17a68987bd..480fab2afc 100644 --- a/core/l10n/uk.php +++ b/core/l10n/uk.php @@ -25,7 +25,6 @@ "Database password" => "Пароль для бази даних", "Database name" => "Назва бази даних", "Finish setup" => "Завершити налаштування", -"web services under your control" => "веб-сервіс під вашим контролем", "Sunday" => "Неділя", "Monday" => "Понеділок", "Tuesday" => "Вівторок", @@ -45,6 +44,7 @@ "October" => "Жовтень", "November" => "Листопад", "December" => "Грудень", +"web services under your control" => "веб-сервіс під вашим контролем", "Log out" => "Вихід", "Lost your password?" => "Забули пароль?", "remember" => "запам'ятати", diff --git a/core/l10n/vi.php b/core/l10n/vi.php index 254cf6212d..e937829406 100644 --- a/core/l10n/vi.php +++ b/core/l10n/vi.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "Khôi phục mật khẩu Owncloud ", "Use the following link to reset your password: {link}" => "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}", "You will receive a link to reset your password via Email." => "Vui lòng kiểm tra Email để khôi phục lại mật khẩu.", -"Requested" => "Yêu cầu", -"Login failed!" => "Bạn đã nhập sai mật khẩu hay tên người dùng !", "Username" => "Tên người dùng", "Request reset" => "Yêu cầu thiết lập lại ", "Your password was reset" => "Mật khẩu của bạn đã được khôi phục", diff --git a/core/l10n/zh_CN.GB2312.php b/core/l10n/zh_CN.GB2312.php index cf28e77ef5..0a2b72f8f4 100644 --- a/core/l10n/zh_CN.GB2312.php +++ b/core/l10n/zh_CN.GB2312.php @@ -35,8 +35,6 @@ "ownCloud password reset" => "私有云密码重置", "Use the following link to reset your password: {link}" => "使用下面的链接来重置你的密码:{link}", "You will receive a link to reset your password via Email." => "你将会收到一个重置密码的链接", -"Requested" => "请求", -"Login failed!" => "登陆失败!", "Username" => "用户名", "Request reset" => "要求重置", "Your password was reset" => "你的密码已经被重置了", @@ -67,7 +65,6 @@ "Database tablespace" => "数据库表格空间", "Database host" => "数据库主机", "Finish setup" => "完成安装", -"web services under your control" => "你控制下的网络服务", "Sunday" => "星期天", "Monday" => "星期一", "Tuesday" => "星期二", @@ -87,6 +84,7 @@ "October" => "十月", "November" => "十一月", "December" => "十二月", +"web services under your control" => "你控制下的网络服务", "Log out" => "注销", "Automatic logon rejected!" => "自动登录被拒绝!", "If you did not change your password recently, your account may be compromised!" => "如果您最近没有修改您的密码,那您的帐号可能被攻击了!", diff --git a/core/l10n/zh_CN.php b/core/l10n/zh_CN.php index d081467913..a7740dea9b 100644 --- a/core/l10n/zh_CN.php +++ b/core/l10n/zh_CN.php @@ -38,8 +38,6 @@ "ownCloud password reset" => "重置 ownCloud 密码", "Use the following link to reset your password: {link}" => "使用以下链接重置您的密码:{link}", "You will receive a link to reset your password via Email." => "您将会收到包含可以重置密码链接的邮件。", -"Requested" => "已请求", -"Login failed!" => "登录失败!", "Username" => "用户名", "Request reset" => "请求重置", "Your password was reset" => "您的密码已重置", diff --git a/core/l10n/zh_TW.php b/core/l10n/zh_TW.php index a507a71edc..703389d181 100644 --- a/core/l10n/zh_TW.php +++ b/core/l10n/zh_TW.php @@ -15,8 +15,6 @@ "ownCloud password reset" => "ownCloud 密碼重設", "Use the following link to reset your password: {link}" => "請循以下聯結重設你的密碼: (聯結) ", "You will receive a link to reset your password via Email." => "重設密碼的連結將會寄到你的電子郵件信箱", -"Requested" => "已要求", -"Login failed!" => "登入失敗!", "Username" => "使用者名稱", "Request reset" => "要求重設", "Your password was reset" => "你的密碼已重設", @@ -44,7 +42,6 @@ "Database tablespace" => "資料庫 tablespace", "Database host" => "資料庫主機", "Finish setup" => "完成設定", -"web services under your control" => "網路服務已在你控制", "Sunday" => "週日", "Monday" => "週一", "Tuesday" => "週二", @@ -64,6 +61,7 @@ "October" => "十月", "November" => "十一月", "December" => "十二月", +"web services under your control" => "網路服務已在你控制", "Log out" => "登出", "Lost your password?" => "忘記密碼?", "remember" => "記住", diff --git a/l10n/ar/core.po b/l10n/ar/core.po index 428d99fb2b..9d6d29fb96 100644 --- a/l10n/ar/core.po +++ b/l10n/ar/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "تعديلات" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "سوف نرسل لك بريد يحتوي على وصلة لتجديد كلمة السر." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "تم طلب" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "محاولة دخول فاشلة!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "خادم قاعدة البيانات" msgid "Finish setup" msgstr "انهاء التعديلات" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "خدمات الوب تحت تصرفك" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "الاحد" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "الأثنين" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "الثلاثاء" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "الاربعاء" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "الخميس" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "الجمعه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "السبت" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "كانون الثاني" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "شباط" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "آذار" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "نيسان" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "أيار" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "حزيران" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "تموز" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "آب" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "أيلول" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "تشرين الاول" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "تشرين الثاني" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "كانون الاول" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "خدمات الوب تحت تصرفك" + #: templates/layout.user.php:38 msgid "Log out" msgstr "الخروج" diff --git a/l10n/bg_BG/core.po b/l10n/bg_BG/core.po index 6b27f8227b..60030a8f3e 100644 --- a/l10n/bg_BG/core.po +++ b/l10n/bg_BG/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Категорията вече съществува:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Настройки" @@ -167,7 +167,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Ще получите връзка за нулиране на паролата Ви." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Заявено" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Входа пропадна!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Хост за базата" msgid "Finish setup" msgstr "Завършване на настройките" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Неделя" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понеделник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Сряда" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвъртък" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Петък" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Събота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Януари" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Февруари" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Май" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Юни" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Юли" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Септември" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Октомври" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Ноември" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Декември" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Изход" diff --git a/l10n/ca/core.po b/l10n/ca/core.po index 676309a37f..ff1e9e6381 100644 --- a/l10n/ca/core.po +++ b/l10n/ca/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "No s'ha facilitat cap nom per l'aplicació." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "No voleu afegir cap categoria?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Aquesta categoria ja existeix:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Arranjament" @@ -165,7 +165,7 @@ msgstr "Error en eliminar la data d'expiració" msgid "Error setting expiration date" msgstr "Error en establir la data d'expiració" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "estableix de nou la contrasenya Owncloud" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Sol·licitat" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "No s'ha pogut iniciar la sessió" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Ordinador central de la base de dades" msgid "Finish setup" msgstr "Acaba la configuració" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "controleu els vostres serveis web" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Diumenge" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Dilluns" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dimarts" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Dimecres" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Dijous" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Divendres" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Dissabte" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Gener" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Febrer" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Març" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maig" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juny" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juliol" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agost" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Setembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Octubre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Desembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "controleu els vostres serveis web" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Surt" diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po index 849cd94297..3633b45706 100644 --- a/l10n/cs_CZ/core.po +++ b/l10n/cs_CZ/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nezadán název aplikace." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Žádná kategorie k přidání?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Tato kategorie již existuje: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Nastavení" @@ -167,7 +167,7 @@ msgstr "Chyba při odstraňování data vypršení platnosti" msgid "Error setting expiration date" msgstr "Chyba při nastavení data vypršení platnosti" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Obnovení hesla pro ownCloud" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Bude Vám e-mailem zaslán odkaz pro obnovu hesla." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Požadováno" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Přihlášení selhalo." +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Hostitel databáze" msgid "Finish setup" msgstr "Dokončit nastavení" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "webové služby pod Vaší kontrolou" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Neděle" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Pondělí" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Úterý" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Středa" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Čtvrtek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Pátek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sobota" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Leden" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Únor" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Březen" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Duben" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Květen" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Červen" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Červenec" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Srpen" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Září" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Říjen" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Listopad" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Prosinec" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "webové služby pod Vaší kontrolou" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Odhlásit se" diff --git a/l10n/da/core.po b/l10n/da/core.po index f9d82bb221..3ceef1b8d5 100644 --- a/l10n/da/core.po +++ b/l10n/da/core.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" @@ -24,19 +24,19 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Applikationens navn ikke medsendt" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ingen kategori at tilføje?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Denne kategori eksisterer allerede: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Indstillinger" @@ -170,7 +170,7 @@ msgstr "Fejl ved fjernelse af udløbsdato" msgid "Error setting expiration date" msgstr "Fejl under sætning af udløbsdato" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Nulstil ownCloud kodeord" @@ -183,12 +183,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du vil modtage et link til at nulstille dit kodeord via email." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Forespugt" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login fejlede!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -321,86 +321,86 @@ msgstr "Databasehost" msgid "Finish setup" msgstr "Afslut opsætning" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Webtjenester under din kontrol" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Mandag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tirsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Lørdag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marts" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "December" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Webtjenester under din kontrol" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Log ud" diff --git a/l10n/de/core.po b/l10n/de/core.po index 7718ab75bd..ba849ed4b7 100644 --- a/l10n/de/core.po +++ b/l10n/de/core.po @@ -21,8 +21,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" @@ -31,19 +31,19 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Der Anwendungsname wurde nicht angegeben." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Keine Kategorie hinzuzufügen?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Kategorie existiert bereits:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Einstellungen" @@ -177,7 +177,7 @@ msgstr "Fehler beim entfernen des Ablaufdatums" msgid "Error setting expiration date" msgstr "Fehler beim Setzen des Ablaufdatums" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-Passwort zurücksetzen" @@ -190,12 +190,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du erhälst einen Link per E-Mail, um Dein Passwort zurückzusetzen." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Angefragt" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login fehlgeschlagen!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -328,86 +328,86 @@ msgstr "Datenbank-Host" msgid "Finish setup" msgstr "Installation abschließen" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Web-Services unter Ihrer Kontrolle" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Sonntag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Montag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dienstag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mittwoch" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Donnerstag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Freitag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Samstag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "März" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Dezember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Web-Services unter Ihrer Kontrolle" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Abmelden" diff --git a/l10n/de_DE/core.po b/l10n/de_DE/core.po index 2b48fb5a01..56fff75710 100644 --- a/l10n/de_DE/core.po +++ b/l10n/de_DE/core.po @@ -21,8 +21,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" @@ -31,19 +31,19 @@ msgstr "" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Der Anwendungsname wurde nicht angegeben." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Keine Kategorie hinzuzufügen?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Kategorie existiert bereits:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Einstellungen" @@ -69,7 +69,7 @@ msgstr "OK" #: js/oc-vcategories.js:68 msgid "No categories selected for deletion." -msgstr "Es wurde keine Kategorien zum Löschen ausgewählt." +msgstr "Es wurden keine Kategorien zum Löschen ausgewählt." #: js/oc-vcategories.js:68 js/share.js:114 js/share.js:121 js/share.js:505 #: js/share.js:517 @@ -177,7 +177,7 @@ msgstr "Fehler beim entfernen des Ablaufdatums" msgid "Error setting expiration date" msgstr "Fehler beim Setzen des Ablaufdatums" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-Passwort zurücksetzen" @@ -190,12 +190,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Sie erhalten einen Link per E-Mail, um Ihr Passwort zurückzusetzen." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Angefragt" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login fehlgeschlagen!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -328,86 +328,86 @@ msgstr "Datenbank-Host" msgid "Finish setup" msgstr "Installation abschließen" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Web-Services unter Ihrer Kontrolle" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Sonntag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Montag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dienstag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mittwoch" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Donnerstag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Freitag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Samstag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "März" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Dezember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Web-Services unter Ihrer Kontrolle" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Abmelden" diff --git a/l10n/de_DE/settings.po b/l10n/de_DE/settings.po index cc013f2d0e..8ca231f085 100644 --- a/l10n/de_DE/settings.po +++ b/l10n/de_DE/settings.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-16 23:38+0200\n" -"PO-Revision-Date: 2012-10-16 21:34+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 17:05+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,69 +31,69 @@ msgstr "" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/apps/ocs.php:23 +#: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" msgstr "Die Liste der Anwendungen im Store konnte nicht geladen werden." -#: ajax/creategroup.php:12 +#: ajax/creategroup.php:10 msgid "Group already exists" -msgstr "Gruppe existiert bereits" +msgstr "Die Gruppe existiert bereits" -#: ajax/creategroup.php:21 +#: ajax/creategroup.php:19 msgid "Unable to add group" -msgstr "Gruppe konnte nicht angelegt werden" +msgstr "Die Gruppe konnte nicht angelegt werden" -#: ajax/enableapp.php:14 +#: ajax/enableapp.php:12 msgid "Could not enable app. " -msgstr "App konnte nicht aktiviert werden." +msgstr "Die Anwendung konnte nicht aktiviert werden." + +#: ajax/lostpassword.php:12 +msgid "Email saved" +msgstr "E-Mail-Adresse gespeichert" #: ajax/lostpassword.php:14 -msgid "Email saved" -msgstr "E-Mail Adresse gespeichert" - -#: ajax/lostpassword.php:16 msgid "Invalid email" -msgstr "Ungültige E-Mail Adresse" +msgstr "Ungültige E-Mail-Adresse" -#: ajax/openid.php:16 +#: ajax/openid.php:13 msgid "OpenID Changed" msgstr "OpenID geändert" -#: ajax/openid.php:18 ajax/setlanguage.php:20 ajax/setlanguage.php:23 +#: ajax/openid.php:15 ajax/setlanguage.php:17 ajax/setlanguage.php:20 msgid "Invalid request" msgstr "Ungültige Anfrage" -#: ajax/removegroup.php:16 +#: ajax/removegroup.php:13 msgid "Unable to delete group" -msgstr "Gruppe konnte nicht gelöscht werden" +msgstr "Die Gruppe konnte nicht gelöscht werden" -#: ajax/removeuser.php:18 ajax/setquota.php:18 ajax/togglegroups.php:15 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 msgid "Authentication error" msgstr "Fehler bei der Anmeldung" -#: ajax/removeuser.php:27 +#: ajax/removeuser.php:24 msgid "Unable to delete user" -msgstr "Benutzer konnte nicht gelöscht werden" +msgstr "Der Benutzer konnte nicht gelöscht werden" -#: ajax/setlanguage.php:18 +#: ajax/setlanguage.php:15 msgid "Language changed" msgstr "Sprache geändert" -#: ajax/togglegroups.php:25 +#: ajax/togglegroups.php:22 #, php-format msgid "Unable to add user to group %s" msgstr "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden" -#: ajax/togglegroups.php:31 +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to remove user from group %s" msgstr "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden" -#: js/apps.js:28 js/apps.js:65 +#: js/apps.js:28 js/apps.js:67 msgid "Disable" msgstr "Deaktivieren" -#: js/apps.js:28 js/apps.js:54 +#: js/apps.js:28 js/apps.js:55 msgid "Enable" msgstr "Aktivieren" @@ -130,7 +130,7 @@ msgstr "Führt eine Aufgabe bei jeder geladenen Seite aus." msgid "" "cron.php is registered at a webcron service. Call the cron.php page in the " "owncloud root once a minute over http." -msgstr "cron.php ist bei einem Webcron-Dienst registriert. Ruf die Seite cron.php im ownCloud-Root minütlich per HTTP auf." +msgstr "cron.php ist bei einem Webcron-Dienst registriert. Rufen Sie die Seite cron.php im ownCloud-Root minütlich per HTTP auf." #: templates/admin.php:49 msgid "" @@ -168,7 +168,7 @@ msgstr "Erlaubt Nutzern, Dateien die mit ihnen geteilt wurden, erneut zu teilen" #: templates/admin.php:79 msgid "Allow users to share with anyone" -msgstr "Erlaubet Nutzern mit jedem zu Teilen" +msgstr "Erlaubt Nutzern mit jedem zu teilen" #: templates/admin.php:81 msgid "Allow users to only share with users in their groups" @@ -255,7 +255,7 @@ msgstr "Ihr Passwort wurde geändert." #: templates/personal.php:20 msgid "Unable to change your password" -msgstr "Passwort konnte nicht geändert werden" +msgstr "Das Passwort konnte nicht geändert werden" #: templates/personal.php:21 msgid "Current password" diff --git a/l10n/el/core.po b/l10n/el/core.po index 4b7f63dd08..6d2518ec25 100644 --- a/l10n/el/core.po +++ b/l10n/el/core.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" @@ -22,19 +22,19 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Δε προσδιορίστηκε όνομα εφαρμογής" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Δεν έχετε να προστέσθέσεται μια κα" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Αυτή η κατηγορία υπάρχει ήδη" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ρυθμίσεις" @@ -168,7 +168,7 @@ msgstr "Σφάλμα κατά την διαγραφή της ημ. λήξης" msgid "Error setting expiration date" msgstr "Σφάλμα κατά τον ορισμό ημ. λήξης" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Επαναφορά κωδικού ownCloud" @@ -181,12 +181,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Θα λάβετε ένα σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας μέσω ηλεκτρονικού ταχυδρομείου." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Ζητήθησαν" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Η σύνδεση απέτυχε!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -319,86 +319,86 @@ msgstr "Διακομιστής βάσης δεδομένων" msgid "Finish setup" msgstr "Ολοκλήρωση εγκατάστασης" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Υπηρεσίες web υπό τον έλεγχό σας" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Κυριακή" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Δευτέρα" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Τρίτη" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Τετάρτη" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Πέμπτη" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Παρασκευή" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Σάββατο" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Ιανουάριος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Φεβρουάριος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Μάρτιος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Απρίλιος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Μάϊος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Ιούνιος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Ιούλιος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Αύγουστος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Σεπτέμβριος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Οκτώβριος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Νοέμβριος" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Δεκέμβριος" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Υπηρεσίες web υπό τον έλεγχό σας" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Αποσύνδεση" diff --git a/l10n/eo/core.po b/l10n/eo/core.po index f2a61ea15f..43548ab036 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nomo de aplikaĵo ne proviziiĝis." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ĉu neniu kategorio estas aldonota?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Ĉi tiu kategorio jam ekzistas: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Agordo" @@ -166,7 +166,7 @@ msgstr "Eraro dum malagordado de limdato" msgid "Error setting expiration date" msgstr "Eraro dum agordado de limdato" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "La pasvorto de ownCloud restariĝis." @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vi ricevos ligilon retpoŝte por rekomencigi vian pasvorton." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Petita" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Ensaluto malsukcesis!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -317,86 +317,86 @@ msgstr "Datumbaza gastigo" msgid "Finish setup" msgstr "Fini la instalon" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "TTT-servoj sub via kontrolo" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "dimanĉo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "lundo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "mardo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "merkredo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "ĵaŭdo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "vendredo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "sabato" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januaro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februaro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Aprilo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Majo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Junio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Aŭgusto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktobro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Decembro" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "TTT-servoj sub via kontrolo" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Elsaluti" diff --git a/l10n/es/core.po b/l10n/es/core.po index 901d83c47d..021fc2be9f 100644 --- a/l10n/es/core.po +++ b/l10n/es/core.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" @@ -26,19 +26,19 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nombre de la aplicación no provisto." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "¿Ninguna categoría para añadir?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Esta categoría ya existe: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ajustes" @@ -172,7 +172,7 @@ msgstr "Error al eliminar la fecha de caducidad" msgid "Error setting expiration date" msgstr "Error estableciendo fecha de caducidad" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reiniciar contraseña de ownCloud" @@ -185,12 +185,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Recibirás un enlace por correo electrónico para restablecer tu contraseña" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Pedido" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "¡Fallo al iniciar sesión!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -323,86 +323,86 @@ msgstr "Host de la base de datos" msgid "Finish setup" msgstr "Completar la instalación" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "servicios web bajo tu control" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Domingo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Lunes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Martes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Miércoles" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Jueves" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Viernes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sábado" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Enero" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Febrero" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marzo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mayo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Junio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agosto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septiembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Octubre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Noviembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Diciembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "servicios web bajo tu control" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Salir" diff --git a/l10n/es/lib.po b/l10n/es/lib.po index 1da529bebc..191b6f8b22 100644 --- a/l10n/es/lib.po +++ b/l10n/es/lib.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # Rubén Trujillo , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:11+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 11:23+0000\n" +"Last-Translator: scambra \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -81,7 +82,7 @@ msgstr "Texto" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "Imágenes" #: template.php:87 msgid "seconds ago" diff --git a/l10n/es_AR/core.po b/l10n/es_AR/core.po index 90c9d1f802..ce5b916e65 100644 --- a/l10n/es_AR/core.po +++ b/l10n/es_AR/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-26 02:02+0200\n" -"PO-Revision-Date: 2012-10-25 15:40+0000\n" -"Last-Translator: cjtess \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,19 +18,19 @@ msgstr "" "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nombre de la aplicación no provisto." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "¿Ninguna categoría para añadir?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Esta categoría ya existe: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ajustes" @@ -164,7 +164,7 @@ msgstr "Error al remover la fecha de caducidad" msgid "Error setting expiration date" msgstr "Error al asignar fecha de vencimiento" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Restablecer contraseña de ownCloud" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vas a recibir un enlace por e-mail para restablecer tu contraseña" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Pedido" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "¡Error al iniciar sesión!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 diff --git a/l10n/et_EE/core.po b/l10n/et_EE/core.po index ea45b0f7f0..ea14a5f28c 100644 --- a/l10n/et_EE/core.po +++ b/l10n/et_EE/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Rakenduse nime pole sisestatud." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Pole kategooriat, mida lisada?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "See kategooria on juba olemas: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Seaded" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud parooli taastamine" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Sinu parooli taastamise link saadetakse sulle e-postile." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Kohustuslik" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Sisselogimine ebaõnnestus!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Andmebaasi host" msgid "Finish setup" msgstr "Lõpeta seadistamine" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "veebiteenused sinu kontrolli all" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Pühapäev" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Esmaspäev" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Teisipäev" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Kolmapäev" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Neljapäev" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Reede" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Laupäev" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Jaanuar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Veebruar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Märts" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Aprill" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juuni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juuli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktoober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Detsember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "veebiteenused sinu kontrolli all" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Logi välja" diff --git a/l10n/eu/core.po b/l10n/eu/core.po index baf8bf0a74..cf311d244f 100644 --- a/l10n/eu/core.po +++ b/l10n/eu/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Aplikazioaren izena falta da" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ez dago gehitzeko kategoriarik?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Kategoria hau dagoeneko existitzen da:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ezarpenak" @@ -165,7 +165,7 @@ msgstr "Errorea izan da muga data kentzean" msgid "Error setting expiration date" msgstr "Errore bat egon da muga data ezartzean" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-en pasahitza berrezarri" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Eskatuta" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Saio hasierak huts egin du!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Datubasearen hostalaria" msgid "Finish setup" msgstr "Bukatu konfigurazioa" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "web zerbitzuak zure kontrolpean" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Igandea" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Astelehena" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Asteartea" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Asteazkena" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Osteguna" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Ostirala" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Larunbata" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Urtarrila" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Otsaila" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Martxoa" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Apirila" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maiatza" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Ekaina" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Uztaila" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Abuztua" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Iraila" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Urria" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Azaroa" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Abendua" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "web zerbitzuak zure kontrolpean" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Saioa bukatu" diff --git a/l10n/fa/core.po b/l10n/fa/core.po index adad4119c5..1c692ad407 100644 --- a/l10n/fa/core.po +++ b/l10n/fa/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "نام برنامه پیدا نشد" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "آیا گروه دیگری برای افزودن ندارید" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "این گروه از قبل اضافه شده" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "تنظیمات" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "پسورد ابرهای شما تغییرکرد" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "شما یک نامه الکترونیکی حاوی یک لینک جهت بازسازی گذرواژه دریافت خواهید کرد." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "درخواست" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "ورود ناموفق بود" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "هاست پایگاه داده" msgid "Finish setup" msgstr "اتمام نصب" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "سرویس وب تحت کنترل شما" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "یکشنبه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "دوشنبه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "سه شنبه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "چهارشنبه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "پنجشنبه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "جمعه" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "شنبه" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "ژانویه" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "فبریه" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "مارس" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "آوریل" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "می" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "ژوئن" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "جولای" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "آگوست" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "سپتامبر" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "اکتبر" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "نوامبر" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "دسامبر" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "سرویس وب تحت کنترل شما" + #: templates/layout.user.php:38 msgid "Log out" msgstr "خروج" diff --git a/l10n/fi_FI/core.po b/l10n/fi_FI/core.po index 6ca7e1bdfc..e71e8f3c32 100644 --- a/l10n/fi_FI/core.po +++ b/l10n/fi_FI/core.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" @@ -24,19 +24,19 @@ msgstr "" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Sovelluksen nimeä ei määritelty." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ei lisättävää luokkaa?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Tämä luokka on jo olemassa: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Asetukset" @@ -170,7 +170,7 @@ msgstr "Virhe purettaessa eräpäivää" msgid "Error setting expiration date" msgstr "Virhe päättymispäivää asettaessa" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-salasanan nollaus" @@ -183,12 +183,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Saat sähköpostitse linkin nollataksesi salasanan." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Tilattu" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Kirjautuminen epäonnistui!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -321,86 +321,86 @@ msgstr "Tietokantapalvelin" msgid "Finish setup" msgstr "Viimeistele asennus" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "verkkopalvelut hallinnassasi" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Sunnuntai" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Maanantai" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tiistai" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Keskiviikko" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Torstai" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Perjantai" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Lauantai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Tammikuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Helmikuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Maaliskuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Huhtikuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Toukokuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Kesäkuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Heinäkuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Elokuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Syyskuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Lokakuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Marraskuu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Joulukuu" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "verkkopalvelut hallinnassasi" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Kirjaudu ulos" diff --git a/l10n/fr/core.po b/l10n/fr/core.po index 3e90111b42..a1d840c564 100644 --- a/l10n/fr/core.po +++ b/l10n/fr/core.po @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" @@ -25,19 +25,19 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nom de l'application non fourni." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Pas de catégorie à ajouter ?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Cette catégorie existe déjà : " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Paramètres" @@ -171,7 +171,7 @@ msgstr "Un erreur est survenue pendant la suppression de la date d'expiration" msgid "Error setting expiration date" msgstr "Erreur lors de la spécification de la date d'expiration" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Réinitialisation de votre mot de passe Owncloud" @@ -184,12 +184,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vous allez recevoir un e-mail contenant un lien pour réinitialiser votre mot de passe." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Demande envoyée" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Nom d'utilisateur ou e-mail invalide" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -322,86 +322,86 @@ msgstr "Serveur de la base de données" msgid "Finish setup" msgstr "Terminer l'installation" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "services web sous votre contrôle" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Dimanche" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Lundi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Mardi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mercredi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Jeudi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Vendredi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Samedi" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "janvier" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "février" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "mars" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "avril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "juin" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "juillet" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "août" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "septembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "octobre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "novembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "décembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "services web sous votre contrôle" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Se déconnecter" diff --git a/l10n/gl/core.po b/l10n/gl/core.po index 332c06d092..116d1e6df1 100644 --- a/l10n/gl/core.po +++ b/l10n/gl/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Non se indicou o nome do aplicativo." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Sen categoría que engadir?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Esta categoría xa existe: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Preferencias" @@ -165,7 +165,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Restablecer contrasinal de ownCloud" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Recibirá unha ligazón por correo electrónico para restablecer o contrasinal" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Solicitado" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Fallou a conexión." +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Servidor da base de datos" msgid "Finish setup" msgstr "Rematar configuración" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "servizos web baixo o seu control" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Domingo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Luns" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Martes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mércores" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Xoves" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Venres" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sábado" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Xaneiro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Febreiro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marzo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Xuño" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Xullo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agosto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Setembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Outubro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Nadal" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "servizos web baixo o seu control" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Desconectar" diff --git a/l10n/he/core.po b/l10n/he/core.po index d24ed1b8c1..fab85f35a4 100644 --- a/l10n/he/core.po +++ b/l10n/he/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "שם היישום לא סופק." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "אין קטגוריה להוספה?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "קטגוריה זאת כבר קיימת: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "הגדרות" @@ -167,7 +167,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "איפוס הססמה של ownCloud" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "יישלח לתיבת הדוא״ל שלך קישור לאיפוס הססמה." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "נדרש" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "הכניסה נכשלה!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "שרת בסיס נתונים" msgid "Finish setup" msgstr "סיום התקנה" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "שירותי רשת בשליטתך" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "יום ראשון" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "יום שני" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "יום שלישי" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "יום רביעי" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "יום חמישי" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "יום שישי" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "שבת" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "ינואר" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "פברואר" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "מרץ" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "אפריל" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "מאי" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "יוני" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "יולי" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "אוגוסט" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "ספטמבר" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "אוקטובר" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "נובמבר" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "דצמבר" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "שירותי רשת בשליטתך" + #: templates/layout.user.php:38 msgid "Log out" msgstr "התנתקות" diff --git a/l10n/hi/core.po b/l10n/hi/core.po index 7011a1c491..210be7f47b 100644 --- a/l10n/hi/core.po +++ b/l10n/hi/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,11 +177,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 @@ -315,86 +315,86 @@ msgstr "" msgid "Finish setup" msgstr "सेटअप समाप्त करे" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "" + #: templates/layout.user.php:38 msgid "Log out" msgstr "" diff --git a/l10n/hr/core.po b/l10n/hr/core.po index c6ce6168d0..c42311550d 100644 --- a/l10n/hr/core.po +++ b/l10n/hr/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Ime aplikacije nije pribavljeno." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nemate kategorija koje možete dodati?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Ova kategorija već postoji: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Postavke" @@ -167,7 +167,7 @@ msgstr "Greška prilikom brisanja datuma isteka" msgid "Error setting expiration date" msgstr "Greška prilikom postavljanja datuma isteka" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud resetiranje lozinke" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Primit ćete link kako biste poništili zaporku putem e-maila." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Zahtijevano" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Prijava nije uspjela!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Poslužitelj baze podataka" msgid "Finish setup" msgstr "Završi postavljanje" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "web usluge pod vašom kontrolom" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "nedelja" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "ponedeljak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "utorak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "srijeda" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "četvrtak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "petak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "subota" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Siječanj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Veljača" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Ožujak" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Travanj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Svibanj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Lipanj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Srpanj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Kolovoz" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Rujan" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Listopad" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Studeni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Prosinac" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "web usluge pod vašom kontrolom" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Odjava" diff --git a/l10n/hu_HU/core.po b/l10n/hu_HU/core.po index a8f3ce8526..261860ef56 100644 --- a/l10n/hu_HU/core.po +++ b/l10n/hu_HU/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Alkalmazásnév hiányzik" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nincs hozzáadandó kategória?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Ez a kategória már létezik" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Beállítások" @@ -166,7 +166,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud jelszó-visszaállítás" @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Egy e-mailben kap értesítést a jelszóváltoztatás módjáról." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Kérés elküldve" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Belépés sikertelen!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -317,86 +317,86 @@ msgstr "Adatbázis szerver" msgid "Finish setup" msgstr "Beállítás befejezése" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "webszolgáltatások az irányításod alatt" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Vasárnap" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Hétfő" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Kedd" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Szerda" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Csütörtök" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Péntek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Szombat" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Január" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Február" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Március" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Április" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Május" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Június" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Július" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Augusztus" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Szeptember" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Október" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "December" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "webszolgáltatások az irányításod alatt" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Kilépés" diff --git a/l10n/ia/core.po b/l10n/ia/core.po index f39b3eafdb..4575ee9740 100644 --- a/l10n/ia/core.po +++ b/l10n/ia/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Iste categoria jam existe:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Configurationes" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reinitialisation del contrasigno de ownCLoud" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Requestate" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Initio de session fallite!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Hospite de base de datos" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "servicios web sub tu controlo" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Dominica" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Lunedi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Martedi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mercuridi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Jovedi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Venerdi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sabbato" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "januario" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februario" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Martio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Junio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Augusto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Octobre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Decembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "servicios web sub tu controlo" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Clauder le session" diff --git a/l10n/id/core.po b/l10n/id/core.po index c2714fed49..b8a48ed10f 100644 --- a/l10n/id/core.po +++ b/l10n/id/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nama aplikasi tidak diberikan." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Tidak ada kategori yang akan ditambahkan?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Kategori ini sudah ada:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Setelan" @@ -167,7 +167,7 @@ msgstr "gagal melepas tanggal kadaluarsa" msgid "Error setting expiration date" msgstr "gagal memasang tanggal kadaluarsa" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "reset password ownCloud" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Anda akan mendapatkan link untuk mereset password anda lewat Email." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Telah diminta" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login gagal!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Host database" msgid "Finish setup" msgstr "Selesaikan instalasi" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "web service dibawah kontrol anda" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "minggu" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "senin" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "selasa" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "rabu" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "kamis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "jumat" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "sabtu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Maret" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mei" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agustus" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Nopember" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Desember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "web service dibawah kontrol anda" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Keluar" diff --git a/l10n/it/core.po b/l10n/it/core.po index 78a495439e..d3aa4640c5 100644 --- a/l10n/it/core.po +++ b/l10n/it/core.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -22,19 +22,19 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nome dell'applicazione non fornito." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nessuna categoria da aggiungere?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Questa categoria esiste già: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Impostazioni" @@ -168,7 +168,7 @@ msgstr "Errore durante la rimozione della data di scadenza" msgid "Error setting expiration date" msgstr "Errore durante l'impostazione della data di scadenza" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Ripristino password di ownCloud" @@ -181,12 +181,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Riceverai un collegamento per ripristinare la tua password via email" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Richiesto" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Accesso non riuscito!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -319,86 +319,86 @@ msgstr "Host del database" msgid "Finish setup" msgstr "Termina la configurazione" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "servizi web nelle tue mani" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Domenica" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Lunedì" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Martedì" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mercoledì" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Giovedì" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Venerdì" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sabato" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Gennaio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Febbraio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marzo" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Aprile" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maggio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Giugno" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Luglio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agosto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Settembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Ottobre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Dicembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "servizi web nelle tue mani" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Esci" diff --git a/l10n/ja_JP/core.po b/l10n/ja_JP/core.po index c0a644318b..b5a7749d93 100644 --- a/l10n/ja_JP/core.po +++ b/l10n/ja_JP/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: ja_JP\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "アプリケーション名は提供されていません。" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "追加するカテゴリはありませんか?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "このカテゴリはすでに存在します: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "設定" @@ -165,7 +165,7 @@ msgstr "有効期限の未設定エラー" msgid "Error setting expiration date" msgstr "有効期限の設定でエラー発生" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloudのパスワードをリセットします" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "メールでパスワードをリセットするリンクが届きます。" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "送信されました" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "ログインに失敗しました!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "データベースのホスト名" msgid "Finish setup" msgstr "セットアップを完了します" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "管理下にあるウェブサービス" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "日" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "月" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "火" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "水" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "木" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "金" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "土" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "1月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "2月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "3月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "4月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "5月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "6月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "7月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "8月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "9月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "10月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "11月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "12月" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "管理下にあるウェブサービス" + #: templates/layout.user.php:38 msgid "Log out" msgstr "ログアウト" diff --git a/l10n/ka_GE/core.po b/l10n/ka_GE/core.po index 38e74e25ef..154fb3bee2 100644 --- a/l10n/ka_GE/core.po +++ b/l10n/ka_GE/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ka_GE\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "აპლიკაციის სახელი არ არის განხილული" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "არ არის კატეგორია დასამატებლად?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "კატეგორია უკვე არსებობს" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "პარამეტრები" @@ -164,7 +164,7 @@ msgstr "შეცდომა ვადის გასვლის მოხს msgid "Error setting expiration date" msgstr "შეცდომა ვადის გასვლის მითითების დროს" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud პაროლის შეცვლა" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "თქვენ მოგივათ პაროლის შესაცვლელი ლინკი მეილზე" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "მოთხოვნილი" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "შესვლა ვერ მოხერხდა!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "ბაზის ჰოსტი" msgid "Finish setup" msgstr "კონფიგურაციის დასრულება" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "თქვენი კონტროლის ქვეშ მყოფი ვებ სერვისები" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "კვირა" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "ორშაბათი" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "სამშაბათი" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "ოთხშაბათი" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "ხუთშაბათი" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "პარასკევი" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "შაბათი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "იანვარი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "თებერვალი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "მარტი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "აპრილი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "მაისი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "ივნისი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "ივლისი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "აგვისტო" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "სექტემბერი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "ოქტომბერი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "ნოემბერი" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "დეკემბერი" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "თქვენი კონტროლის ქვეშ მყოფი ვებ სერვისები" + #: templates/layout.user.php:38 msgid "Log out" msgstr "გამოსვლა" diff --git a/l10n/ko/core.po b/l10n/ko/core.po index 889a6c3823..27a4458b38 100644 --- a/l10n/ko/core.po +++ b/l10n/ko/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "응용 프로그램의 이름이 규정되어 있지 않습니다. " -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "추가할 카테고리가 없습니까?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "이 카테고리는 이미 존재합니다:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "설정" @@ -165,7 +165,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud 비밀번호 재설정" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "전자 우편으로 암호 재설정 링크를 보냈습니다." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "요청함" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "로그인 실패!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "데이터베이스 호스트" msgid "Finish setup" msgstr "설치 완료" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "내가 관리하는 웹 서비스" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "일요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "월요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "화요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "수요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "목요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "금요일" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "토요일" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "1월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "2월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "3월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "4월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "5월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "6월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "7월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "8월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "9월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "10월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "11월" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "12월" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "내가 관리하는 웹 서비스" + #: templates/layout.user.php:38 msgid "Log out" msgstr "로그아웃" diff --git a/l10n/ku_IQ/core.po b/l10n/ku_IQ/core.po index aa5978b69a..d140fc0686 100644 --- a/l10n/ku_IQ/core.po +++ b/l10n/ku_IQ/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ku_IQ\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "ده‌ستكاری" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,11 +177,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 @@ -315,86 +315,86 @@ msgstr "هۆستی داتابه‌یس" msgid "Finish setup" msgstr "كۆتایی هات ده‌ستكاریه‌كان" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه" + #: templates/layout.user.php:38 msgid "Log out" msgstr "چوونەدەرەوە" diff --git a/l10n/lb/core.po b/l10n/lb/core.po index 17f470d02a..c73d46c2d2 100644 --- a/l10n/lb/core.po +++ b/l10n/lb/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Numm vun der Applikatioun ass net uginn." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Keng Kategorie fir bäizesetzen?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Des Kategorie existéiert schonn:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Astellungen" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud Passwuert reset" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du kriss en Link fir däin Passwuert nei ze setzen via Email geschéckt." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Gefrot" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Falschen Login!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Datebank Server" msgid "Finish setup" msgstr "Installatioun ofschléissen" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Web Servicer ënnert denger Kontroll" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Sonndes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Méindes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dënschdes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mëttwoch" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Donneschdes" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Freides" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Samschdes" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mäerz" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abrëll" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mee" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Dezember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Web Servicer ënnert denger Kontroll" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Ausloggen" diff --git a/l10n/lt_LT/core.po b/l10n/lt_LT/core.po index df41c96918..1f889a4eb1 100644 --- a/l10n/lt_LT/core.po +++ b/l10n/lt_LT/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: lt_LT\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nepateiktas programos pavadinimas." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nepridėsite jokios kategorijos?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Tokia kategorija jau yra:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Nustatymai" @@ -165,7 +165,7 @@ msgstr "Klaida nuimant galiojimo laiką" msgid "Error setting expiration date" msgstr "Klaida nustatant galiojimo laiką" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud slaptažodžio atkūrimas" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Elektroniniu paštu gausite nuorodą, su kuria galėsite iš naujo nustatyti slaptažodį." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Užklausta" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Prisijungti nepavyko!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Duomenų bazės serveris" msgid "Finish setup" msgstr "Baigti diegimą" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "jūsų valdomos web paslaugos" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Sekmadienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Pirmadienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Antradienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Trečiadienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Ketvirtadienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Penktadienis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Šeštadienis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Sausis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Vasaris" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Kovas" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Balandis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Gegužė" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Birželis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Liepa" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Rugpjūtis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Rugsėjis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Spalis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Lapkritis" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Gruodis" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "jūsų valdomos web paslaugos" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Atsijungti" diff --git a/l10n/lv/core.po b/l10n/lv/core.po index ce66729341..3f64262128 100644 --- a/l10n/lv/core.po +++ b/l10n/lv/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Iestatījumi" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Jūs savā epastā saņemsiet interneta saiti, caur kuru varēsiet atjaunot paroli." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Obligāts" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Neizdevās ielogoties." +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Datubāzes mājvieta" msgid "Finish setup" msgstr "Pabeigt uzstādījumus" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Izlogoties" diff --git a/l10n/mk/core.po b/l10n/mk/core.po index db48388d30..59b319ca5d 100644 --- a/l10n/mk/core.po +++ b/l10n/mk/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Име за апликацијата не е доставено." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Нема категорија да се додаде?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Оваа категорија веќе постои:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Поставки" @@ -166,7 +166,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ресетирање на лозинка за ownCloud" @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Ќе добиете врска по е-пошта за да може да ја ресетирате Вашата лозинка." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Побарано" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Најавата не успеа!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -317,86 +317,86 @@ msgstr "Сервер со база" msgid "Finish setup" msgstr "Заврши го подесувањето" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "веб сервиси под Ваша контрола" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Недела" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понеделник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четврток" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Петок" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Сабота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Јануари" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Февруари" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Мај" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Јуни" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Јули" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Септември" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Октомври" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Ноември" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Декември" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "веб сервиси под Ваша контрола" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Одјава" diff --git a/l10n/ms_MY/core.po b/l10n/ms_MY/core.po index 4e8511ed24..e9850f019d 100644 --- a/l10n/ms_MY/core.po +++ b/l10n/ms_MY/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "nama applikasi tidak disediakan" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Tiada kategori untuk di tambah?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Kategori ini telah wujud" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Tetapan" @@ -166,7 +166,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Set semula kata lalaun ownCloud" @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Anda akan menerima pautan untuk menetapkan semula kata laluan anda melalui emel" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Meminta" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Log masuk gagal!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -317,86 +317,86 @@ msgstr "Hos pangkalan data" msgid "Finish setup" msgstr "Setup selesai" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Perkhidmatan web di bawah kawalan anda" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Ahad" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Isnin" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Selasa" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Rabu" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Khamis" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Jumaat" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sabtu" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mac" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mei" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Jun" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Ogos" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Disember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Perkhidmatan web di bawah kawalan anda" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Log keluar" diff --git a/l10n/nb_NO/core.po b/l10n/nb_NO/core.po index b78e8f7b79..c530ee3d80 100644 --- a/l10n/nb_NO/core.po +++ b/l10n/nb_NO/core.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -22,19 +22,19 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Applikasjonsnavn ikke angitt." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ingen kategorier å legge til?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Denne kategorien finnes allerede:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Innstillinger" @@ -168,7 +168,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Tilbakestill ownCloud passord" @@ -181,12 +181,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du burde motta detaljer om å tilbakestille passordet ditt via epost." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Anmodning" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Innloggingen var ikke vellykket." +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -319,86 +319,86 @@ msgstr "Databasevert" msgid "Finish setup" msgstr "Fullfør oppsetting" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "nettjenester under din kontroll" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Mandag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tirsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Lørdag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Desember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "nettjenester under din kontroll" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Logg ut" diff --git a/l10n/nl/core.po b/l10n/nl/core.po index 7c391bcf39..2d52083c6d 100644 --- a/l10n/nl/core.po +++ b/l10n/nl/core.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -28,19 +28,19 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Applicatienaam niet gegeven." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Geen categorie toevoegen?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Deze categorie bestaat al." -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Instellingen" @@ -174,7 +174,7 @@ msgstr "Fout tijdens het verwijderen van de verval datum" msgid "Error setting expiration date" msgstr "Fout tijdens het instellen van de vervaldatum" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud wachtwoord herstellen" @@ -187,12 +187,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "U ontvangt een link om uw wachtwoord opnieuw in te stellen via e-mail." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Gevraagd" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login mislukt!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -325,86 +325,86 @@ msgstr "Database server" msgid "Finish setup" msgstr "Installatie afronden" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Webdiensten in eigen beheer" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Zondag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Maandag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dinsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Woensdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Donderdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Vrijdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Zaterdag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "januari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "februari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "maart" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "april" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "mei" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "augustus" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "september" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "november" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "december" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Webdiensten in eigen beheer" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Afmelden" diff --git a/l10n/nl/files_external.po b/l10n/nl/files_external.po index a3bf337db1..98f19c36b8 100644 --- a/l10n/nl/files_external.po +++ b/l10n/nl/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-13 02:04+0200\n" -"PO-Revision-Date: 2012-10-12 19:43+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 09:42+0000\n" "Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -68,7 +68,7 @@ msgstr "Van toepassing" #: templates/settings.php:23 msgid "Add mount point" -msgstr "Voeg aankoppelpunt toe" +msgstr "Aankoppelpunt toevoegen" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" @@ -92,7 +92,7 @@ msgstr "Verwijder" #: templates/settings.php:87 msgid "Enable User External Storage" -msgstr "Zet gebruiker's externe opslag aan" +msgstr "Externe opslag voor gebruikers activeren" #: templates/settings.php:88 msgid "Allow users to mount their own external storage" diff --git a/l10n/nl/files_versions.po b/l10n/nl/files_versions.po index 5db59a4122..0328e198c5 100644 --- a/l10n/nl/files_versions.po +++ b/l10n/nl/files_versions.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-09-24 02:01+0200\n" -"PO-Revision-Date: 2012-09-23 14:45+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 08:43+0000\n" "Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -40,4 +40,4 @@ msgstr "Bestand versies" #: templates/settings.php:4 msgid "Enable" -msgstr "Zet aan" +msgstr "Activeer" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index 3decc2999c..c938c3fa0c 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-14 02:05+0200\n" -"PO-Revision-Date: 2012-10-13 09:09+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 09:52+0000\n" "Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -26,70 +26,69 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/apps/ocs.php:23 +#: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" msgstr "Kan de lijst niet van de App store laden" -#: ajax/creategroup.php:9 ajax/removeuser.php:18 ajax/setquota.php:18 -#: ajax/togglegroups.php:15 -msgid "Authentication error" -msgstr "Authenticatie fout" - -#: ajax/creategroup.php:19 +#: ajax/creategroup.php:10 msgid "Group already exists" msgstr "Groep bestaat al" -#: ajax/creategroup.php:28 +#: ajax/creategroup.php:19 msgid "Unable to add group" msgstr "Niet in staat om groep toe te voegen" -#: ajax/enableapp.php:14 +#: ajax/enableapp.php:12 msgid "Could not enable app. " msgstr "Kan de app. niet activeren" -#: ajax/lostpassword.php:14 +#: ajax/lostpassword.php:12 msgid "Email saved" msgstr "E-mail bewaard" -#: ajax/lostpassword.php:16 +#: ajax/lostpassword.php:14 msgid "Invalid email" msgstr "Ongeldige e-mail" -#: ajax/openid.php:16 +#: ajax/openid.php:13 msgid "OpenID Changed" msgstr "OpenID is aangepast" -#: ajax/openid.php:18 ajax/setlanguage.php:20 ajax/setlanguage.php:23 +#: ajax/openid.php:15 ajax/setlanguage.php:17 ajax/setlanguage.php:20 msgid "Invalid request" msgstr "Ongeldig verzoek" -#: ajax/removegroup.php:16 +#: ajax/removegroup.php:13 msgid "Unable to delete group" msgstr "Niet in staat om groep te verwijderen" -#: ajax/removeuser.php:27 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +msgid "Authentication error" +msgstr "Authenticatie fout" + +#: ajax/removeuser.php:24 msgid "Unable to delete user" msgstr "Niet in staat om gebruiker te verwijderen" -#: ajax/setlanguage.php:18 +#: ajax/setlanguage.php:15 msgid "Language changed" msgstr "Taal aangepast" -#: ajax/togglegroups.php:25 +#: ajax/togglegroups.php:22 #, php-format msgid "Unable to add user to group %s" msgstr "Niet in staat om gebruiker toe te voegen aan groep %s" -#: ajax/togglegroups.php:31 +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to remove user from group %s" msgstr "Niet in staat om gebruiker te verwijderen uit groep %s" -#: js/apps.js:28 js/apps.js:65 +#: js/apps.js:28 js/apps.js:67 msgid "Disable" msgstr "Uitschakelen" -#: js/apps.js:28 js/apps.js:54 +#: js/apps.js:28 js/apps.js:55 msgid "Enable" msgstr "Inschakelen" @@ -126,13 +125,13 @@ msgstr "Voer één taak uit met elke pagina die wordt geladen" msgid "" "cron.php is registered at a webcron service. Call the cron.php page in the " "owncloud root once a minute over http." -msgstr "cron.php is bij een webcron dienst geregistreerd. Roep de cron.php pagina in de owncloud root via http één maal per minuut op." +msgstr "cron.php is bij een webcron dienst geregistreerd. Benader eens per minuut, via http de pagina cron.php in de owncloud hoofdmap." #: templates/admin.php:49 msgid "" "Use systems cron service. Call the cron.php file in the owncloud folder via " "a system cronjob once a minute." -msgstr "Gebruik de systeem cron dienst. Gebruik, eens per minuut, het bestand cron.php in de owncloud map via de systeem cronjob." +msgstr "Gebruik de systeem cronjob. Benader eens per minuut, via een systeem cronjob het bestand cron.php in de owncloud hoofdmap." #: templates/admin.php:56 msgid "Sharing" @@ -190,7 +189,7 @@ msgstr "Ontwikkeld door de %s gebruikt van de beschikbare %s\n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: nn_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Innstillingar" @@ -165,7 +165,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du vil få ei lenkje for å nullstilla passordet via epost." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Førespurt" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Feil ved innlogging!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Databasetenar" msgid "Finish setup" msgstr "Fullfør oppsettet" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Vev tjenester under din kontroll" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Måndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tysdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Laurdag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Desember" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Vev tjenester under din kontroll" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Logg ut" diff --git a/l10n/oc/core.po b/l10n/oc/core.po index 99f47982bd..c510835319 100644 --- a/l10n/oc/core.po +++ b/l10n/oc/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: oc\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nom d'applicacion pas donat." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Pas de categoria d'ajustar ?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "La categoria exista ja :" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Configuracion" @@ -164,7 +164,7 @@ msgstr "Error al metre de la data d'expiracion" msgid "Error setting expiration date" msgstr "Error setting expiration date" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "senhal d'ownCloud tornat botar" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Reçaupràs un ligam per tornar botar ton senhal via corrièl." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Requesit" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Fracàs de login" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Òste de basa de donadas" msgid "Finish setup" msgstr "Configuracion acabada" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Services web jos ton contraròtle" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Dimenge" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Diluns" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dimarç" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Dimecres" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Dijòus" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Divendres" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Dissabte" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Genièr" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Febrièr" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Març" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Junh" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julhet" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agost" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Octobre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Decembre" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Services web jos ton contraròtle" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Sortida" diff --git a/l10n/pl/core.po b/l10n/pl/core.po index 391d20d67b..db40834aba 100644 --- a/l10n/pl/core.po +++ b/l10n/pl/core.po @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" @@ -25,19 +25,19 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Brak nazwy dla aplikacji" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Brak kategorii" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Ta kategoria już istnieje" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ustawienia" @@ -171,7 +171,7 @@ msgstr "Błąd niszczenie daty wygaśnięcia" msgid "Error setting expiration date" msgstr "Błąd podczas ustawiania daty wygaśnięcia" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "restart hasła" @@ -184,12 +184,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Odnośnik służący do resetowania hasła zostanie wysłany na adres e-mail." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Żądane" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Nie udało się zalogować!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -322,86 +322,86 @@ msgstr "Komputer bazy danych" msgid "Finish setup" msgstr "Zakończ konfigurowanie" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "usługi internetowe pod kontrolą" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Niedziela" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Poniedziałek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Wtorek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Środa" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Czwartek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Piątek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sobota" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Styczeń" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Luty" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Marzec" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Kwiecień" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Czerwiec" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Lipiec" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Sierpień" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Wrzesień" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Październik" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Listopad" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Grudzień" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "usługi internetowe pod kontrolą" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Wylogowuje użytkownika" diff --git a/l10n/pl_PL/core.po b/l10n/pl_PL/core.po index 3e55197923..5de914ebbe 100644 --- a/l10n/pl_PL/core.po +++ b/l10n/pl_PL/core.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" @@ -17,19 +17,19 @@ msgstr "" "Language: pl_PL\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ustawienia" @@ -163,7 +163,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -176,11 +176,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 @@ -314,86 +314,86 @@ msgstr "" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "" + #: templates/layout.user.php:38 msgid "Log out" msgstr "" diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po index 83a2f8a6d5..f3b55e2d9f 100644 --- a/l10n/pt_BR/core.po +++ b/l10n/pt_BR/core.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -24,19 +24,19 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nome da aplicação não foi fornecido." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nenhuma categoria adicionada?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Essa categoria já existe" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Configurações" @@ -170,7 +170,7 @@ msgstr "Erro ao remover data de expiração" msgid "Error setting expiration date" msgstr "Erro ao definir data de expiração" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Redefinir senha ownCloud" @@ -183,12 +183,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Você receberá um link para redefinir sua senha via e-mail." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Solicitado" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Falha ao fazer o login!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -321,86 +321,86 @@ msgstr "Banco de dados do host" msgid "Finish setup" msgstr "Concluir configuração" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "web services sob seu controle" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Domingo" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Segunda-feira" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Terça-feira" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Quarta-feira" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Quinta-feira" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Sexta-feira" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sábado" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Janeiro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Fevereiro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Março" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maio" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Junho" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Julho" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Agosto" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Setembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Outubro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembro" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Dezembro" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "web services sob seu controle" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Sair" diff --git a/l10n/pt_PT/core.po b/l10n/pt_PT/core.po index f377a6d2e0..9aa362a3aa 100644 --- a/l10n/pt_PT/core.po +++ b/l10n/pt_PT/core.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-26 02:02+0200\n" -"PO-Revision-Date: 2012-10-25 16:20+0000\n" -"Last-Translator: Duarte Velez Grilo \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,19 +22,19 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Nome da aplicação não definida." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nenhuma categoria para adicionar?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Esta categoria já existe:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Definições" @@ -168,7 +168,7 @@ msgstr "Erro ao retirar a data de expiração" msgid "Error setting expiration date" msgstr "Erro ao aplicar a data de expiração" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reposição da password ownCloud" @@ -181,12 +181,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vai receber um endereço para repor a sua password" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Pedido" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Conexão falhado!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 diff --git a/l10n/ro/core.po b/l10n/ro/core.po index b24346a85f..dcaf8c141a 100644 --- a/l10n/ro/core.po +++ b/l10n/ro/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Numele aplicație nu este furnizat." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Nici o categorie de adăugat?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Această categorie deja există:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Configurări" @@ -167,7 +167,7 @@ msgstr "Eroare la anularea datei de expirare" msgid "Error setting expiration date" msgstr "Eroare la specificarea datei de expirare" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Resetarea parolei ownCloud " @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vei primi un mesaj prin care vei putea reseta parola via email" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Solicitat" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Autentificare eșuată" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Bază date" msgid "Finish setup" msgstr "Finalizează instalarea" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "servicii web controlate de tine" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Duminică" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Luni" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Marți" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Miercuri" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Joi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Vineri" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Sâmbătă" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Ianuarie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februarie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Martie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Aprilie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Iunie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Iulie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septembrie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Octombrie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Noiembrie" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Decembrie" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "servicii web controlate de tine" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Ieșire" diff --git a/l10n/ru/core.po b/l10n/ru/core.po index 3058a58bba..0d64f1b14b 100644 --- a/l10n/ru/core.po +++ b/l10n/ru/core.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" @@ -23,19 +23,19 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Имя приложения не установлено." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Нет категорий для добавления?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Эта категория уже существует: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Настройки" @@ -169,7 +169,7 @@ msgstr "Ошибка при отмене срока доступа" msgid "Error setting expiration date" msgstr "Ошибка при установке срока доступа" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Сброс пароля " @@ -182,12 +182,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "На ваш адрес Email выслана ссылка для сброса пароля." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Запрошено" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Не удалось войти!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -320,86 +320,86 @@ msgstr "Хост базы данных" msgid "Finish setup" msgstr "Завершить установку" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "Сетевые службы под твоим контролем" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Воскресенье" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понедельник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четверг" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Пятница" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Суббота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Январь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Февраль" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Апрель" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Май" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Июнь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Июль" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Сентябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Октябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Ноябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Декабрь" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "Сетевые службы под твоим контролем" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Выйти" diff --git a/l10n/ru_RU/core.po b/l10n/ru_RU/core.po index daad3228d4..c83e52177c 100644 --- a/l10n/ru_RU/core.po +++ b/l10n/ru_RU/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ru_RU\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Имя приложения не предоставлено." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Нет категории для добавления?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Эта категория уже существует:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Настройки" @@ -164,7 +164,7 @@ msgstr "Ошибка при отключении даты истечения с msgid "Error setting expiration date" msgstr "Ошибка при установке даты истечения срока действия" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Переназначение пароля" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Вы получите ссылку для восстановления пароля по электронной почте." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Запрашиваемое" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Войти не удалось!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Сервер базы данных" msgid "Finish setup" msgstr "Завершение настройки" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "веб-сервисы под Вашим контролем" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Воскресенье" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понедельник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четверг" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Пятница" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Суббота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Январь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Февраль" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Апрель" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Май" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Июнь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Июль" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Сентябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Октябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Ноябрь" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Декабрь" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "веб-сервисы под Вашим контролем" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Выйти" diff --git a/l10n/si_LK/core.po b/l10n/si_LK/core.po index c6d940efac..40b3b6cde9 100644 --- a/l10n/si_LK/core.po +++ b/l10n/si_LK/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "යෙදුම් නාමය සපයා නැත." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "සැකසුම්" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,11 +177,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 @@ -315,86 +315,86 @@ msgstr "" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "ඉරිදා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "සඳුදා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "අඟහරුවාදා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "බදාදා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "බ්‍රහස්පතින්දා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "සිකුරාදා" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "සෙනසුරාදා" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "ජනවාරි" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "පෙබරවාරි" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "මාර්තු" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "අප්‍රේල්" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "මැයි" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "ජූනි" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "ජූලි" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "අගෝස්තු" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "සැප්තැම්බර්" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "ඔක්තෝබර්" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "නොවැම්බර්" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "දෙසැම්බර්" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්" + #: templates/layout.user.php:38 msgid "Log out" msgstr "" diff --git a/l10n/sk_SK/core.po b/l10n/sk_SK/core.po index 5bccc6ee62..80f5d64e92 100644 --- a/l10n/sk_SK/core.po +++ b/l10n/sk_SK/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-26 02:02+0200\n" -"PO-Revision-Date: 2012-10-25 18:49+0000\n" -"Last-Translator: Roman Priesol \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,19 +20,19 @@ msgstr "" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Meno aplikácie nezadané." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Žiadna kategória pre pridanie?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Táto kategória už existuje:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Nastavenia" @@ -166,7 +166,7 @@ msgstr "Chyba pri odstraňovaní dátumu vypršania platnosti" msgid "Error setting expiration date" msgstr "Chyba pri nastavení dátumu vypršania platnosti" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Obnovenie hesla pre ownCloud" @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Odkaz pre obnovenie hesla obdržíte e-mailom." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Požiadané" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Prihlásenie zlyhalo!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 diff --git a/l10n/sl/core.po b/l10n/sl/core.po index 1d92978f73..4b31bef014 100644 --- a/l10n/sl/core.po +++ b/l10n/sl/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -21,19 +21,19 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Ime programa ni določeno." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ni kategorije za dodajanje?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Ta kategorija že obstaja:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Nastavitve" @@ -167,7 +167,7 @@ msgstr "Napaka brisanja datuma preteka" msgid "Error setting expiration date" msgstr "Napaka med nastavljanjem datuma preteka" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Ponastavitev gesla ownCloud" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Na elektronski naslov boste prejeli povezavo za ponovno nastavitev gesla." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Zahtevano" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Prijava je spodletela!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -318,86 +318,86 @@ msgstr "Gostitelj podatkovne zbirke" msgid "Finish setup" msgstr "Dokončaj namestitev" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "spletne storitve pod vašim nadzorom" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "nedelja" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "ponedeljek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "torek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "sreda" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "četrtek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "petek" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "sobota" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "marec" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "april" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "maj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "junij" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "julij" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "avgust" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "september" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "november" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "december" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "spletne storitve pod vašim nadzorom" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Odjava" diff --git a/l10n/sr/core.po b/l10n/sr/core.po index e5e74ea78f..3ee749bebd 100644 --- a/l10n/sr/core.po +++ b/l10n/sr/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Подешавања" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Добићете везу за ресетовање лозинке путем е-поште." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Захтевано" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Несупела пријава!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Домаћин базе" msgid "Finish setup" msgstr "Заврши подешавање" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "веб сервиси под контролом" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Недеља" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понедељак" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Уторак" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвртак" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Петак" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Субота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Јануар" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Фебруар" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Мај" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Јун" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Јул" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Септембар" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Октобар" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Новембар" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Децембар" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "веб сервиси под контролом" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Одјава" diff --git a/l10n/sr@latin/core.po b/l10n/sr@latin/core.po index 5f0945390c..9e671507bc 100644 --- a/l10n/sr@latin/core.po +++ b/l10n/sr@latin/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Podešavanja" @@ -164,7 +164,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Dobićete vezu za resetovanje lozinke putem e-pošte." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Zahtevano" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Nesupela prijava!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "Domaćin baze" msgid "Finish setup" msgstr "Završi podešavanje" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Nedelja" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Ponedeljak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Utorak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Sreda" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Četvrtak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Petak" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Subota" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mart" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Jun" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Jul" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Avgust" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Septembar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktobar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Novembar" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Decembar" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Odjava" diff --git a/l10n/sv/core.po b/l10n/sv/core.po index 6aaa41d4e3..7e74de6fec 100644 --- a/l10n/sv/core.po +++ b/l10n/sv/core.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:13+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" @@ -23,19 +23,19 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Programnamn har inte angetts." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Ingen kategori att lägga till?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Denna kategori finns redan:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Inställningar" @@ -169,7 +169,7 @@ msgstr "Fel vid borttagning av utgångsdatum" msgid "Error setting expiration date" msgstr "Fel vid sättning av utgångsdatum" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud lösenordsåterställning" @@ -182,12 +182,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Du får en länk att återställa ditt lösenord via e-post." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Begärd" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Misslyckad inloggning!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -320,86 +320,86 @@ msgstr "Databasserver" msgid "Finish setup" msgstr "Avsluta installation" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "webbtjänster under din kontroll" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Söndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Måndag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tisdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Lördag" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Augusti" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "December" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "webbtjänster under din kontroll" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Logga ut" diff --git a/l10n/ta_LK/core.po b/l10n/ta_LK/core.po index 908c28bb96..de85046352 100644 --- a/l10n/ta_LK/core.po +++ b/l10n/ta_LK/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" @@ -18,19 +18,19 @@ msgstr "" "Language: ta_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "செயலி பெயர் வழங்கப்படவில்லை." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "சேர்ப்பதற்கான வகைகள் இல்லையா?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "இந்த வகை ஏற்கனவே உள்ளது:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "அமைப்புகள்" @@ -164,7 +164,7 @@ msgstr "காலாவதியாகும் திகதியை குற msgid "Error setting expiration date" msgstr "காலாவதியாகும் திகதியை குறிப்பிடுவதில் வழு" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud இன் கடவுச்சொல் மீளமைப்பு" @@ -177,12 +177,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "நீங்கள் மின்னஞ்சல் மூலம் உங்களுடைய கடவுச்சொல்லை மீளமைப்பதற்கான இணைப்பை பெறுவீர்கள். " #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "கோரப்பட்டது" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "புகுபதிகை தவறானது!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -315,86 +315,86 @@ msgstr "தரவுத்தள ஓம்புனர்" msgid "Finish setup" msgstr "அமைப்பை முடிக்க" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "உங்கள் கட்டுப்பாட்டின் கீழ் இணைய சேவைகள்" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "ஞாயிற்றுக்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "திங்கட்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "செவ்வாய்க்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "புதன்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "வியாழக்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "வெள்ளிக்கிழமை" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "சனிக்கிழமை" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "தை" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "மாசி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "பங்குனி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "சித்திரை" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "வைகாசி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "ஆனி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "ஆடி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "ஆவணி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "புரட்டாசி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "ஐப்பசி" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "கார்த்திகை" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "மார்கழி" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "உங்கள் கட்டுப்பாட்டின் கீழ் இணைய சேவைகள்" + #: templates/layout.user.php:38 msgid "Log out" msgstr "விடுபதிகை செய்க" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index ba36c4c244..61d81fcb44 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,19 +17,19 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -176,11 +176,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index f656c159c6..a89fb3c93d 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 9f673891a8..339ffe0e69 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 23f1251a0a..a6a5794bb8 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 81f8959ba1..a40b038997 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 80f7ce4a40..b9ad8b1514 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 717c68dc5a..037733a4cc 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 4daff17b25..704403408b 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,60 +17,60 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/apps/ocs.php:23 +#: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" msgstr "" -#: ajax/creategroup.php:12 +#: ajax/creategroup.php:10 msgid "Group already exists" msgstr "" -#: ajax/creategroup.php:21 +#: ajax/creategroup.php:19 msgid "Unable to add group" msgstr "" -#: ajax/enableapp.php:14 +#: ajax/enableapp.php:12 msgid "Could not enable app. " msgstr "" -#: ajax/lostpassword.php:14 +#: ajax/lostpassword.php:12 msgid "Email saved" msgstr "" -#: ajax/lostpassword.php:16 +#: ajax/lostpassword.php:14 msgid "Invalid email" msgstr "" -#: ajax/openid.php:16 +#: ajax/openid.php:13 msgid "OpenID Changed" msgstr "" -#: ajax/openid.php:18 ajax/setlanguage.php:20 ajax/setlanguage.php:23 +#: ajax/openid.php:15 ajax/setlanguage.php:17 ajax/setlanguage.php:20 msgid "Invalid request" msgstr "" -#: ajax/removegroup.php:16 +#: ajax/removegroup.php:13 msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:18 ajax/setquota.php:18 ajax/togglegroups.php:15 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 msgid "Authentication error" msgstr "" -#: ajax/removeuser.php:27 +#: ajax/removeuser.php:24 msgid "Unable to delete user" msgstr "" -#: ajax/setlanguage.php:18 +#: ajax/setlanguage.php:15 msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:25 +#: ajax/togglegroups.php:22 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:31 +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index f46b6f23cb..998863bb93 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/core.po b/l10n/th_TH/core.po index 749c22cb68..a210affb26 100644 --- a/l10n/th_TH/core.po +++ b/l10n/th_TH/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "ยังไม่ได้ตั้งชื่อแอพพลิเคชั่น" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "ไม่มีหมวดหมู่ที่ต้องการเพิ่ม?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "หมวดหมู่นี้มีอยู่แล้ว: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "ตั้งค่า" @@ -165,7 +165,7 @@ msgstr "เกิดข้อผิดพลาดในการยกเลิ msgid "Error setting expiration date" msgstr "เกิดข้อผิดพลาดในการตั้งค่าวันที่หมดอายุ" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "รีเซ็ตรหัสผ่าน ownCloud" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "คุณจะได้รับลิงค์เพื่อกำหนดรหัสผ่านใหม่ทางอีเมล์" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "ส่งคำร้องเรียบร้อยแล้ว" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "ไม่สามารถเข้าสู่ระบบได้!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "Database host" msgid "Finish setup" msgstr "ติดตั้งเรียบร้อยแล้ว" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "web services under your control" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "วันอาทิตย์" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "วันจันทร์" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "วันอังคาร" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "วันพุธ" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "วันพฤหัสบดี" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "วันศุกร์" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "วันเสาร์" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "มกราคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "กุมภาพันธ์" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "มีนาคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "เมษายน" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "พฤษภาคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "มิถุนายน" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "กรกฏาคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "สิงหาคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "กันยายน" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "ตุลาคม" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "พฤศจิกายน" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "ธันวาคม" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "web services under your control" + #: templates/layout.user.php:38 msgid "Log out" msgstr "ออกจากระบบ" diff --git a/l10n/tr/core.po b/l10n/tr/core.po index e5605461b0..b76f5fd100 100644 --- a/l10n/tr/core.po +++ b/l10n/tr/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Uygulama adı verilmedi." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Eklenecek kategori yok?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Bu kategori zaten mevcut: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Ayarlar" @@ -166,7 +166,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud parola sıfırlama" @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Parolanızı sıfırlamak için bir bağlantı Eposta olarak gönderilecek." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "İstendi" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Giriş başarısız!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -317,86 +317,86 @@ msgstr "Veritabanı sunucusu" msgid "Finish setup" msgstr "Kurulumu tamamla" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "kontrolünüzdeki web servisleri" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Pazar" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Pazartesi" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Salı" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Çarşamba" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Perşembe" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "Cuma" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Cumartesi" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Ocak" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Şubat" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Mart" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Nisan" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Mayıs" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Haziran" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Temmuz" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Ağustos" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Eylül" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Ekim" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Kasım" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Aralık" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "kontrolünüzdeki web servisleri" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Çıkış yap" diff --git a/l10n/uk/core.po b/l10n/uk/core.po index 43d3364fd8..21043531fe 100644 --- a/l10n/uk/core.po +++ b/l10n/uk/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" @@ -20,19 +20,19 @@ msgstr "" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Налаштування" @@ -166,7 +166,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -179,11 +179,11 @@ msgid "You will receive a link to reset your password via Email." msgstr "Ви отримаєте посилання для скидання вашого паролю на e-mail." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" +msgid "Reset email send." msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" +msgid "Request failed!" msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 @@ -317,86 +317,86 @@ msgstr "" msgid "Finish setup" msgstr "Завершити налаштування" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "веб-сервіс під вашим контролем" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "Неділя" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "Понеділок" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вівторок" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "Середа" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвер" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "П'ятниця" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "Субота" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "Січень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "Лютий" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "Березень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "Квітень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "Травень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "Червень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "Липень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "Серпень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "Вересень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "Жовтень" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "Листопад" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "Грудень" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "веб-сервіс під вашим контролем" + #: templates/layout.user.php:38 msgid "Log out" msgstr "Вихід" diff --git a/l10n/vi/core.po b/l10n/vi/core.po index 5347486336..e13e05eb35 100644 --- a/l10n/vi/core.po +++ b/l10n/vi/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-27 00:01+0200\n" -"PO-Revision-Date: 2012-10-26 12:58+0000\n" -"Last-Translator: mattheu_9x \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,19 +20,19 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "Tên ứng dụng không tồn tại" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "Không có danh mục được thêm?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "Danh mục này đã được tạo :" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "Cài đặt" @@ -166,7 +166,7 @@ msgstr "Lỗi trong quá trình gỡ bỏ ngày kết thúc" msgid "Error setting expiration date" msgstr "Lỗi cấu hình ngày kết thúc" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Khôi phục mật khẩu Owncloud " @@ -179,12 +179,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "Vui lòng kiểm tra Email để khôi phục lại mật khẩu." #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "Yêu cầu" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Bạn đã nhập sai mật khẩu hay tên người dùng !" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 diff --git a/l10n/zh_CN.GB2312/core.po b/l10n/zh_CN.GB2312/core.po index 69e123044d..ff0a54cf60 100644 --- a/l10n/zh_CN.GB2312/core.po +++ b/l10n/zh_CN.GB2312/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: zh_CN.GB2312\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "应用程序并没有被提供." -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "没有分类添加了?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "这个分类已经存在了:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "设置" @@ -165,7 +165,7 @@ msgstr "取消设置失效日期出错" msgid "Error setting expiration date" msgstr "设置失效日期出错" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "私有云密码重置" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "你将会收到一个重置密码的链接" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "请求" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "登陆失败!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "数据库主机" msgid "Finish setup" msgstr "完成安装" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "你控制下的网络服务" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "星期天" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "星期一" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "星期二" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "星期三" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "星期四" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "星期五" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "星期六" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "一月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "二月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "三月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "四月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "五月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "六月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "七月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "八月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "九月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "十月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "十一月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "十二月" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "你控制下的网络服务" + #: templates/layout.user.php:38 msgid "Log out" msgstr "注销" diff --git a/l10n/zh_CN/core.po b/l10n/zh_CN/core.po index 9bd86b01e3..615b3796b3 100644 --- a/l10n/zh_CN/core.po +++ b/l10n/zh_CN/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-26 02:02+0200\n" -"PO-Revision-Date: 2012-10-25 12:03+0000\n" -"Last-Translator: hanfeng \n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,19 +21,19 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "没有提供应用程序名称。" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "没有可添加分类?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "此分类已存在: " -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "设置" @@ -167,7 +167,7 @@ msgstr "取消设置过期日期时出错" msgid "Error setting expiration date" msgstr "设置过期日期时出错" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "重置 ownCloud 密码" @@ -180,12 +180,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "您将会收到包含可以重置密码链接的邮件。" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "已请求" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "登录失败!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 diff --git a/l10n/zh_TW/core.po b/l10n/zh_TW/core.po index a000876a89..d347b3639a 100644 --- a/l10n/zh_TW/core.po +++ b/l10n/zh_TW/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 00:14+0000\n" +"POT-Creation-Date: 2012-10-28 00:01+0200\n" +"PO-Revision-Date: 2012-10-27 22:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -19,19 +19,19 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 +#: ajax/vcategories/add.php:22 ajax/vcategories/delete.php:22 msgid "Application name not provided." msgstr "未提供應用程式名稱" -#: ajax/vcategories/add.php:29 +#: ajax/vcategories/add.php:28 msgid "No category to add?" msgstr "無分類添加?" -#: ajax/vcategories/add.php:36 +#: ajax/vcategories/add.php:35 msgid "This category already exists: " msgstr "此分類已經存在:" -#: js/js.js:238 templates/layout.user.php:53 templates/layout.user.php:54 +#: js/js.js:243 templates/layout.user.php:53 templates/layout.user.php:54 msgid "Settings" msgstr "設定" @@ -165,7 +165,7 @@ msgstr "" msgid "Error setting expiration date" msgstr "" -#: lostpassword/index.php:26 +#: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud 密碼重設" @@ -178,12 +178,12 @@ msgid "You will receive a link to reset your password via Email." msgstr "重設密碼的連結將會寄到你的電子郵件信箱" #: lostpassword/templates/lostpassword.php:5 -msgid "Requested" -msgstr "已要求" +msgid "Reset email send." +msgstr "" #: lostpassword/templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "登入失敗!" +msgid "Request failed!" +msgstr "" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -316,86 +316,86 @@ msgstr "資料庫主機" msgid "Finish setup" msgstr "完成設定" -#: templates/layout.guest.php:38 -msgid "web services under your control" -msgstr "網路服務已在你控制" - -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Sunday" msgstr "週日" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Monday" msgstr "週一" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Tuesday" msgstr "週二" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Wednesday" msgstr "週三" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Thursday" msgstr "週四" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Friday" msgstr "週五" -#: templates/layout.user.php:17 +#: templates/layout.guest.php:15 templates/layout.user.php:17 msgid "Saturday" msgstr "週六" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "January" msgstr "一月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "February" msgstr "二月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "March" msgstr "三月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "April" msgstr "四月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "May" msgstr "五月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "June" msgstr "六月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "July" msgstr "七月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "August" msgstr "八月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "September" msgstr "九月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "October" msgstr "十月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "November" msgstr "十一月" -#: templates/layout.user.php:18 +#: templates/layout.guest.php:16 templates/layout.user.php:18 msgid "December" msgstr "十二月" +#: templates/layout.guest.php:41 +msgid "web services under your control" +msgstr "網路服務已在你控制" + #: templates/layout.user.php:38 msgid "Log out" msgstr "登出" diff --git a/lib/l10n/es.php b/lib/l10n/es.php index 5064fe2d2f..6648c1ccd5 100644 --- a/lib/l10n/es.php +++ b/lib/l10n/es.php @@ -14,6 +14,7 @@ "Token expired. Please reload page." => "Token expirado. Por favor, recarga la página.", "Files" => "Archivos", "Text" => "Texto", +"Images" => "Imágenes", "seconds ago" => "hace segundos", "1 minute ago" => "hace 1 minuto", "%d minutes ago" => "hace %d minutos", diff --git a/settings/l10n/de_DE.php b/settings/l10n/de_DE.php index 100cbfd113..fd89e32cd9 100644 --- a/settings/l10n/de_DE.php +++ b/settings/l10n/de_DE.php @@ -1,15 +1,15 @@ "Die Liste der Anwendungen im Store konnte nicht geladen werden.", -"Group already exists" => "Gruppe existiert bereits", -"Unable to add group" => "Gruppe konnte nicht angelegt werden", -"Could not enable app. " => "App konnte nicht aktiviert werden.", -"Email saved" => "E-Mail Adresse gespeichert", -"Invalid email" => "Ungültige E-Mail Adresse", +"Group already exists" => "Die Gruppe existiert bereits", +"Unable to add group" => "Die Gruppe konnte nicht angelegt werden", +"Could not enable app. " => "Die Anwendung konnte nicht aktiviert werden.", +"Email saved" => "E-Mail-Adresse gespeichert", +"Invalid email" => "Ungültige E-Mail-Adresse", "OpenID Changed" => "OpenID geändert", "Invalid request" => "Ungültige Anfrage", -"Unable to delete group" => "Gruppe konnte nicht gelöscht werden", +"Unable to delete group" => "Die Gruppe konnte nicht gelöscht werden", "Authentication error" => "Fehler bei der Anmeldung", -"Unable to delete user" => "Benutzer konnte nicht gelöscht werden", +"Unable to delete user" => "Der Benutzer konnte nicht gelöscht werden", "Language changed" => "Sprache geändert", "Unable to add user to group %s" => "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", "Unable to remove user from group %s" => "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", @@ -21,7 +21,7 @@ "Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "Ihr Datenverzeichnis ist möglicher Weise aus dem Internet erreichbar. Die .htaccess-Datei von ownCloud funktioniert nicht. Wir raten Ihnen dringend, dass Sie Ihren Webserver dahingehend konfigurieren, dass Ihr Datenverzeichnis nicht länger aus dem Internet erreichbar ist, oder Sie verschieben das Datenverzeichnis außerhalb des Wurzelverzeichnisses des Webservers.", "Cron" => "Cron-Jobs", "Execute one task with each page loaded" => "Führt eine Aufgabe bei jeder geladenen Seite aus.", -"cron.php is registered at a webcron service. Call the cron.php page in the owncloud root once a minute over http." => "cron.php ist bei einem Webcron-Dienst registriert. Ruf die Seite cron.php im ownCloud-Root minütlich per HTTP auf.", +"cron.php is registered at a webcron service. Call the cron.php page in the owncloud root once a minute over http." => "cron.php ist bei einem Webcron-Dienst registriert. Rufen Sie die Seite cron.php im ownCloud-Root minütlich per HTTP auf.", "Use systems cron service. Call the cron.php file in the owncloud folder via a system cronjob once a minute." => "Verwenden Sie den System-Crondienst. Bitte rufen Sie die cron.php im ownCloud-Ordner über einen System-Cronjob minütlich auf.", "Sharing" => "Freigabe", "Enable Share API" => "Freigabe-API aktivieren", @@ -30,7 +30,7 @@ "Allow users to share items to the public with links" => "Erlaube Nutzern, Dateien mithilfe von Links öffentlich zu teilen", "Allow resharing" => "Erneutes Teilen erlauben", "Allow users to share items shared with them again" => "Erlaubt Nutzern, Dateien die mit ihnen geteilt wurden, erneut zu teilen", -"Allow users to share with anyone" => "Erlaubet Nutzern mit jedem zu Teilen", +"Allow users to share with anyone" => "Erlaubt Nutzern mit jedem zu teilen", "Allow users to only share with users in their groups" => "Erlaubet Nutzern nur das Teilen in ihrer Gruppe", "Log" => "Log", "More" => "Mehr", @@ -50,7 +50,7 @@ "Desktop and Mobile Syncing Clients" => "Desktop- und mobile Clients für die Synchronisation", "Download" => "Download", "Your password was changed" => "Ihr Passwort wurde geändert.", -"Unable to change your password" => "Passwort konnte nicht geändert werden", +"Unable to change your password" => "Das Passwort konnte nicht geändert werden", "Current password" => "Aktuelles Passwort", "New password" => "Neues Passwort", "show" => "zeigen", diff --git a/settings/l10n/nl.php b/settings/l10n/nl.php index d24c4f04ad..7882f11c18 100644 --- a/settings/l10n/nl.php +++ b/settings/l10n/nl.php @@ -1,6 +1,5 @@ "Kan de lijst niet van de App store laden", -"Authentication error" => "Authenticatie fout", "Group already exists" => "Groep bestaat al", "Unable to add group" => "Niet in staat om groep toe te voegen", "Could not enable app. " => "Kan de app. niet activeren", @@ -9,6 +8,7 @@ "OpenID Changed" => "OpenID is aangepast", "Invalid request" => "Ongeldig verzoek", "Unable to delete group" => "Niet in staat om groep te verwijderen", +"Authentication error" => "Authenticatie fout", "Unable to delete user" => "Niet in staat om gebruiker te verwijderen", "Language changed" => "Taal aangepast", "Unable to add user to group %s" => "Niet in staat om gebruiker toe te voegen aan groep %s", @@ -21,8 +21,8 @@ "Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "Uw data folder en uw bestanden zijn hoogst waarschijnlijk vanaf het internet bereikbaar. Het .htaccess bestand dat ownCloud meelevert werkt niet. Het is ten zeerste aangeraden om uw webserver zodanig te configureren, dat de data folder niet bereikbaar is vanaf het internet of verplaatst uw data folder naar een locatie buiten de webserver document root.", "Cron" => "Cron", "Execute one task with each page loaded" => "Voer één taak uit met elke pagina die wordt geladen", -"cron.php is registered at a webcron service. Call the cron.php page in the owncloud root once a minute over http." => "cron.php is bij een webcron dienst geregistreerd. Roep de cron.php pagina in de owncloud root via http één maal per minuut op.", -"Use systems cron service. Call the cron.php file in the owncloud folder via a system cronjob once a minute." => "Gebruik de systeem cron dienst. Gebruik, eens per minuut, het bestand cron.php in de owncloud map via de systeem cronjob.", +"cron.php is registered at a webcron service. Call the cron.php page in the owncloud root once a minute over http." => "cron.php is bij een webcron dienst geregistreerd. Benader eens per minuut, via http de pagina cron.php in de owncloud hoofdmap.", +"Use systems cron service. Call the cron.php file in the owncloud folder via a system cronjob once a minute." => "Gebruik de systeem cronjob. Benader eens per minuut, via een systeem cronjob het bestand cron.php in de owncloud hoofdmap.", "Sharing" => "Delen", "Enable Share API" => "Zet de Deel API aan", "Allow apps to use the Share API" => "Sta apps toe om de Deel API te gebruiken", @@ -35,19 +35,19 @@ "Log" => "Log", "More" => "Meer", "Developed by the ownCloud community, the source code is licensed under the AGPL." => "Ontwikkeld door de ownCloud gemeenschap, de bron code is gelicenseerd onder de AGPL.", -"Add your App" => "Voeg je App toe", +"Add your App" => "App toevoegen", "More Apps" => "Meer apps", "Select an App" => "Selecteer een app", "See application page at apps.owncloud.com" => "Zie de applicatiepagina op apps.owncloud.com", "-licensed by " => "-Gelicenseerd door ", "Documentation" => "Documentatie", -"Managing Big Files" => "Onderhoud van grote bestanden", +"Managing Big Files" => "Instellingen voor grote bestanden", "Ask a question" => "Stel een vraag", "Problems connecting to help database." => "Problemen bij het verbinden met de helpdatabank.", "Go there manually." => "Ga er zelf heen.", "Answer" => "Beantwoord", "You have used %s of the available %s" => "Je hebt %s gebruikt van de beschikbare %s", -"Desktop and Mobile Syncing Clients" => "Desktop en mobiele synchronisatie apparaten", +"Desktop and Mobile Syncing Clients" => "Desktop en mobiele synchronisatie applicaties", "Download" => "Download", "Your password was changed" => "Je wachtwoord is veranderd", "Unable to change your password" => "Niet in staat om uw wachtwoord te wijzigen", @@ -55,12 +55,12 @@ "New password" => "Nieuw wachtwoord", "show" => "weergeven", "Change password" => "Wijzig wachtwoord", -"Email" => "mailadres", -"Your email address" => "Jouw mailadres", -"Fill in an email address to enable password recovery" => "Vul een mailadres in om je wachtwoord te kunnen herstellen", +"Email" => "E-mailadres", +"Your email address" => "Uw e-mailadres", +"Fill in an email address to enable password recovery" => "Vul een e-mailadres in om wachtwoord reset uit te kunnen voeren", "Language" => "Taal", "Help translate" => "Help met vertalen", -"use this address to connect to your ownCloud in your file manager" => "gebruik dit adres om verbinding te maken met ownCloud in uw bestandsbeheerprogramma", +"use this address to connect to your ownCloud in your file manager" => "Gebruik het bovenstaande adres om verbinding te maken met ownCloud in uw bestandbeheerprogramma", "Name" => "Naam", "Password" => "Wachtwoord", "Groups" => "Groepen", From a306e4b8a02cb03d5c6f29aa602e75d075e2877f Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Sun, 28 Oct 2012 10:19:12 +0100 Subject: [PATCH 088/481] Fix a typo --- core/templates/layout.guest.php | 2 +- core/templates/layout.user.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 1f39148b2b..9434948a9e 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -14,7 +14,7 @@ var oc_requestlifespan = ''; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = l('firstday')) ?>; + var firstDay = t('firstday')) ?>; diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 1f16fdf7c6..009ee59273 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -16,7 +16,7 @@ var datepickerFormatDate = l('jsdate')) ?>; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = l('firstday')) ?>; + var firstDay = t('firstday')) ?>; From 2d5edead777ff2010ff5dc56f36d81b033dfd436 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Sun, 28 Oct 2012 10:21:06 +0100 Subject: [PATCH 089/481] Revert "Fix a typo" This reverts commit a306e4b8a02cb03d5c6f29aa602e75d075e2877f. --- core/templates/layout.guest.php | 2 +- core/templates/layout.user.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 9434948a9e..1f39148b2b 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -14,7 +14,7 @@ var oc_requestlifespan = ''; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = t('firstday')) ?>; + var firstDay = l('firstday')) ?>; diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 009ee59273..1f16fdf7c6 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -16,7 +16,7 @@ var datepickerFormatDate = l('jsdate')) ?>; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = t('firstday')) ?>; + var firstDay = l('firstday')) ?>; From 5245e2b6beb971842c9760476372cef41a5d9a17 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Sun, 28 Oct 2012 10:33:18 +0100 Subject: [PATCH 090/481] ->l expects two parameters --- core/templates/layout.guest.php | 3 ++- core/templates/layout.user.php | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 1f39148b2b..e6468cdcfb 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -12,9 +12,10 @@ var oc_appswebroots = ; var oc_requesttoken = ''; var oc_requestlifespan = ''; + var datepickerFormatDate = l('jsdate', 'jsdate')) ?>; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = l('firstday')) ?>; + var firstDay = l('firstday', 'firstday')) ?>; diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 1f16fdf7c6..d876fbc98e 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -13,10 +13,10 @@ var oc_current_user = ''; var oc_requesttoken = ''; var oc_requestlifespan = ''; - var datepickerFormatDate = l('jsdate')) ?>; + var datepickerFormatDate = l('jsdate', 'jsdate')) ?>; var dayNames = t('Sunday'), (string)$l->t('Monday'), (string)$l->t('Tuesday'), (string)$l->t('Wednesday'), (string)$l->t('Thursday'), (string)$l->t('Friday'), (string)$l->t('Saturday'))) ?>; var monthNames = t('January'), (string)$l->t('February'), (string)$l->t('March'), (string)$l->t('April'), (string)$l->t('May'), (string)$l->t('June'), (string)$l->t('July'), (string)$l->t('August'), (string)$l->t('September'), (string)$l->t('October'), (string)$l->t('November'), (string)$l->t('December'))) ?>; - var firstDay = l('firstday')) ?>; + var firstDay = l('firstday', 'firstday')) ?>; From a2bbc1b3173d7e4106a27e7a99d61bea10ba6181 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sun, 28 Oct 2012 10:48:08 +0100 Subject: [PATCH 091/481] remove 3rdparty files --- 3rdparty/Archive/Tar.php | 1973 ------- 3rdparty/Console/Getopt.php | 251 - 3rdparty/Crypt_Blowfish/Blowfish.php | 317 - .../Crypt_Blowfish/Blowfish/DefaultKey.php | 327 -- 3rdparty/Dropbox/API.php | 380 -- 3rdparty/Dropbox/Exception.php | 15 - 3rdparty/Dropbox/Exception/Forbidden.php | 18 - 3rdparty/Dropbox/Exception/NotFound.php | 20 - 3rdparty/Dropbox/Exception/OverQuota.php | 20 - 3rdparty/Dropbox/Exception/RequestToken.php | 18 - 3rdparty/Dropbox/LICENSE.txt | 19 - 3rdparty/Dropbox/OAuth.php | 151 - 3rdparty/Dropbox/OAuth/Consumer/Dropbox.php | 37 - 3rdparty/Dropbox/OAuth/Curl.php | 282 - 3rdparty/Dropbox/README.md | 31 - 3rdparty/Dropbox/autoload.php | 29 - 3rdparty/Google/LICENSE.txt | 21 - 3rdparty/Google/OAuth.php | 751 --- 3rdparty/Google/common.inc.php | 185 - 3rdparty/MDB2.php | 4587 --------------- 3rdparty/MDB2/Date.php | 183 - 3rdparty/MDB2/Driver/Datatype/Common.php | 1842 ------ 3rdparty/MDB2/Driver/Datatype/mysql.php | 602 -- 3rdparty/MDB2/Driver/Datatype/oci8.php | 499 -- 3rdparty/MDB2/Driver/Datatype/pgsql.php | 579 -- 3rdparty/MDB2/Driver/Datatype/sqlite.php | 418 -- 3rdparty/MDB2/Driver/Function/Common.php | 293 - 3rdparty/MDB2/Driver/Function/mysql.php | 136 - 3rdparty/MDB2/Driver/Function/oci8.php | 187 - 3rdparty/MDB2/Driver/Function/pgsql.php | 132 - 3rdparty/MDB2/Driver/Function/sqlite.php | 162 - 3rdparty/MDB2/Driver/Manager/Common.php | 1038 ---- 3rdparty/MDB2/Driver/Manager/mysql.php | 1471 ----- 3rdparty/MDB2/Driver/Manager/oci8.php | 1340 ----- 3rdparty/MDB2/Driver/Manager/pgsql.php | 990 ---- 3rdparty/MDB2/Driver/Manager/sqlite.php | 1390 ----- 3rdparty/MDB2/Driver/Native/Common.php | 61 - 3rdparty/MDB2/Driver/Native/mysql.php | 60 - 3rdparty/MDB2/Driver/Native/oci8.php | 60 - 3rdparty/MDB2/Driver/Native/pgsql.php | 88 - 3rdparty/MDB2/Driver/Native/sqlite.php | 60 - 3rdparty/MDB2/Driver/Reverse/Common.php | 517 -- 3rdparty/MDB2/Driver/Reverse/mysql.php | 546 -- 3rdparty/MDB2/Driver/Reverse/oci8.php | 625 -- 3rdparty/MDB2/Driver/Reverse/pgsql.php | 574 -- 3rdparty/MDB2/Driver/Reverse/sqlite.php | 611 -- 3rdparty/MDB2/Driver/mysql.php | 1729 ------ 3rdparty/MDB2/Driver/oci8.php | 1700 ------ 3rdparty/MDB2/Driver/pgsql.php | 1583 ----- 3rdparty/MDB2/Driver/sqlite.php | 1104 ---- 3rdparty/MDB2/Extended.php | 723 --- 3rdparty/MDB2/Iterator.php | 262 - 3rdparty/MDB2/LOB.php | 264 - 3rdparty/MDB2/Schema.php | 2797 --------- 3rdparty/MDB2/Schema/Parser.php | 876 --- 3rdparty/MDB2/Schema/Parser2.php | 802 --- 3rdparty/MDB2/Schema/Reserved/ibase.php | 437 -- 3rdparty/MDB2/Schema/Reserved/mssql.php | 260 - 3rdparty/MDB2/Schema/Reserved/mysql.php | 285 - 3rdparty/MDB2/Schema/Reserved/oci8.php | 173 - 3rdparty/MDB2/Schema/Reserved/pgsql.php | 148 - 3rdparty/MDB2/Schema/Tool.php | 583 -- .../MDB2/Schema/Tool/ParameterException.php | 61 - 3rdparty/MDB2/Schema/Validate.php | 1004 ---- 3rdparty/MDB2/Schema/Writer.php | 586 -- 3rdparty/OS/Guess.php | 338 -- 3rdparty/PEAR-LICENSE | 27 - 3rdparty/PEAR.php | 1063 ---- 3rdparty/PEAR/Autoloader.php | 218 - 3rdparty/PEAR/Builder.php | 489 -- 3rdparty/PEAR/ChannelFile.php | 1559 ----- 3rdparty/PEAR/ChannelFile/Parser.php | 68 - 3rdparty/PEAR/Command.php | 414 -- 3rdparty/PEAR/Command/Auth.php | 81 - 3rdparty/PEAR/Command/Auth.xml | 30 - 3rdparty/PEAR/Command/Build.php | 85 - 3rdparty/PEAR/Command/Build.xml | 10 - 3rdparty/PEAR/Command/Channels.php | 883 --- 3rdparty/PEAR/Command/Channels.xml | 123 - 3rdparty/PEAR/Command/Common.php | 273 - 3rdparty/PEAR/Command/Config.php | 414 -- 3rdparty/PEAR/Command/Config.xml | 92 - 3rdparty/PEAR/Command/Install.php | 1268 ---- 3rdparty/PEAR/Command/Install.xml | 276 - 3rdparty/PEAR/Command/Mirror.php | 139 - 3rdparty/PEAR/Command/Mirror.xml | 18 - 3rdparty/PEAR/Command/Package.php | 1124 ---- 3rdparty/PEAR/Command/Package.xml | 237 - 3rdparty/PEAR/Command/Pickle.php | 421 -- 3rdparty/PEAR/Command/Pickle.xml | 36 - 3rdparty/PEAR/Command/Registry.php | 1145 ---- 3rdparty/PEAR/Command/Registry.xml | 58 - 3rdparty/PEAR/Command/Remote.php | 810 --- 3rdparty/PEAR/Command/Remote.xml | 109 - 3rdparty/PEAR/Command/Test.php | 337 -- 3rdparty/PEAR/Command/Test.xml | 54 - 3rdparty/PEAR/Common.php | 837 --- 3rdparty/PEAR/Config.php | 2097 ------- 3rdparty/PEAR/Dependency.php | 487 -- 3rdparty/PEAR/Dependency2.php | 1358 ----- 3rdparty/PEAR/DependencyDB.php | 769 --- 3rdparty/PEAR/Downloader.php | 1766 ------ 3rdparty/PEAR/Downloader/Package.php | 1988 ------- 3rdparty/PEAR/ErrorStack.php | 985 ---- 3rdparty/PEAR/Exception.php | 389 -- 3rdparty/PEAR/FixPHP5PEARWarnings.php | 7 - 3rdparty/PEAR/Frontend.php | 228 - 3rdparty/PEAR/Frontend/CLI.php | 751 --- 3rdparty/PEAR/Installer.php | 1823 ------ 3rdparty/PEAR/Installer/Role.php | 276 - 3rdparty/PEAR/Installer/Role/Cfg.php | 106 - 3rdparty/PEAR/Installer/Role/Cfg.xml | 15 - 3rdparty/PEAR/Installer/Role/Common.php | 174 - 3rdparty/PEAR/Installer/Role/Data.php | 28 - 3rdparty/PEAR/Installer/Role/Data.xml | 15 - 3rdparty/PEAR/Installer/Role/Doc.php | 28 - 3rdparty/PEAR/Installer/Role/Doc.xml | 15 - 3rdparty/PEAR/Installer/Role/Ext.php | 28 - 3rdparty/PEAR/Installer/Role/Ext.xml | 12 - 3rdparty/PEAR/Installer/Role/Php.php | 28 - 3rdparty/PEAR/Installer/Role/Php.xml | 15 - 3rdparty/PEAR/Installer/Role/Script.php | 28 - 3rdparty/PEAR/Installer/Role/Script.xml | 15 - 3rdparty/PEAR/Installer/Role/Src.php | 34 - 3rdparty/PEAR/Installer/Role/Src.xml | 12 - 3rdparty/PEAR/Installer/Role/Test.php | 28 - 3rdparty/PEAR/Installer/Role/Test.xml | 15 - 3rdparty/PEAR/Installer/Role/Www.php | 28 - 3rdparty/PEAR/Installer/Role/Www.xml | 15 - 3rdparty/PEAR/PackageFile.php | 492 -- 3rdparty/PEAR/PackageFile/Generator/v1.php | 1284 ---- 3rdparty/PEAR/PackageFile/Generator/v2.php | 893 --- 3rdparty/PEAR/PackageFile/Parser/v1.php | 459 -- 3rdparty/PEAR/PackageFile/Parser/v2.php | 113 - 3rdparty/PEAR/PackageFile/v1.php | 1612 ----- 3rdparty/PEAR/PackageFile/v2.php | 2049 ------- 3rdparty/PEAR/PackageFile/v2/Validator.php | 2154 ------- 3rdparty/PEAR/PackageFile/v2/rw.php | 1604 ----- 3rdparty/PEAR/Packager.php | 201 - 3rdparty/PEAR/REST.php | 483 -- 3rdparty/PEAR/REST/10.php | 871 --- 3rdparty/PEAR/REST/11.php | 341 -- 3rdparty/PEAR/REST/13.php | 299 - 3rdparty/PEAR/Registry.php | 2395 -------- 3rdparty/PEAR/Remote.php | 394 -- 3rdparty/PEAR/RunTest.php | 968 --- 3rdparty/PEAR/Task/Common.php | 202 - 3rdparty/PEAR/Task/Postinstallscript.php | 323 - 3rdparty/PEAR/Task/Postinstallscript/rw.php | 169 - 3rdparty/PEAR/Task/Replace.php | 176 - 3rdparty/PEAR/Task/Replace/rw.php | 61 - 3rdparty/PEAR/Task/Unixeol.php | 77 - 3rdparty/PEAR/Task/Unixeol/rw.php | 56 - 3rdparty/PEAR/Task/Windowseol.php | 77 - 3rdparty/PEAR/Task/Windowseol/rw.php | 56 - 3rdparty/PEAR/Validate.php | 629 -- 3rdparty/PEAR/Validator/PECL.php | 63 - 3rdparty/PEAR/XMLParser.php | 253 - 3rdparty/PEAR5.php | 33 - 3rdparty/Sabre/CalDAV/Backend/Abstract.php | 154 - .../Sabre/CalDAV/Backend/BackendInterface.php | 231 - .../CalDAV/Backend/NotificationSupport.php | 47 - 3rdparty/Sabre/CalDAV/Backend/PDO.php | 687 --- .../Sabre/CalDAV/Backend/SharingSupport.php | 238 - 3rdparty/Sabre/CalDAV/Calendar.php | 378 -- 3rdparty/Sabre/CalDAV/CalendarObject.php | 279 - 3rdparty/Sabre/CalDAV/CalendarQueryParser.php | 298 - .../Sabre/CalDAV/CalendarQueryValidator.php | 372 -- 3rdparty/Sabre/CalDAV/CalendarRootNode.php | 76 - .../CalDAV/Exception/InvalidComponentType.php | 32 - 3rdparty/Sabre/CalDAV/ICSExportPlugin.php | 141 - 3rdparty/Sabre/CalDAV/ICalendar.php | 35 - 3rdparty/Sabre/CalDAV/ICalendarObject.php | 20 - 3rdparty/Sabre/CalDAV/IShareableCalendar.php | 48 - 3rdparty/Sabre/CalDAV/ISharedCalendar.php | 22 - .../Sabre/CalDAV/Notifications/Collection.php | 169 - .../CalDAV/Notifications/ICollection.php | 22 - 3rdparty/Sabre/CalDAV/Notifications/INode.php | 38 - .../Notifications/INotificationType.php | 43 - 3rdparty/Sabre/CalDAV/Notifications/Node.php | 188 - .../Notifications/Notification/Invite.php | 276 - .../Notification/InviteReply.php | 216 - .../Notification/SystemStatus.php | 179 - 3rdparty/Sabre/CalDAV/Plugin.php | 1312 ----- .../Sabre/CalDAV/Principal/Collection.php | 31 - 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php | 178 - .../Sabre/CalDAV/Principal/ProxyWrite.php | 178 - 3rdparty/Sabre/CalDAV/Principal/User.php | 132 - .../CalDAV/Property/AllowedSharingModes.php | 72 - 3rdparty/Sabre/CalDAV/Property/Invite.php | 173 - .../Property/ScheduleCalendarTransp.php | 99 - .../SupportedCalendarComponentSet.php | 85 - .../CalDAV/Property/SupportedCalendarData.php | 38 - .../CalDAV/Property/SupportedCollationSet.php | 44 - 3rdparty/Sabre/CalDAV/Schedule/IMip.php | 110 - 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php | 16 - 3rdparty/Sabre/CalDAV/Schedule/Outbox.php | 160 - 3rdparty/Sabre/CalDAV/ShareableCalendar.php | 72 - 3rdparty/Sabre/CalDAV/SharedCalendar.php | 98 - 3rdparty/Sabre/CalDAV/SharingPlugin.php | 475 -- 3rdparty/Sabre/CalDAV/UserCalendars.php | 348 -- 3rdparty/Sabre/CalDAV/Version.php | 24 - 3rdparty/Sabre/CalDAV/includes.php | 62 - 3rdparty/Sabre/CardDAV/AddressBook.php | 312 - .../Sabre/CardDAV/AddressBookQueryParser.php | 219 - 3rdparty/Sabre/CardDAV/AddressBookRoot.php | 78 - 3rdparty/Sabre/CardDAV/Backend/Abstract.php | 166 - 3rdparty/Sabre/CardDAV/Backend/PDO.php | 330 -- 3rdparty/Sabre/CardDAV/Card.php | 256 - 3rdparty/Sabre/CardDAV/IAddressBook.php | 18 - 3rdparty/Sabre/CardDAV/ICard.php | 18 - 3rdparty/Sabre/CardDAV/IDirectory.php | 21 - 3rdparty/Sabre/CardDAV/Plugin.php | 702 --- .../CardDAV/Property/SupportedAddressData.php | 69 - 3rdparty/Sabre/CardDAV/UserAddressBooks.php | 257 - 3rdparty/Sabre/CardDAV/VCFExportPlugin.php | 107 - 3rdparty/Sabre/CardDAV/Version.php | 26 - 3rdparty/Sabre/CardDAV/includes.php | 33 - .../Sabre/DAV/Auth/Backend/AbstractBasic.php | 83 - .../Sabre/DAV/Auth/Backend/AbstractDigest.php | 98 - 3rdparty/Sabre/DAV/Auth/Backend/Apache.php | 62 - 3rdparty/Sabre/DAV/Auth/Backend/File.php | 75 - 3rdparty/Sabre/DAV/Auth/Backend/PDO.php | 65 - 3rdparty/Sabre/DAV/Auth/IBackend.php | 36 - 3rdparty/Sabre/DAV/Auth/Plugin.php | 111 - .../Sabre/DAV/Browser/GuessContentType.php | 97 - .../Sabre/DAV/Browser/MapGetToPropFind.php | 55 - 3rdparty/Sabre/DAV/Browser/Plugin.php | 489 -- 3rdparty/Sabre/DAV/Browser/assets/favicon.ico | Bin 4286 -> 0 bytes .../DAV/Browser/assets/icons/addressbook.png | Bin 7232 -> 0 bytes .../DAV/Browser/assets/icons/calendar.png | Bin 4388 -> 0 bytes .../Sabre/DAV/Browser/assets/icons/card.png | Bin 5695 -> 0 bytes .../DAV/Browser/assets/icons/collection.png | Bin 3474 -> 0 bytes .../Sabre/DAV/Browser/assets/icons/file.png | Bin 2837 -> 0 bytes .../Sabre/DAV/Browser/assets/icons/parent.png | Bin 3474 -> 0 bytes .../DAV/Browser/assets/icons/principal.png | Bin 5480 -> 0 bytes 3rdparty/Sabre/DAV/Client.php | 541 -- 3rdparty/Sabre/DAV/Collection.php | 110 - 3rdparty/Sabre/DAV/Exception.php | 64 - 3rdparty/Sabre/DAV/Exception/BadRequest.php | 28 - 3rdparty/Sabre/DAV/Exception/Conflict.php | 28 - .../Sabre/DAV/Exception/ConflictingLock.php | 35 - 3rdparty/Sabre/DAV/Exception/FileNotFound.php | 19 - 3rdparty/Sabre/DAV/Exception/Forbidden.php | 27 - .../DAV/Exception/InsufficientStorage.php | 27 - .../DAV/Exception/InvalidResourceType.php | 33 - .../Exception/LockTokenMatchesRequestUri.php | 39 - 3rdparty/Sabre/DAV/Exception/Locked.php | 67 - .../Sabre/DAV/Exception/MethodNotAllowed.php | 45 - .../Sabre/DAV/Exception/NotAuthenticated.php | 28 - 3rdparty/Sabre/DAV/Exception/NotFound.php | 28 - .../Sabre/DAV/Exception/NotImplemented.php | 27 - .../Sabre/DAV/Exception/PaymentRequired.php | 28 - .../DAV/Exception/PreconditionFailed.php | 69 - .../DAV/Exception/ReportNotSupported.php | 30 - .../RequestedRangeNotSatisfiable.php | 29 - .../DAV/Exception/UnsupportedMediaType.php | 28 - 3rdparty/Sabre/DAV/FS/Directory.php | 139 - 3rdparty/Sabre/DAV/FS/File.php | 89 - 3rdparty/Sabre/DAV/FS/Node.php | 80 - 3rdparty/Sabre/DAV/FSExt/Directory.php | 157 - 3rdparty/Sabre/DAV/FSExt/File.php | 117 - 3rdparty/Sabre/DAV/FSExt/Node.php | 212 - 3rdparty/Sabre/DAV/File.php | 85 - 3rdparty/Sabre/DAV/ICollection.php | 77 - 3rdparty/Sabre/DAV/IExtendedCollection.php | 28 - 3rdparty/Sabre/DAV/IFile.php | 77 - 3rdparty/Sabre/DAV/INode.php | 46 - 3rdparty/Sabre/DAV/IProperties.php | 67 - 3rdparty/Sabre/DAV/IQuota.php | 27 - 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php | 50 - 3rdparty/Sabre/DAV/Locks/Backend/FS.php | 191 - 3rdparty/Sabre/DAV/Locks/Backend/File.php | 181 - 3rdparty/Sabre/DAV/Locks/Backend/PDO.php | 165 - 3rdparty/Sabre/DAV/Locks/LockInfo.php | 81 - 3rdparty/Sabre/DAV/Locks/Plugin.php | 637 -- 3rdparty/Sabre/DAV/Mount/Plugin.php | 80 - 3rdparty/Sabre/DAV/Node.php | 55 - 3rdparty/Sabre/DAV/ObjectTree.php | 159 - 3rdparty/Sabre/DAV/PartialUpdate/IFile.php | 38 - 3rdparty/Sabre/DAV/PartialUpdate/Plugin.php | 209 - 3rdparty/Sabre/DAV/Property.php | 31 - .../Sabre/DAV/Property/GetLastModified.php | 75 - 3rdparty/Sabre/DAV/Property/Href.php | 91 - 3rdparty/Sabre/DAV/Property/HrefList.php | 96 - 3rdparty/Sabre/DAV/Property/IHref.php | 25 - 3rdparty/Sabre/DAV/Property/LockDiscovery.php | 102 - 3rdparty/Sabre/DAV/Property/ResourceType.php | 125 - 3rdparty/Sabre/DAV/Property/Response.php | 155 - 3rdparty/Sabre/DAV/Property/ResponseList.php | 57 - 3rdparty/Sabre/DAV/Property/SupportedLock.php | 76 - .../Sabre/DAV/Property/SupportedReportSet.php | 109 - 3rdparty/Sabre/DAV/PropertyInterface.php | 21 - 3rdparty/Sabre/DAV/Server.php | 2135 ------- 3rdparty/Sabre/DAV/ServerPlugin.php | 90 - 3rdparty/Sabre/DAV/SimpleCollection.php | 108 - 3rdparty/Sabre/DAV/SimpleFile.php | 121 - 3rdparty/Sabre/DAV/StringUtil.php | 91 - .../Sabre/DAV/TemporaryFileFilterPlugin.php | 289 - 3rdparty/Sabre/DAV/Tree.php | 193 - 3rdparty/Sabre/DAV/Tree/Filesystem.php | 123 - 3rdparty/Sabre/DAV/URLUtil.php | 121 - 3rdparty/Sabre/DAV/UUIDUtil.php | 64 - 3rdparty/Sabre/DAV/Version.php | 24 - 3rdparty/Sabre/DAV/XMLUtil.php | 165 - 3rdparty/Sabre/DAV/includes.php | 98 - .../DAVACL/AbstractPrincipalCollection.php | 154 - .../Sabre/DAVACL/Exception/AceConflict.php | 32 - .../Sabre/DAVACL/Exception/NeedPrivileges.php | 81 - .../Sabre/DAVACL/Exception/NoAbstract.php | 32 - .../Exception/NotRecognizedPrincipal.php | 32 - .../Exception/NotSupportedPrivilege.php | 32 - 3rdparty/Sabre/DAVACL/IACL.php | 73 - 3rdparty/Sabre/DAVACL/IPrincipal.php | 75 - 3rdparty/Sabre/DAVACL/IPrincipalBackend.php | 153 - 3rdparty/Sabre/DAVACL/Plugin.php | 1382 ----- 3rdparty/Sabre/DAVACL/Principal.php | 279 - .../Sabre/DAVACL/PrincipalBackend/PDO.php | 427 -- 3rdparty/Sabre/DAVACL/PrincipalCollection.php | 35 - 3rdparty/Sabre/DAVACL/Property/Acl.php | 209 - .../Sabre/DAVACL/Property/AclRestrictions.php | 32 - .../Property/CurrentUserPrivilegeSet.php | 75 - 3rdparty/Sabre/DAVACL/Property/Principal.php | 160 - .../DAVACL/Property/SupportedPrivilegeSet.php | 92 - 3rdparty/Sabre/DAVACL/Version.php | 24 - 3rdparty/Sabre/DAVACL/includes.php | 38 - 3rdparty/Sabre/HTTP/AWSAuth.php | 227 - 3rdparty/Sabre/HTTP/AbstractAuth.php | 111 - 3rdparty/Sabre/HTTP/BasicAuth.php | 67 - 3rdparty/Sabre/HTTP/DigestAuth.php | 240 - 3rdparty/Sabre/HTTP/Request.php | 268 - 3rdparty/Sabre/HTTP/Response.php | 162 - 3rdparty/Sabre/HTTP/Util.php | 82 - 3rdparty/Sabre/HTTP/Version.php | 24 - 3rdparty/Sabre/HTTP/includes.php | 27 - 3rdparty/Sabre/VObject/Component.php | 405 -- 3rdparty/Sabre/VObject/Component/VAlarm.php | 108 - .../Sabre/VObject/Component/VCalendar.php | 242 - 3rdparty/Sabre/VObject/Component/VCard.php | 105 - 3rdparty/Sabre/VObject/Component/VEvent.php | 70 - .../Sabre/VObject/Component/VFreeBusy.php | 68 - 3rdparty/Sabre/VObject/Component/VJournal.php | 46 - 3rdparty/Sabre/VObject/Component/VTodo.php | 68 - 3rdparty/Sabre/VObject/DateTimeParser.php | 181 - 3rdparty/Sabre/VObject/ElementList.php | 172 - 3rdparty/Sabre/VObject/FreeBusyGenerator.php | 322 - 3rdparty/Sabre/VObject/Node.php | 187 - 3rdparty/Sabre/VObject/Parameter.php | 88 - 3rdparty/Sabre/VObject/ParseException.php | 12 - 3rdparty/Sabre/VObject/Property.php | 430 -- 3rdparty/Sabre/VObject/Property/Compound.php | 129 - 3rdparty/Sabre/VObject/Property/DateTime.php | 233 - .../Sabre/VObject/Property/MultiDateTime.php | 168 - 3rdparty/Sabre/VObject/Reader.php | 217 - 3rdparty/Sabre/VObject/RecurrenceIterator.php | 1061 ---- 3rdparty/Sabre/VObject/Splitter/ICalendar.php | 111 - .../VObject/Splitter/SplitterInterface.php | 39 - 3rdparty/Sabre/VObject/Splitter/VCard.php | 76 - 3rdparty/Sabre/VObject/StringUtil.php | 61 - 3rdparty/Sabre/VObject/TimeZoneUtil.php | 351 -- 3rdparty/Sabre/VObject/Version.php | 24 - 3rdparty/Sabre/VObject/includes.php | 40 - 3rdparty/Sabre/autoload.php | 27 - 3rdparty/System.php | 629 -- 3rdparty/XML/Parser.php | 754 --- 3rdparty/XML/Parser/Simple.php | 326 - 3rdparty/aws-sdk/README.md | 136 - .../aws-sdk/_compatibility_test/README.md | 37 - .../sdk_compatibility.inc.php | 75 - .../sdk_compatibility_test.php | 789 --- .../sdk_compatibility_test_cli.php | 186 - 3rdparty/aws-sdk/_docs/CHANGELOG.md | 1405 ----- 3rdparty/aws-sdk/_docs/CONTRIBUTORS.md | 64 - .../aws-sdk/_docs/DYNAMODBSESSIONHANDLER.html | 235 - 3rdparty/aws-sdk/_docs/KNOWNISSUES.md | 65 - 3rdparty/aws-sdk/_docs/LICENSE.md | 151 - 3rdparty/aws-sdk/_docs/NOTICE.md | 444 -- .../aws-sdk/_docs/STREAMWRAPPER_README.html | 243 - .../_docs/WHERE_IS_THE_API_REFERENCE.md | 2 - .../authentication/signable.interface.php | 48 - .../signature_v2query.class.php | 163 - .../authentication/signature_v3json.class.php | 235 - .../signature_v3query.class.php | 192 - .../authentication/signature_v4json.class.php | 353 -- .../signature_v4query.class.php | 345 -- .../authentication/signer.abstract.php | 68 - 3rdparty/aws-sdk/lib/cachecore/LICENSE | 25 - 3rdparty/aws-sdk/lib/cachecore/README | 1 - 3rdparty/aws-sdk/lib/cachecore/_sql/README | 5 - 3rdparty/aws-sdk/lib/cachecore/_sql/mysql.sql | 7 - 3rdparty/aws-sdk/lib/cachecore/_sql/pgsql.sql | 6 - .../aws-sdk/lib/cachecore/_sql/sqlite3.sql | 2 - .../aws-sdk/lib/cachecore/cacheapc.class.php | 126 - .../aws-sdk/lib/cachecore/cachecore.class.php | 160 - .../aws-sdk/lib/cachecore/cachefile.class.php | 189 - .../aws-sdk/lib/cachecore/cachemc.class.php | 183 - .../aws-sdk/lib/cachecore/cachepdo.class.php | 297 - .../lib/cachecore/cachexcache.class.php | 129 - .../lib/cachecore/icachecore.interface.php | 66 - .../aws-sdk/lib/dom/ArrayToDOMDocument.php | 181 - 3rdparty/aws-sdk/lib/requestcore/LICENSE | 25 - 3rdparty/aws-sdk/lib/requestcore/README.md | 15 - 3rdparty/aws-sdk/lib/requestcore/cacert.pem | 3390 ----------- .../lib/requestcore/requestcore.class.php | 1028 ---- 3rdparty/aws-sdk/lib/yaml/LICENSE | 19 - 3rdparty/aws-sdk/lib/yaml/README.markdown | 15 - 3rdparty/aws-sdk/lib/yaml/lib/sfYaml.php | 135 - .../aws-sdk/lib/yaml/lib/sfYamlDumper.php | 60 - .../aws-sdk/lib/yaml/lib/sfYamlInline.php | 442 -- .../aws-sdk/lib/yaml/lib/sfYamlParser.php | 612 -- 3rdparty/aws-sdk/sdk.class.php | 1435 ----- 3rdparty/aws-sdk/services/s3.class.php | 3979 ------------- 3rdparty/aws-sdk/utilities/array.class.php | 312 - .../aws-sdk/utilities/batchrequest.class.php | 126 - .../aws-sdk/utilities/complextype.class.php | 123 - .../aws-sdk/utilities/credential.class.php | 157 - .../aws-sdk/utilities/credentials.class.php | 125 - .../aws-sdk/utilities/gzipdecode.class.php | 377 -- .../aws-sdk/utilities/hadoopbase.class.php | 67 - .../utilities/hadoopbootstrap.class.php | 127 - .../aws-sdk/utilities/hadoopstep.class.php | 98 - 3rdparty/aws-sdk/utilities/info.class.php | 69 - 3rdparty/aws-sdk/utilities/json.class.php | 89 - 3rdparty/aws-sdk/utilities/manifest.class.php | 54 - .../aws-sdk/utilities/mimetypes.class.php | 223 - 3rdparty/aws-sdk/utilities/policy.class.php | 134 - 3rdparty/aws-sdk/utilities/request.class.php | 70 - 3rdparty/aws-sdk/utilities/response.class.php | 29 - .../aws-sdk/utilities/simplexml.class.php | 248 - .../aws-sdk/utilities/stacktemplate.class.php | 52 - .../aws-sdk/utilities/stepconfig.class.php | 91 - .../aws-sdk/utilities/utilities.class.php | 399 -- 3rdparty/class.phpmailer.php | 2532 -------- 3rdparty/class.smtp.php | 818 --- 3rdparty/css/chosen-sprite.png | Bin 559 -> 0 bytes 3rdparty/css/chosen.css | 392 -- 3rdparty/css/chosen/chosen-sprite.png | Bin 3998 -> 0 bytes 3rdparty/css/chosen/chosen.css | 392 -- 3rdparty/fullcalendar/GPL-LICENSE.txt | 278 - 3rdparty/fullcalendar/MIT-LICENSE.txt | 20 - 3rdparty/fullcalendar/css/fullcalendar.css | 618 -- .../fullcalendar/css/fullcalendar.print.css | 61 - 3rdparty/fullcalendar/js/fullcalendar.js | 5220 ----------------- 3rdparty/fullcalendar/js/fullcalendar.min.js | 114 - 3rdparty/fullcalendar/js/gcal.js | 112 - 3rdparty/getid3/extension.cache.dbm.php | 211 - 3rdparty/getid3/extension.cache.mysql.php | 173 - 3rdparty/getid3/getid3.lib.php | 1317 ----- 3rdparty/getid3/getid3.php | 1744 ------ 3rdparty/getid3/license.txt | 340 -- 3rdparty/getid3/module.archive.gzip.php | 280 - 3rdparty/getid3/module.archive.rar.php | 53 - 3rdparty/getid3/module.archive.szip.php | 96 - 3rdparty/getid3/module.archive.tar.php | 178 - 3rdparty/getid3/module.archive.zip.php | 424 -- 3rdparty/getid3/module.audio-video.asf.php | 2021 ------- 3rdparty/getid3/module.audio-video.bink.php | 73 - 3rdparty/getid3/module.audio-video.flv.php | 731 --- .../getid3/module.audio-video.matroska.php | 1706 ------ 3rdparty/getid3/module.audio-video.mpeg.php | 299 - 3rdparty/getid3/module.audio-video.nsv.php | 226 - .../getid3/module.audio-video.quicktime.php | 2134 ------- 3rdparty/getid3/module.audio-video.real.php | 530 -- 3rdparty/getid3/module.audio-video.riff.php | 2409 -------- 3rdparty/getid3/module.audio-video.swf.php | 142 - 3rdparty/getid3/module.audio.aa.php | 59 - 3rdparty/getid3/module.audio.aac.php | 515 -- 3rdparty/getid3/module.audio.ac3.php | 473 -- 3rdparty/getid3/module.audio.au.php | 165 - 3rdparty/getid3/module.audio.avr.php | 127 - 3rdparty/getid3/module.audio.bonk.php | 230 - 3rdparty/getid3/module.audio.dss.php | 75 - 3rdparty/getid3/module.audio.dts.php | 246 - 3rdparty/getid3/module.audio.flac.php | 480 -- 3rdparty/getid3/module.audio.la.php | 229 - 3rdparty/getid3/module.audio.lpac.php | 130 - 3rdparty/getid3/module.audio.midi.php | 526 -- 3rdparty/getid3/module.audio.mod.php | 101 - 3rdparty/getid3/module.audio.monkey.php | 205 - 3rdparty/getid3/module.audio.mp3.php | 2011 ------- 3rdparty/getid3/module.audio.mpc.php | 509 -- 3rdparty/getid3/module.audio.ogg.php | 705 --- 3rdparty/getid3/module.audio.optimfrog.php | 429 -- 3rdparty/getid3/module.audio.rkau.php | 94 - 3rdparty/getid3/module.audio.shorten.php | 183 - 3rdparty/getid3/module.audio.tta.php | 109 - 3rdparty/getid3/module.audio.voc.php | 207 - 3rdparty/getid3/module.audio.vqf.php | 162 - 3rdparty/getid3/module.audio.wavpack.php | 400 -- 3rdparty/getid3/module.graphic.bmp.php | 690 --- 3rdparty/getid3/module.graphic.efax.php | 53 - 3rdparty/getid3/module.graphic.gif.php | 184 - 3rdparty/getid3/module.graphic.jpg.php | 338 -- 3rdparty/getid3/module.graphic.pcd.php | 134 - 3rdparty/getid3/module.graphic.png.php | 520 -- 3rdparty/getid3/module.graphic.svg.php | 104 - 3rdparty/getid3/module.graphic.tiff.php | 227 - 3rdparty/getid3/module.misc.cue.php | 312 - 3rdparty/getid3/module.misc.exe.php | 61 - 3rdparty/getid3/module.misc.iso.php | 389 -- 3rdparty/getid3/module.misc.msoffice.php | 40 - 3rdparty/getid3/module.misc.par2.php | 33 - 3rdparty/getid3/module.misc.pdf.php | 33 - 3rdparty/getid3/module.tag.apetag.php | 372 -- 3rdparty/getid3/module.tag.id3v1.php | 362 -- 3rdparty/getid3/module.tag.id3v2.php | 3327 ----------- 3rdparty/getid3/module.tag.lyrics3.php | 297 - 3rdparty/getid3/module.tag.xmp.php | 766 --- 3rdparty/getid3/write.apetag.php | 225 - 3rdparty/getid3/write.id3v1.php | 138 - 3rdparty/getid3/write.id3v2.php | 2050 ------- 3rdparty/getid3/write.lyrics3.php | 73 - 3rdparty/getid3/write.metaflac.php | 163 - 3rdparty/getid3/write.php | 615 -- 3rdparty/getid3/write.real.php | 275 - 3rdparty/getid3/write.vorbiscomment.php | 121 - 3rdparty/js/chosen/LICENSE.md | 24 - 3rdparty/js/chosen/README.md | 46 - 3rdparty/js/chosen/VERSION | 1 - 3rdparty/js/chosen/chosen.jquery.js | 952 --- 3rdparty/js/chosen/chosen.jquery.min.js | 10 - 3rdparty/mediawiki/CSSMin.php | 228 - 3rdparty/mediawiki/JavaScriptMinifier.php | 606 -- 3rdparty/miniColors/GPL-LICENSE.txt | 278 - 3rdparty/miniColors/MIT-LICENSE.txt | 20 - 3rdparty/miniColors/css/images/colors.png | Bin 12973 -> 0 bytes 3rdparty/miniColors/css/images/trigger.png | Bin 706 -> 0 bytes 3rdparty/miniColors/css/jquery.miniColors.css | 125 - 3rdparty/miniColors/js/jquery.miniColors.js | 710 --- .../miniColors/js/jquery.miniColors.min.js | 9 - 3rdparty/openid/class.openid.v3.php | 326 - 3rdparty/openid/phpmyid.php | 1707 ------ 3rdparty/php-cloudfiles/.gitignore | 3 - 3rdparty/php-cloudfiles/AUTHORS | 11 - 3rdparty/php-cloudfiles/COPYING | 27 - 3rdparty/php-cloudfiles/Changelog | 93 - 3rdparty/php-cloudfiles/README | 73 - 3rdparty/php-cloudfiles/cloudfiles.php | 2599 -------- .../php-cloudfiles/cloudfiles_exceptions.php | 41 - 3rdparty/php-cloudfiles/cloudfiles_http.php | 1488 ----- 3rdparty/phpass/PasswordHash.php | 253 - 3rdparty/phpass/c/Makefile | 21 - 3rdparty/phpass/c/crypt_private.c | 106 - 3rdparty/phpass/test.php | 72 - 3rdparty/smb4php/smb.php | 456 -- .../Component/Routing/Annotation/Route.php | 103 - .../Component/Routing/CompiledRoute.php | 134 - .../Routing/Exception/ExceptionInterface.php | 23 - .../Exception/InvalidParameterException.php | 23 - .../Exception/MethodNotAllowedException.php | 38 - .../MissingMandatoryParametersException.php | 24 - .../Exception/ResourceNotFoundException.php | 25 - .../Exception/RouteNotFoundException.php | 23 - .../Generator/Dumper/GeneratorDumper.php | 39 - .../Dumper/GeneratorDumperInterface.php | 45 - .../Generator/Dumper/PhpGeneratorDumper.php | 150 - .../Routing/Generator/UrlGenerator.php | 176 - .../Generator/UrlGeneratorInterface.php | 37 - .../routing/Symfony/Component/Routing/LICENSE | 19 - .../Routing/Loader/AnnotationClassLoader.php | 213 - .../Loader/AnnotationDirectoryLoader.php | 77 - .../Routing/Loader/AnnotationFileLoader.php | 125 - .../Routing/Loader/ClosureLoader.php | 54 - .../Routing/Loader/PhpFileLoader.php | 64 - .../Routing/Loader/XmlFileLoader.php | 224 - .../Routing/Loader/YamlFileLoader.php | 142 - .../Loader/schema/routing/routing-1.0.xsd | 38 - .../Routing/Matcher/ApacheUrlMatcher.php | 76 - .../Matcher/Dumper/ApacheMatcherDumper.php | 155 - .../Routing/Matcher/Dumper/MatcherDumper.php | 44 - .../Matcher/Dumper/MatcherDumperInterface.php | 41 - .../Matcher/Dumper/PhpMatcherDumper.php | 293 - .../Matcher/RedirectableUrlMatcher.php | 53 - .../RedirectableUrlMatcherInterface.php | 35 - .../Component/Routing/Matcher/UrlMatcher.php | 151 - .../Routing/Matcher/UrlMatcherInterface.php | 38 - .../Symfony/Component/Routing/README.md | 32 - .../Component/Routing/RequestContext.php | 250 - .../Routing/RequestContextAwareInterface.php | 27 - .../Symfony/Component/Routing/Route.php | 312 - .../Component/Routing/RouteCollection.php | 259 - .../Component/Routing/RouteCompiler.php | 128 - .../Routing/RouteCompilerInterface.php | 29 - .../Symfony/Component/Routing/Router.php | 263 - .../Component/Routing/RouterInterface.php | 26 - .../Symfony/Component/Routing/composer.json | 29 - 3rdparty/timepicker/GPL-LICENSE.txt | 278 - 3rdparty/timepicker/MIT-LICENSE.txt | 20 - .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 260 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 251 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 104 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 125 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 3762 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 90 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 129 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes .../css/include/jquery-1.5.1.min.js | 16 - .../css/include/jquery-ui-1.8.14.custom.css | 568 -- .../css/include/jquery.ui.core.min.js | 17 - .../css/include/jquery.ui.position.min.js | 16 - .../css/include/jquery.ui.tabs.min.js | 35 - .../css/include/jquery.ui.widget.min.js | 15 - .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 260 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 251 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 104 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 125 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 3762 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 90 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 129 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes .../timepicker/css/jquery.ui.timepicker.css | 69 - 3rdparty/timepicker/js/i18n/i18n.html | 147 - .../js/i18n/jquery.ui.timepicker-cs.js | 12 - .../js/i18n/jquery.ui.timepicker-de.js | 12 - .../js/i18n/jquery.ui.timepicker-es.js | 12 - .../js/i18n/jquery.ui.timepicker-fr.js | 13 - .../js/i18n/jquery.ui.timepicker-hr.js | 13 - .../js/i18n/jquery.ui.timepicker-it.js | 12 - .../js/i18n/jquery.ui.timepicker-ja.js | 12 - .../js/i18n/jquery.ui.timepicker-nl.js | 12 - .../js/i18n/jquery.ui.timepicker-pl.js | 12 - .../js/i18n/jquery.ui.timepicker-pt-BR.js | 12 - .../js/i18n/jquery.ui.timepicker-sl.js | 12 - .../js/i18n/jquery.ui.timepicker-sv.js | 12 - .../js/i18n/jquery.ui.timepicker-tr.js | 12 - .../timepicker/js/jquery.ui.timepicker.js | 1406 ----- 3rdparty/timepicker/releases.txt | 115 - 639 files changed, 200511 deletions(-) delete mode 100644 3rdparty/Archive/Tar.php delete mode 100644 3rdparty/Console/Getopt.php delete mode 100644 3rdparty/Crypt_Blowfish/Blowfish.php delete mode 100644 3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php delete mode 100644 3rdparty/Dropbox/API.php delete mode 100644 3rdparty/Dropbox/Exception.php delete mode 100644 3rdparty/Dropbox/Exception/Forbidden.php delete mode 100644 3rdparty/Dropbox/Exception/NotFound.php delete mode 100644 3rdparty/Dropbox/Exception/OverQuota.php delete mode 100644 3rdparty/Dropbox/Exception/RequestToken.php delete mode 100644 3rdparty/Dropbox/LICENSE.txt delete mode 100644 3rdparty/Dropbox/OAuth.php delete mode 100644 3rdparty/Dropbox/OAuth/Consumer/Dropbox.php delete mode 100644 3rdparty/Dropbox/OAuth/Curl.php delete mode 100644 3rdparty/Dropbox/README.md delete mode 100644 3rdparty/Dropbox/autoload.php delete mode 100644 3rdparty/Google/LICENSE.txt delete mode 100755 3rdparty/Google/OAuth.php delete mode 100755 3rdparty/Google/common.inc.php delete mode 100644 3rdparty/MDB2.php delete mode 100644 3rdparty/MDB2/Date.php delete mode 100644 3rdparty/MDB2/Driver/Datatype/Common.php delete mode 100644 3rdparty/MDB2/Driver/Datatype/mysql.php delete mode 100644 3rdparty/MDB2/Driver/Datatype/oci8.php delete mode 100644 3rdparty/MDB2/Driver/Datatype/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/Datatype/sqlite.php delete mode 100644 3rdparty/MDB2/Driver/Function/Common.php delete mode 100644 3rdparty/MDB2/Driver/Function/mysql.php delete mode 100644 3rdparty/MDB2/Driver/Function/oci8.php delete mode 100644 3rdparty/MDB2/Driver/Function/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/Function/sqlite.php delete mode 100644 3rdparty/MDB2/Driver/Manager/Common.php delete mode 100644 3rdparty/MDB2/Driver/Manager/mysql.php delete mode 100644 3rdparty/MDB2/Driver/Manager/oci8.php delete mode 100644 3rdparty/MDB2/Driver/Manager/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/Manager/sqlite.php delete mode 100644 3rdparty/MDB2/Driver/Native/Common.php delete mode 100644 3rdparty/MDB2/Driver/Native/mysql.php delete mode 100644 3rdparty/MDB2/Driver/Native/oci8.php delete mode 100644 3rdparty/MDB2/Driver/Native/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/Native/sqlite.php delete mode 100644 3rdparty/MDB2/Driver/Reverse/Common.php delete mode 100644 3rdparty/MDB2/Driver/Reverse/mysql.php delete mode 100644 3rdparty/MDB2/Driver/Reverse/oci8.php delete mode 100644 3rdparty/MDB2/Driver/Reverse/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/Reverse/sqlite.php delete mode 100644 3rdparty/MDB2/Driver/mysql.php delete mode 100644 3rdparty/MDB2/Driver/oci8.php delete mode 100644 3rdparty/MDB2/Driver/pgsql.php delete mode 100644 3rdparty/MDB2/Driver/sqlite.php delete mode 100644 3rdparty/MDB2/Extended.php delete mode 100644 3rdparty/MDB2/Iterator.php delete mode 100644 3rdparty/MDB2/LOB.php delete mode 100644 3rdparty/MDB2/Schema.php delete mode 100644 3rdparty/MDB2/Schema/Parser.php delete mode 100644 3rdparty/MDB2/Schema/Parser2.php delete mode 100644 3rdparty/MDB2/Schema/Reserved/ibase.php delete mode 100644 3rdparty/MDB2/Schema/Reserved/mssql.php delete mode 100644 3rdparty/MDB2/Schema/Reserved/mysql.php delete mode 100644 3rdparty/MDB2/Schema/Reserved/oci8.php delete mode 100644 3rdparty/MDB2/Schema/Reserved/pgsql.php delete mode 100644 3rdparty/MDB2/Schema/Tool.php delete mode 100644 3rdparty/MDB2/Schema/Tool/ParameterException.php delete mode 100644 3rdparty/MDB2/Schema/Validate.php delete mode 100644 3rdparty/MDB2/Schema/Writer.php delete mode 100644 3rdparty/OS/Guess.php delete mode 100644 3rdparty/PEAR-LICENSE delete mode 100644 3rdparty/PEAR.php delete mode 100644 3rdparty/PEAR/Autoloader.php delete mode 100644 3rdparty/PEAR/Builder.php delete mode 100644 3rdparty/PEAR/ChannelFile.php delete mode 100644 3rdparty/PEAR/ChannelFile/Parser.php delete mode 100644 3rdparty/PEAR/Command.php delete mode 100644 3rdparty/PEAR/Command/Auth.php delete mode 100644 3rdparty/PEAR/Command/Auth.xml delete mode 100644 3rdparty/PEAR/Command/Build.php delete mode 100644 3rdparty/PEAR/Command/Build.xml delete mode 100644 3rdparty/PEAR/Command/Channels.php delete mode 100644 3rdparty/PEAR/Command/Channels.xml delete mode 100644 3rdparty/PEAR/Command/Common.php delete mode 100644 3rdparty/PEAR/Command/Config.php delete mode 100644 3rdparty/PEAR/Command/Config.xml delete mode 100644 3rdparty/PEAR/Command/Install.php delete mode 100644 3rdparty/PEAR/Command/Install.xml delete mode 100644 3rdparty/PEAR/Command/Mirror.php delete mode 100644 3rdparty/PEAR/Command/Mirror.xml delete mode 100644 3rdparty/PEAR/Command/Package.php delete mode 100644 3rdparty/PEAR/Command/Package.xml delete mode 100644 3rdparty/PEAR/Command/Pickle.php delete mode 100644 3rdparty/PEAR/Command/Pickle.xml delete mode 100644 3rdparty/PEAR/Command/Registry.php delete mode 100644 3rdparty/PEAR/Command/Registry.xml delete mode 100644 3rdparty/PEAR/Command/Remote.php delete mode 100644 3rdparty/PEAR/Command/Remote.xml delete mode 100644 3rdparty/PEAR/Command/Test.php delete mode 100644 3rdparty/PEAR/Command/Test.xml delete mode 100644 3rdparty/PEAR/Common.php delete mode 100644 3rdparty/PEAR/Config.php delete mode 100644 3rdparty/PEAR/Dependency.php delete mode 100644 3rdparty/PEAR/Dependency2.php delete mode 100644 3rdparty/PEAR/DependencyDB.php delete mode 100644 3rdparty/PEAR/Downloader.php delete mode 100644 3rdparty/PEAR/Downloader/Package.php delete mode 100644 3rdparty/PEAR/ErrorStack.php delete mode 100644 3rdparty/PEAR/Exception.php delete mode 100644 3rdparty/PEAR/FixPHP5PEARWarnings.php delete mode 100644 3rdparty/PEAR/Frontend.php delete mode 100644 3rdparty/PEAR/Frontend/CLI.php delete mode 100644 3rdparty/PEAR/Installer.php delete mode 100644 3rdparty/PEAR/Installer/Role.php delete mode 100644 3rdparty/PEAR/Installer/Role/Cfg.php delete mode 100644 3rdparty/PEAR/Installer/Role/Cfg.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Common.php delete mode 100644 3rdparty/PEAR/Installer/Role/Data.php delete mode 100644 3rdparty/PEAR/Installer/Role/Data.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Doc.php delete mode 100644 3rdparty/PEAR/Installer/Role/Doc.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Ext.php delete mode 100644 3rdparty/PEAR/Installer/Role/Ext.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Php.php delete mode 100644 3rdparty/PEAR/Installer/Role/Php.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Script.php delete mode 100644 3rdparty/PEAR/Installer/Role/Script.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Src.php delete mode 100644 3rdparty/PEAR/Installer/Role/Src.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Test.php delete mode 100644 3rdparty/PEAR/Installer/Role/Test.xml delete mode 100644 3rdparty/PEAR/Installer/Role/Www.php delete mode 100644 3rdparty/PEAR/Installer/Role/Www.xml delete mode 100644 3rdparty/PEAR/PackageFile.php delete mode 100644 3rdparty/PEAR/PackageFile/Generator/v1.php delete mode 100644 3rdparty/PEAR/PackageFile/Generator/v2.php delete mode 100644 3rdparty/PEAR/PackageFile/Parser/v1.php delete mode 100644 3rdparty/PEAR/PackageFile/Parser/v2.php delete mode 100644 3rdparty/PEAR/PackageFile/v1.php delete mode 100644 3rdparty/PEAR/PackageFile/v2.php delete mode 100644 3rdparty/PEAR/PackageFile/v2/Validator.php delete mode 100644 3rdparty/PEAR/PackageFile/v2/rw.php delete mode 100644 3rdparty/PEAR/Packager.php delete mode 100644 3rdparty/PEAR/REST.php delete mode 100644 3rdparty/PEAR/REST/10.php delete mode 100644 3rdparty/PEAR/REST/11.php delete mode 100644 3rdparty/PEAR/REST/13.php delete mode 100644 3rdparty/PEAR/Registry.php delete mode 100644 3rdparty/PEAR/Remote.php delete mode 100644 3rdparty/PEAR/RunTest.php delete mode 100644 3rdparty/PEAR/Task/Common.php delete mode 100644 3rdparty/PEAR/Task/Postinstallscript.php delete mode 100644 3rdparty/PEAR/Task/Postinstallscript/rw.php delete mode 100644 3rdparty/PEAR/Task/Replace.php delete mode 100644 3rdparty/PEAR/Task/Replace/rw.php delete mode 100644 3rdparty/PEAR/Task/Unixeol.php delete mode 100644 3rdparty/PEAR/Task/Unixeol/rw.php delete mode 100644 3rdparty/PEAR/Task/Windowseol.php delete mode 100644 3rdparty/PEAR/Task/Windowseol/rw.php delete mode 100644 3rdparty/PEAR/Validate.php delete mode 100644 3rdparty/PEAR/Validator/PECL.php delete mode 100644 3rdparty/PEAR/XMLParser.php delete mode 100644 3rdparty/PEAR5.php delete mode 100644 3rdparty/Sabre/CalDAV/Backend/Abstract.php delete mode 100644 3rdparty/Sabre/CalDAV/Backend/BackendInterface.php delete mode 100644 3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php delete mode 100644 3rdparty/Sabre/CalDAV/Backend/PDO.php delete mode 100644 3rdparty/Sabre/CalDAV/Backend/SharingSupport.php delete mode 100644 3rdparty/Sabre/CalDAV/Calendar.php delete mode 100644 3rdparty/Sabre/CalDAV/CalendarObject.php delete mode 100644 3rdparty/Sabre/CalDAV/CalendarQueryParser.php delete mode 100644 3rdparty/Sabre/CalDAV/CalendarQueryValidator.php delete mode 100644 3rdparty/Sabre/CalDAV/CalendarRootNode.php delete mode 100644 3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php delete mode 100644 3rdparty/Sabre/CalDAV/ICSExportPlugin.php delete mode 100644 3rdparty/Sabre/CalDAV/ICalendar.php delete mode 100644 3rdparty/Sabre/CalDAV/ICalendarObject.php delete mode 100644 3rdparty/Sabre/CalDAV/IShareableCalendar.php delete mode 100644 3rdparty/Sabre/CalDAV/ISharedCalendar.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/Collection.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/ICollection.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/INode.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/INotificationType.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/Node.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php delete mode 100644 3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php delete mode 100644 3rdparty/Sabre/CalDAV/Plugin.php delete mode 100644 3rdparty/Sabre/CalDAV/Principal/Collection.php delete mode 100644 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php delete mode 100644 3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php delete mode 100644 3rdparty/Sabre/CalDAV/Principal/User.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/Invite.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php delete mode 100644 3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php delete mode 100644 3rdparty/Sabre/CalDAV/Schedule/IMip.php delete mode 100644 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php delete mode 100644 3rdparty/Sabre/CalDAV/Schedule/Outbox.php delete mode 100644 3rdparty/Sabre/CalDAV/ShareableCalendar.php delete mode 100644 3rdparty/Sabre/CalDAV/SharedCalendar.php delete mode 100644 3rdparty/Sabre/CalDAV/SharingPlugin.php delete mode 100644 3rdparty/Sabre/CalDAV/UserCalendars.php delete mode 100644 3rdparty/Sabre/CalDAV/Version.php delete mode 100644 3rdparty/Sabre/CalDAV/includes.php delete mode 100644 3rdparty/Sabre/CardDAV/AddressBook.php delete mode 100644 3rdparty/Sabre/CardDAV/AddressBookQueryParser.php delete mode 100644 3rdparty/Sabre/CardDAV/AddressBookRoot.php delete mode 100644 3rdparty/Sabre/CardDAV/Backend/Abstract.php delete mode 100644 3rdparty/Sabre/CardDAV/Backend/PDO.php delete mode 100644 3rdparty/Sabre/CardDAV/Card.php delete mode 100644 3rdparty/Sabre/CardDAV/IAddressBook.php delete mode 100644 3rdparty/Sabre/CardDAV/ICard.php delete mode 100644 3rdparty/Sabre/CardDAV/IDirectory.php delete mode 100644 3rdparty/Sabre/CardDAV/Plugin.php delete mode 100644 3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php delete mode 100644 3rdparty/Sabre/CardDAV/UserAddressBooks.php delete mode 100644 3rdparty/Sabre/CardDAV/VCFExportPlugin.php delete mode 100644 3rdparty/Sabre/CardDAV/Version.php delete mode 100644 3rdparty/Sabre/CardDAV/includes.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Backend/Apache.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Backend/File.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Backend/PDO.php delete mode 100644 3rdparty/Sabre/DAV/Auth/IBackend.php delete mode 100644 3rdparty/Sabre/DAV/Auth/Plugin.php delete mode 100644 3rdparty/Sabre/DAV/Browser/GuessContentType.php delete mode 100644 3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php delete mode 100644 3rdparty/Sabre/DAV/Browser/Plugin.php delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/favicon.ico delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/card.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/collection.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/file.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/parent.png delete mode 100644 3rdparty/Sabre/DAV/Browser/assets/icons/principal.png delete mode 100644 3rdparty/Sabre/DAV/Client.php delete mode 100644 3rdparty/Sabre/DAV/Collection.php delete mode 100644 3rdparty/Sabre/DAV/Exception.php delete mode 100644 3rdparty/Sabre/DAV/Exception/BadRequest.php delete mode 100644 3rdparty/Sabre/DAV/Exception/Conflict.php delete mode 100644 3rdparty/Sabre/DAV/Exception/ConflictingLock.php delete mode 100644 3rdparty/Sabre/DAV/Exception/FileNotFound.php delete mode 100644 3rdparty/Sabre/DAV/Exception/Forbidden.php delete mode 100644 3rdparty/Sabre/DAV/Exception/InsufficientStorage.php delete mode 100644 3rdparty/Sabre/DAV/Exception/InvalidResourceType.php delete mode 100644 3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php delete mode 100644 3rdparty/Sabre/DAV/Exception/Locked.php delete mode 100644 3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php delete mode 100644 3rdparty/Sabre/DAV/Exception/NotAuthenticated.php delete mode 100644 3rdparty/Sabre/DAV/Exception/NotFound.php delete mode 100644 3rdparty/Sabre/DAV/Exception/NotImplemented.php delete mode 100644 3rdparty/Sabre/DAV/Exception/PaymentRequired.php delete mode 100644 3rdparty/Sabre/DAV/Exception/PreconditionFailed.php delete mode 100644 3rdparty/Sabre/DAV/Exception/ReportNotSupported.php delete mode 100644 3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php delete mode 100644 3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php delete mode 100644 3rdparty/Sabre/DAV/FS/Directory.php delete mode 100644 3rdparty/Sabre/DAV/FS/File.php delete mode 100644 3rdparty/Sabre/DAV/FS/Node.php delete mode 100644 3rdparty/Sabre/DAV/FSExt/Directory.php delete mode 100644 3rdparty/Sabre/DAV/FSExt/File.php delete mode 100644 3rdparty/Sabre/DAV/FSExt/Node.php delete mode 100644 3rdparty/Sabre/DAV/File.php delete mode 100644 3rdparty/Sabre/DAV/ICollection.php delete mode 100644 3rdparty/Sabre/DAV/IExtendedCollection.php delete mode 100644 3rdparty/Sabre/DAV/IFile.php delete mode 100644 3rdparty/Sabre/DAV/INode.php delete mode 100644 3rdparty/Sabre/DAV/IProperties.php delete mode 100644 3rdparty/Sabre/DAV/IQuota.php delete mode 100644 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php delete mode 100644 3rdparty/Sabre/DAV/Locks/Backend/FS.php delete mode 100644 3rdparty/Sabre/DAV/Locks/Backend/File.php delete mode 100644 3rdparty/Sabre/DAV/Locks/Backend/PDO.php delete mode 100644 3rdparty/Sabre/DAV/Locks/LockInfo.php delete mode 100644 3rdparty/Sabre/DAV/Locks/Plugin.php delete mode 100644 3rdparty/Sabre/DAV/Mount/Plugin.php delete mode 100644 3rdparty/Sabre/DAV/Node.php delete mode 100644 3rdparty/Sabre/DAV/ObjectTree.php delete mode 100644 3rdparty/Sabre/DAV/PartialUpdate/IFile.php delete mode 100644 3rdparty/Sabre/DAV/PartialUpdate/Plugin.php delete mode 100644 3rdparty/Sabre/DAV/Property.php delete mode 100644 3rdparty/Sabre/DAV/Property/GetLastModified.php delete mode 100644 3rdparty/Sabre/DAV/Property/Href.php delete mode 100644 3rdparty/Sabre/DAV/Property/HrefList.php delete mode 100644 3rdparty/Sabre/DAV/Property/IHref.php delete mode 100644 3rdparty/Sabre/DAV/Property/LockDiscovery.php delete mode 100644 3rdparty/Sabre/DAV/Property/ResourceType.php delete mode 100644 3rdparty/Sabre/DAV/Property/Response.php delete mode 100644 3rdparty/Sabre/DAV/Property/ResponseList.php delete mode 100644 3rdparty/Sabre/DAV/Property/SupportedLock.php delete mode 100644 3rdparty/Sabre/DAV/Property/SupportedReportSet.php delete mode 100644 3rdparty/Sabre/DAV/PropertyInterface.php delete mode 100644 3rdparty/Sabre/DAV/Server.php delete mode 100644 3rdparty/Sabre/DAV/ServerPlugin.php delete mode 100644 3rdparty/Sabre/DAV/SimpleCollection.php delete mode 100644 3rdparty/Sabre/DAV/SimpleFile.php delete mode 100644 3rdparty/Sabre/DAV/StringUtil.php delete mode 100644 3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php delete mode 100644 3rdparty/Sabre/DAV/Tree.php delete mode 100644 3rdparty/Sabre/DAV/Tree/Filesystem.php delete mode 100644 3rdparty/Sabre/DAV/URLUtil.php delete mode 100644 3rdparty/Sabre/DAV/UUIDUtil.php delete mode 100644 3rdparty/Sabre/DAV/Version.php delete mode 100644 3rdparty/Sabre/DAV/XMLUtil.php delete mode 100644 3rdparty/Sabre/DAV/includes.php delete mode 100644 3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php delete mode 100644 3rdparty/Sabre/DAVACL/Exception/AceConflict.php delete mode 100644 3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php delete mode 100644 3rdparty/Sabre/DAVACL/Exception/NoAbstract.php delete mode 100644 3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php delete mode 100644 3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php delete mode 100644 3rdparty/Sabre/DAVACL/IACL.php delete mode 100644 3rdparty/Sabre/DAVACL/IPrincipal.php delete mode 100644 3rdparty/Sabre/DAVACL/IPrincipalBackend.php delete mode 100644 3rdparty/Sabre/DAVACL/Plugin.php delete mode 100644 3rdparty/Sabre/DAVACL/Principal.php delete mode 100644 3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php delete mode 100644 3rdparty/Sabre/DAVACL/PrincipalCollection.php delete mode 100644 3rdparty/Sabre/DAVACL/Property/Acl.php delete mode 100644 3rdparty/Sabre/DAVACL/Property/AclRestrictions.php delete mode 100644 3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php delete mode 100644 3rdparty/Sabre/DAVACL/Property/Principal.php delete mode 100644 3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php delete mode 100644 3rdparty/Sabre/DAVACL/Version.php delete mode 100644 3rdparty/Sabre/DAVACL/includes.php delete mode 100644 3rdparty/Sabre/HTTP/AWSAuth.php delete mode 100644 3rdparty/Sabre/HTTP/AbstractAuth.php delete mode 100644 3rdparty/Sabre/HTTP/BasicAuth.php delete mode 100644 3rdparty/Sabre/HTTP/DigestAuth.php delete mode 100644 3rdparty/Sabre/HTTP/Request.php delete mode 100644 3rdparty/Sabre/HTTP/Response.php delete mode 100644 3rdparty/Sabre/HTTP/Util.php delete mode 100644 3rdparty/Sabre/HTTP/Version.php delete mode 100644 3rdparty/Sabre/HTTP/includes.php delete mode 100644 3rdparty/Sabre/VObject/Component.php delete mode 100644 3rdparty/Sabre/VObject/Component/VAlarm.php delete mode 100644 3rdparty/Sabre/VObject/Component/VCalendar.php delete mode 100644 3rdparty/Sabre/VObject/Component/VCard.php delete mode 100644 3rdparty/Sabre/VObject/Component/VEvent.php delete mode 100644 3rdparty/Sabre/VObject/Component/VFreeBusy.php delete mode 100644 3rdparty/Sabre/VObject/Component/VJournal.php delete mode 100644 3rdparty/Sabre/VObject/Component/VTodo.php delete mode 100644 3rdparty/Sabre/VObject/DateTimeParser.php delete mode 100644 3rdparty/Sabre/VObject/ElementList.php delete mode 100644 3rdparty/Sabre/VObject/FreeBusyGenerator.php delete mode 100644 3rdparty/Sabre/VObject/Node.php delete mode 100644 3rdparty/Sabre/VObject/Parameter.php delete mode 100644 3rdparty/Sabre/VObject/ParseException.php delete mode 100644 3rdparty/Sabre/VObject/Property.php delete mode 100644 3rdparty/Sabre/VObject/Property/Compound.php delete mode 100644 3rdparty/Sabre/VObject/Property/DateTime.php delete mode 100644 3rdparty/Sabre/VObject/Property/MultiDateTime.php delete mode 100644 3rdparty/Sabre/VObject/Reader.php delete mode 100644 3rdparty/Sabre/VObject/RecurrenceIterator.php delete mode 100644 3rdparty/Sabre/VObject/Splitter/ICalendar.php delete mode 100644 3rdparty/Sabre/VObject/Splitter/SplitterInterface.php delete mode 100644 3rdparty/Sabre/VObject/Splitter/VCard.php delete mode 100644 3rdparty/Sabre/VObject/StringUtil.php delete mode 100644 3rdparty/Sabre/VObject/TimeZoneUtil.php delete mode 100644 3rdparty/Sabre/VObject/Version.php delete mode 100644 3rdparty/Sabre/VObject/includes.php delete mode 100644 3rdparty/Sabre/autoload.php delete mode 100644 3rdparty/System.php delete mode 100644 3rdparty/XML/Parser.php delete mode 100644 3rdparty/XML/Parser/Simple.php delete mode 100644 3rdparty/aws-sdk/README.md delete mode 100644 3rdparty/aws-sdk/_compatibility_test/README.md delete mode 100644 3rdparty/aws-sdk/_compatibility_test/sdk_compatibility.inc.php delete mode 100644 3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test.php delete mode 100755 3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php delete mode 100644 3rdparty/aws-sdk/_docs/CHANGELOG.md delete mode 100644 3rdparty/aws-sdk/_docs/CONTRIBUTORS.md delete mode 100644 3rdparty/aws-sdk/_docs/DYNAMODBSESSIONHANDLER.html delete mode 100644 3rdparty/aws-sdk/_docs/KNOWNISSUES.md delete mode 100644 3rdparty/aws-sdk/_docs/LICENSE.md delete mode 100644 3rdparty/aws-sdk/_docs/NOTICE.md delete mode 100644 3rdparty/aws-sdk/_docs/STREAMWRAPPER_README.html delete mode 100644 3rdparty/aws-sdk/_docs/WHERE_IS_THE_API_REFERENCE.md delete mode 100644 3rdparty/aws-sdk/authentication/signable.interface.php delete mode 100644 3rdparty/aws-sdk/authentication/signature_v2query.class.php delete mode 100644 3rdparty/aws-sdk/authentication/signature_v3json.class.php delete mode 100644 3rdparty/aws-sdk/authentication/signature_v3query.class.php delete mode 100644 3rdparty/aws-sdk/authentication/signature_v4json.class.php delete mode 100644 3rdparty/aws-sdk/authentication/signature_v4query.class.php delete mode 100644 3rdparty/aws-sdk/authentication/signer.abstract.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/LICENSE delete mode 100755 3rdparty/aws-sdk/lib/cachecore/README delete mode 100755 3rdparty/aws-sdk/lib/cachecore/_sql/README delete mode 100755 3rdparty/aws-sdk/lib/cachecore/_sql/mysql.sql delete mode 100755 3rdparty/aws-sdk/lib/cachecore/_sql/pgsql.sql delete mode 100755 3rdparty/aws-sdk/lib/cachecore/_sql/sqlite3.sql delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cacheapc.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cachecore.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cachefile.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cachemc.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cachepdo.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/cachexcache.class.php delete mode 100755 3rdparty/aws-sdk/lib/cachecore/icachecore.interface.php delete mode 100644 3rdparty/aws-sdk/lib/dom/ArrayToDOMDocument.php delete mode 100755 3rdparty/aws-sdk/lib/requestcore/LICENSE delete mode 100755 3rdparty/aws-sdk/lib/requestcore/README.md delete mode 100755 3rdparty/aws-sdk/lib/requestcore/cacert.pem delete mode 100755 3rdparty/aws-sdk/lib/requestcore/requestcore.class.php delete mode 100644 3rdparty/aws-sdk/lib/yaml/LICENSE delete mode 100644 3rdparty/aws-sdk/lib/yaml/README.markdown delete mode 100644 3rdparty/aws-sdk/lib/yaml/lib/sfYaml.php delete mode 100644 3rdparty/aws-sdk/lib/yaml/lib/sfYamlDumper.php delete mode 100644 3rdparty/aws-sdk/lib/yaml/lib/sfYamlInline.php delete mode 100644 3rdparty/aws-sdk/lib/yaml/lib/sfYamlParser.php delete mode 100755 3rdparty/aws-sdk/sdk.class.php delete mode 100755 3rdparty/aws-sdk/services/s3.class.php delete mode 100644 3rdparty/aws-sdk/utilities/array.class.php delete mode 100644 3rdparty/aws-sdk/utilities/batchrequest.class.php delete mode 100644 3rdparty/aws-sdk/utilities/complextype.class.php delete mode 100644 3rdparty/aws-sdk/utilities/credential.class.php delete mode 100644 3rdparty/aws-sdk/utilities/credentials.class.php delete mode 100644 3rdparty/aws-sdk/utilities/gzipdecode.class.php delete mode 100644 3rdparty/aws-sdk/utilities/hadoopbase.class.php delete mode 100644 3rdparty/aws-sdk/utilities/hadoopbootstrap.class.php delete mode 100644 3rdparty/aws-sdk/utilities/hadoopstep.class.php delete mode 100644 3rdparty/aws-sdk/utilities/info.class.php delete mode 100644 3rdparty/aws-sdk/utilities/json.class.php delete mode 100644 3rdparty/aws-sdk/utilities/manifest.class.php delete mode 100644 3rdparty/aws-sdk/utilities/mimetypes.class.php delete mode 100644 3rdparty/aws-sdk/utilities/policy.class.php delete mode 100644 3rdparty/aws-sdk/utilities/request.class.php delete mode 100644 3rdparty/aws-sdk/utilities/response.class.php delete mode 100644 3rdparty/aws-sdk/utilities/simplexml.class.php delete mode 100644 3rdparty/aws-sdk/utilities/stacktemplate.class.php delete mode 100644 3rdparty/aws-sdk/utilities/stepconfig.class.php delete mode 100755 3rdparty/aws-sdk/utilities/utilities.class.php delete mode 100644 3rdparty/class.phpmailer.php delete mode 100644 3rdparty/class.smtp.php delete mode 100755 3rdparty/css/chosen-sprite.png delete mode 100755 3rdparty/css/chosen.css delete mode 100644 3rdparty/css/chosen/chosen-sprite.png delete mode 100755 3rdparty/css/chosen/chosen.css delete mode 100644 3rdparty/fullcalendar/GPL-LICENSE.txt delete mode 100644 3rdparty/fullcalendar/MIT-LICENSE.txt delete mode 100644 3rdparty/fullcalendar/css/fullcalendar.css delete mode 100644 3rdparty/fullcalendar/css/fullcalendar.print.css delete mode 100644 3rdparty/fullcalendar/js/fullcalendar.js delete mode 100644 3rdparty/fullcalendar/js/fullcalendar.min.js delete mode 100644 3rdparty/fullcalendar/js/gcal.js delete mode 100644 3rdparty/getid3/extension.cache.dbm.php delete mode 100644 3rdparty/getid3/extension.cache.mysql.php delete mode 100644 3rdparty/getid3/getid3.lib.php delete mode 100644 3rdparty/getid3/getid3.php delete mode 100644 3rdparty/getid3/license.txt delete mode 100644 3rdparty/getid3/module.archive.gzip.php delete mode 100644 3rdparty/getid3/module.archive.rar.php delete mode 100644 3rdparty/getid3/module.archive.szip.php delete mode 100644 3rdparty/getid3/module.archive.tar.php delete mode 100644 3rdparty/getid3/module.archive.zip.php delete mode 100644 3rdparty/getid3/module.audio-video.asf.php delete mode 100644 3rdparty/getid3/module.audio-video.bink.php delete mode 100644 3rdparty/getid3/module.audio-video.flv.php delete mode 100644 3rdparty/getid3/module.audio-video.matroska.php delete mode 100644 3rdparty/getid3/module.audio-video.mpeg.php delete mode 100644 3rdparty/getid3/module.audio-video.nsv.php delete mode 100644 3rdparty/getid3/module.audio-video.quicktime.php delete mode 100644 3rdparty/getid3/module.audio-video.real.php delete mode 100644 3rdparty/getid3/module.audio-video.riff.php delete mode 100644 3rdparty/getid3/module.audio-video.swf.php delete mode 100644 3rdparty/getid3/module.audio.aa.php delete mode 100644 3rdparty/getid3/module.audio.aac.php delete mode 100644 3rdparty/getid3/module.audio.ac3.php delete mode 100644 3rdparty/getid3/module.audio.au.php delete mode 100644 3rdparty/getid3/module.audio.avr.php delete mode 100644 3rdparty/getid3/module.audio.bonk.php delete mode 100644 3rdparty/getid3/module.audio.dss.php delete mode 100644 3rdparty/getid3/module.audio.dts.php delete mode 100644 3rdparty/getid3/module.audio.flac.php delete mode 100644 3rdparty/getid3/module.audio.la.php delete mode 100644 3rdparty/getid3/module.audio.lpac.php delete mode 100644 3rdparty/getid3/module.audio.midi.php delete mode 100644 3rdparty/getid3/module.audio.mod.php delete mode 100644 3rdparty/getid3/module.audio.monkey.php delete mode 100644 3rdparty/getid3/module.audio.mp3.php delete mode 100644 3rdparty/getid3/module.audio.mpc.php delete mode 100644 3rdparty/getid3/module.audio.ogg.php delete mode 100644 3rdparty/getid3/module.audio.optimfrog.php delete mode 100644 3rdparty/getid3/module.audio.rkau.php delete mode 100644 3rdparty/getid3/module.audio.shorten.php delete mode 100644 3rdparty/getid3/module.audio.tta.php delete mode 100644 3rdparty/getid3/module.audio.voc.php delete mode 100644 3rdparty/getid3/module.audio.vqf.php delete mode 100644 3rdparty/getid3/module.audio.wavpack.php delete mode 100644 3rdparty/getid3/module.graphic.bmp.php delete mode 100644 3rdparty/getid3/module.graphic.efax.php delete mode 100644 3rdparty/getid3/module.graphic.gif.php delete mode 100644 3rdparty/getid3/module.graphic.jpg.php delete mode 100644 3rdparty/getid3/module.graphic.pcd.php delete mode 100644 3rdparty/getid3/module.graphic.png.php delete mode 100644 3rdparty/getid3/module.graphic.svg.php delete mode 100644 3rdparty/getid3/module.graphic.tiff.php delete mode 100644 3rdparty/getid3/module.misc.cue.php delete mode 100644 3rdparty/getid3/module.misc.exe.php delete mode 100644 3rdparty/getid3/module.misc.iso.php delete mode 100644 3rdparty/getid3/module.misc.msoffice.php delete mode 100644 3rdparty/getid3/module.misc.par2.php delete mode 100644 3rdparty/getid3/module.misc.pdf.php delete mode 100644 3rdparty/getid3/module.tag.apetag.php delete mode 100644 3rdparty/getid3/module.tag.id3v1.php delete mode 100644 3rdparty/getid3/module.tag.id3v2.php delete mode 100644 3rdparty/getid3/module.tag.lyrics3.php delete mode 100644 3rdparty/getid3/module.tag.xmp.php delete mode 100644 3rdparty/getid3/write.apetag.php delete mode 100644 3rdparty/getid3/write.id3v1.php delete mode 100644 3rdparty/getid3/write.id3v2.php delete mode 100644 3rdparty/getid3/write.lyrics3.php delete mode 100644 3rdparty/getid3/write.metaflac.php delete mode 100644 3rdparty/getid3/write.php delete mode 100644 3rdparty/getid3/write.real.php delete mode 100644 3rdparty/getid3/write.vorbiscomment.php delete mode 100644 3rdparty/js/chosen/LICENSE.md delete mode 100644 3rdparty/js/chosen/README.md delete mode 100644 3rdparty/js/chosen/VERSION delete mode 100755 3rdparty/js/chosen/chosen.jquery.js delete mode 100755 3rdparty/js/chosen/chosen.jquery.min.js delete mode 100644 3rdparty/mediawiki/CSSMin.php delete mode 100644 3rdparty/mediawiki/JavaScriptMinifier.php delete mode 100644 3rdparty/miniColors/GPL-LICENSE.txt delete mode 100644 3rdparty/miniColors/MIT-LICENSE.txt delete mode 100755 3rdparty/miniColors/css/images/colors.png delete mode 100755 3rdparty/miniColors/css/images/trigger.png delete mode 100755 3rdparty/miniColors/css/jquery.miniColors.css delete mode 100755 3rdparty/miniColors/js/jquery.miniColors.js delete mode 100755 3rdparty/miniColors/js/jquery.miniColors.min.js delete mode 100644 3rdparty/openid/class.openid.v3.php delete mode 100644 3rdparty/openid/phpmyid.php delete mode 100644 3rdparty/php-cloudfiles/.gitignore delete mode 100644 3rdparty/php-cloudfiles/AUTHORS delete mode 100644 3rdparty/php-cloudfiles/COPYING delete mode 100644 3rdparty/php-cloudfiles/Changelog delete mode 100644 3rdparty/php-cloudfiles/README delete mode 100644 3rdparty/php-cloudfiles/cloudfiles.php delete mode 100644 3rdparty/php-cloudfiles/cloudfiles_exceptions.php delete mode 100644 3rdparty/php-cloudfiles/cloudfiles_http.php delete mode 100644 3rdparty/phpass/PasswordHash.php delete mode 100644 3rdparty/phpass/c/Makefile delete mode 100644 3rdparty/phpass/c/crypt_private.c delete mode 100644 3rdparty/phpass/test.php delete mode 100644 3rdparty/smb4php/smb.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Annotation/Route.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/CompiledRoute.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/LICENSE delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/README.md delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RequestContext.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Route.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCollection.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompiler.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Router.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouterInterface.php delete mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/composer.json delete mode 100755 3rdparty/timepicker/GPL-LICENSE.txt delete mode 100755 3rdparty/timepicker/MIT-LICENSE.txt delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_flat_10_000000_40x100.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-icons_222222_256x240.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-icons_228ef1_256x240.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-icons_ef8c08_256x240.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-icons_ffd27a_256x240.png delete mode 100755 3rdparty/timepicker/css/include/images/ui-icons_ffffff_256x240.png delete mode 100755 3rdparty/timepicker/css/include/jquery-1.5.1.min.js delete mode 100755 3rdparty/timepicker/css/include/jquery-ui-1.8.14.custom.css delete mode 100755 3rdparty/timepicker/css/include/jquery.ui.core.min.js delete mode 100755 3rdparty/timepicker/css/include/jquery.ui.position.min.js delete mode 100755 3rdparty/timepicker/css/include/jquery.ui.tabs.min.js delete mode 100755 3rdparty/timepicker/css/include/jquery.ui.widget.min.js delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_flat_10_000000_40x100.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_228ef1_256x240.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ef8c08_256x240.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100755 3rdparty/timepicker/css/jquery.ui.timepicker.css delete mode 100755 3rdparty/timepicker/js/i18n/i18n.html delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-cs.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-de.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-es.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-fr.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-hr.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-it.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-ja.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-nl.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-pl.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-pt-BR.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-sl.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-sv.js delete mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-tr.js delete mode 100755 3rdparty/timepicker/js/jquery.ui.timepicker.js delete mode 100755 3rdparty/timepicker/releases.txt diff --git a/3rdparty/Archive/Tar.php b/3rdparty/Archive/Tar.php deleted file mode 100644 index fd2d5d7d9b..0000000000 --- a/3rdparty/Archive/Tar.php +++ /dev/null @@ -1,1973 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category File_Formats - * @package Archive_Tar - * @author Vincent Blavet - * @copyright 1997-2010 The Authors - * @license http://www.opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Tar.php 324840 2012-04-05 08:44:41Z mrook $ - * @link http://pear.php.net/package/Archive_Tar - */ - -require_once 'PEAR.php'; - -define('ARCHIVE_TAR_ATT_SEPARATOR', 90001); -define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); - -/** -* Creates a (compressed) Tar archive -* -* @package Archive_Tar -* @author Vincent Blavet -* @license http://www.opensource.org/licenses/bsd-license.php New BSD License -* @version $Revision: 324840 $ -*/ -class Archive_Tar extends PEAR -{ - /** - * @var string Name of the Tar - */ - var $_tarname=''; - - /** - * @var boolean if true, the Tar file will be gzipped - */ - var $_compress=false; - - /** - * @var string Type of compression : 'none', 'gz' or 'bz2' - */ - var $_compress_type='none'; - - /** - * @var string Explode separator - */ - var $_separator=' '; - - /** - * @var file descriptor - */ - var $_file=0; - - /** - * @var string Local Tar name of a remote Tar (http:// or ftp://) - */ - var $_temp_tarname=''; - - /** - * @var string regular expression for ignoring files or directories - */ - var $_ignore_regexp=''; - - /** - * @var object PEAR_Error object - */ - var $error_object=null; - - // {{{ constructor - /** - * Archive_Tar Class constructor. This flavour of the constructor only - * declare a new Archive_Tar object, identifying it by the name of the - * tar file. - * If the compress argument is set the tar will be read or created as a - * gzip or bz2 compressed TAR file. - * - * @param string $p_tarname The name of the tar archive to create - * @param string $p_compress can be null, 'gz' or 'bz2'. This - * parameter indicates if gzip or bz2 compression - * is required. For compatibility reason the - * boolean value 'true' means 'gz'. - * - * @access public - */ - function Archive_Tar($p_tarname, $p_compress = null) - { - $this->PEAR(); - $this->_compress = false; - $this->_compress_type = 'none'; - if (($p_compress === null) || ($p_compress == '')) { - if (@file_exists($p_tarname)) { - if ($fp = @fopen($p_tarname, "rb")) { - // look for gzip magic cookie - $data = fread($fp, 2); - fclose($fp); - if ($data == "\37\213") { - $this->_compress = true; - $this->_compress_type = 'gz'; - // No sure it's enought for a magic code .... - } elseif ($data == "BZ") { - $this->_compress = true; - $this->_compress_type = 'bz2'; - } - } - } else { - // probably a remote file or some file accessible - // through a stream interface - if (substr($p_tarname, -2) == 'gz') { - $this->_compress = true; - $this->_compress_type = 'gz'; - } elseif ((substr($p_tarname, -3) == 'bz2') || - (substr($p_tarname, -2) == 'bz')) { - $this->_compress = true; - $this->_compress_type = 'bz2'; - } - } - } else { - if (($p_compress === true) || ($p_compress == 'gz')) { - $this->_compress = true; - $this->_compress_type = 'gz'; - } else if ($p_compress == 'bz2') { - $this->_compress = true; - $this->_compress_type = 'bz2'; - } else { - $this->_error("Unsupported compression type '$p_compress'\n". - "Supported types are 'gz' and 'bz2'.\n"); - return false; - } - } - $this->_tarname = $p_tarname; - if ($this->_compress) { // assert zlib or bz2 extension support - if ($this->_compress_type == 'gz') - $extname = 'zlib'; - else if ($this->_compress_type == 'bz2') - $extname = 'bz2'; - - if (!extension_loaded($extname)) { - PEAR::loadExtension($extname); - } - if (!extension_loaded($extname)) { - $this->_error("The extension '$extname' couldn't be found.\n". - "Please make sure your version of PHP was built ". - "with '$extname' support.\n"); - return false; - } - } - } - // }}} - - // {{{ destructor - function _Archive_Tar() - { - $this->_close(); - // ----- Look for a local copy to delete - if ($this->_temp_tarname != '') - @unlink($this->_temp_tarname); - $this->_PEAR(); - } - // }}} - - // {{{ create() - /** - * This method creates the archive file and add the files / directories - * that are listed in $p_filelist. - * If a file with the same name exist and is writable, it is replaced - * by the new tar. - * The method return false and a PEAR error text. - * The $p_filelist parameter can be an array of string, each string - * representing a filename or a directory name with their path if - * needed. It can also be a single string with names separated by a - * single blank. - * For each directory added in the archive, the files and - * sub-directories are also added. - * See also createModify() method for more details. - * - * @param array $p_filelist An array of filenames and directory names, or a - * single string with names separated by a single - * blank space. - * - * @return true on success, false on error. - * @see createModify() - * @access public - */ - function create($p_filelist) - { - return $this->createModify($p_filelist, '', ''); - } - // }}} - - // {{{ add() - /** - * This method add the files / directories that are listed in $p_filelist in - * the archive. If the archive does not exist it is created. - * The method return false and a PEAR error text. - * The files and directories listed are only added at the end of the archive, - * even if a file with the same name is already archived. - * See also createModify() method for more details. - * - * @param array $p_filelist An array of filenames and directory names, or a - * single string with names separated by a single - * blank space. - * - * @return true on success, false on error. - * @see createModify() - * @access public - */ - function add($p_filelist) - { - return $this->addModify($p_filelist, '', ''); - } - // }}} - - // {{{ extract() - function extract($p_path='', $p_preserve=false) - { - return $this->extractModify($p_path, '', $p_preserve); - } - // }}} - - // {{{ listContent() - function listContent() - { - $v_list_detail = array(); - - if ($this->_openRead()) { - if (!$this->_extractList('', $v_list_detail, "list", '', '')) { - unset($v_list_detail); - $v_list_detail = 0; - } - $this->_close(); - } - - return $v_list_detail; - } - // }}} - - // {{{ createModify() - /** - * This method creates the archive file and add the files / directories - * that are listed in $p_filelist. - * If the file already exists and is writable, it is replaced by the - * new tar. It is a create and not an add. If the file exists and is - * read-only or is a directory it is not replaced. The method return - * false and a PEAR error text. - * The $p_filelist parameter can be an array of string, each string - * representing a filename or a directory name with their path if - * needed. It can also be a single string with names separated by a - * single blank. - * The path indicated in $p_remove_dir will be removed from the - * memorized path of each file / directory listed when this path - * exists. By default nothing is removed (empty path '') - * The path indicated in $p_add_dir will be added at the beginning of - * the memorized path of each file / directory listed. However it can - * be set to empty ''. The adding of a path is done after the removing - * of path. - * The path add/remove ability enables the user to prepare an archive - * for extraction in a different path than the origin files are. - * See also addModify() method for file adding properties. - * - * @param array $p_filelist An array of filenames and directory names, - * or a single string with names separated by - * a single blank space. - * @param string $p_add_dir A string which contains a path to be added - * to the memorized path of each element in - * the list. - * @param string $p_remove_dir A string which contains a path to be - * removed from the memorized path of each - * element in the list, when relevant. - * - * @return boolean true on success, false on error. - * @access public - * @see addModify() - */ - function createModify($p_filelist, $p_add_dir, $p_remove_dir='') - { - $v_result = true; - - if (!$this->_openWrite()) - return false; - - if ($p_filelist != '') { - if (is_array($p_filelist)) - $v_list = $p_filelist; - elseif (is_string($p_filelist)) - $v_list = explode($this->_separator, $p_filelist); - else { - $this->_cleanFile(); - $this->_error('Invalid file list'); - return false; - } - - $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir); - } - - if ($v_result) { - $this->_writeFooter(); - $this->_close(); - } else - $this->_cleanFile(); - - return $v_result; - } - // }}} - - // {{{ addModify() - /** - * This method add the files / directories listed in $p_filelist at the - * end of the existing archive. If the archive does not yet exists it - * is created. - * The $p_filelist parameter can be an array of string, each string - * representing a filename or a directory name with their path if - * needed. It can also be a single string with names separated by a - * single blank. - * The path indicated in $p_remove_dir will be removed from the - * memorized path of each file / directory listed when this path - * exists. By default nothing is removed (empty path '') - * The path indicated in $p_add_dir will be added at the beginning of - * the memorized path of each file / directory listed. However it can - * be set to empty ''. The adding of a path is done after the removing - * of path. - * The path add/remove ability enables the user to prepare an archive - * for extraction in a different path than the origin files are. - * If a file/dir is already in the archive it will only be added at the - * end of the archive. There is no update of the existing archived - * file/dir. However while extracting the archive, the last file will - * replace the first one. This results in a none optimization of the - * archive size. - * If a file/dir does not exist the file/dir is ignored. However an - * error text is send to PEAR error. - * If a file/dir is not readable the file/dir is ignored. However an - * error text is send to PEAR error. - * - * @param array $p_filelist An array of filenames and directory - * names, or a single string with names - * separated by a single blank space. - * @param string $p_add_dir A string which contains a path to be - * added to the memorized path of each - * element in the list. - * @param string $p_remove_dir A string which contains a path to be - * removed from the memorized path of - * each element in the list, when - * relevant. - * - * @return true on success, false on error. - * @access public - */ - function addModify($p_filelist, $p_add_dir, $p_remove_dir='') - { - $v_result = true; - - if (!$this->_isArchive()) - $v_result = $this->createModify($p_filelist, $p_add_dir, - $p_remove_dir); - else { - if (is_array($p_filelist)) - $v_list = $p_filelist; - elseif (is_string($p_filelist)) - $v_list = explode($this->_separator, $p_filelist); - else { - $this->_error('Invalid file list'); - return false; - } - - $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir); - } - - return $v_result; - } - // }}} - - // {{{ addString() - /** - * This method add a single string as a file at the - * end of the existing archive. If the archive does not yet exists it - * is created. - * - * @param string $p_filename A string which contains the full - * filename path that will be associated - * with the string. - * @param string $p_string The content of the file added in - * the archive. - * - * @return true on success, false on error. - * @access public - */ - function addString($p_filename, $p_string) - { - $v_result = true; - - if (!$this->_isArchive()) { - if (!$this->_openWrite()) { - return false; - } - $this->_close(); - } - - if (!$this->_openAppend()) - return false; - - // Need to check the get back to the temporary file ? .... - $v_result = $this->_addString($p_filename, $p_string); - - $this->_writeFooter(); - - $this->_close(); - - return $v_result; - } - // }}} - - // {{{ extractModify() - /** - * This method extract all the content of the archive in the directory - * indicated by $p_path. When relevant the memorized path of the - * files/dir can be modified by removing the $p_remove_path path at the - * beginning of the file/dir path. - * While extracting a file, if the directory path does not exists it is - * created. - * While extracting a file, if the file already exists it is replaced - * without looking for last modification date. - * While extracting a file, if the file already exists and is write - * protected, the extraction is aborted. - * While extracting a file, if a directory with the same name already - * exists, the extraction is aborted. - * While extracting a directory, if a file with the same name already - * exists, the extraction is aborted. - * While extracting a file/directory if the destination directory exist - * and is write protected, or does not exist but can not be created, - * the extraction is aborted. - * If after extraction an extracted file does not show the correct - * stored file size, the extraction is aborted. - * When the extraction is aborted, a PEAR error text is set and false - * is returned. However the result can be a partial extraction that may - * need to be manually cleaned. - * - * @param string $p_path The path of the directory where the - * files/dir need to by extracted. - * @param string $p_remove_path Part of the memorized path that can be - * removed if present at the beginning of - * the file/dir path. - * @param boolean $p_preserve Preserve user/group ownership of files - * - * @return boolean true on success, false on error. - * @access public - * @see extractList() - */ - function extractModify($p_path, $p_remove_path, $p_preserve=false) - { - $v_result = true; - $v_list_detail = array(); - - if ($v_result = $this->_openRead()) { - $v_result = $this->_extractList($p_path, $v_list_detail, - "complete", 0, $p_remove_path, $p_preserve); - $this->_close(); - } - - return $v_result; - } - // }}} - - // {{{ extractInString() - /** - * This method extract from the archive one file identified by $p_filename. - * The return value is a string with the file content, or NULL on error. - * - * @param string $p_filename The path of the file to extract in a string. - * - * @return a string with the file content or NULL. - * @access public - */ - function extractInString($p_filename) - { - if ($this->_openRead()) { - $v_result = $this->_extractInString($p_filename); - $this->_close(); - } else { - $v_result = null; - } - - return $v_result; - } - // }}} - - // {{{ extractList() - /** - * This method extract from the archive only the files indicated in the - * $p_filelist. These files are extracted in the current directory or - * in the directory indicated by the optional $p_path parameter. - * If indicated the $p_remove_path can be used in the same way as it is - * used in extractModify() method. - * - * @param array $p_filelist An array of filenames and directory names, - * or a single string with names separated - * by a single blank space. - * @param string $p_path The path of the directory where the - * files/dir need to by extracted. - * @param string $p_remove_path Part of the memorized path that can be - * removed if present at the beginning of - * the file/dir path. - * @param boolean $p_preserve Preserve user/group ownership of files - * - * @return true on success, false on error. - * @access public - * @see extractModify() - */ - function extractList($p_filelist, $p_path='', $p_remove_path='', $p_preserve=false) - { - $v_result = true; - $v_list_detail = array(); - - if (is_array($p_filelist)) - $v_list = $p_filelist; - elseif (is_string($p_filelist)) - $v_list = explode($this->_separator, $p_filelist); - else { - $this->_error('Invalid string list'); - return false; - } - - if ($v_result = $this->_openRead()) { - $v_result = $this->_extractList($p_path, $v_list_detail, "partial", - $v_list, $p_remove_path, $p_preserve); - $this->_close(); - } - - return $v_result; - } - // }}} - - // {{{ setAttribute() - /** - * This method set specific attributes of the archive. It uses a variable - * list of parameters, in the format attribute code + attribute values : - * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ','); - * - * @param mixed $argv variable list of attributes and values - * - * @return true on success, false on error. - * @access public - */ - function setAttribute() - { - $v_result = true; - - // ----- Get the number of variable list of arguments - if (($v_size = func_num_args()) == 0) { - return true; - } - - // ----- Get the arguments - $v_att_list = &func_get_args(); - - // ----- Read the attributes - $i=0; - while ($i<$v_size) { - - // ----- Look for next option - switch ($v_att_list[$i]) { - // ----- Look for options that request a string value - case ARCHIVE_TAR_ATT_SEPARATOR : - // ----- Check the number of parameters - if (($i+1) >= $v_size) { - $this->_error('Invalid number of parameters for ' - .'attribute ARCHIVE_TAR_ATT_SEPARATOR'); - return false; - } - - // ----- Get the value - $this->_separator = $v_att_list[$i+1]; - $i++; - break; - - default : - $this->_error('Unknow attribute code '.$v_att_list[$i].''); - return false; - } - - // ----- Next attribute - $i++; - } - - return $v_result; - } - // }}} - - // {{{ setIgnoreRegexp() - /** - * This method sets the regular expression for ignoring files and directories - * at import, for example: - * $arch->setIgnoreRegexp("#CVS|\.svn#"); - * - * @param string $regexp regular expression defining which files or directories to ignore - * - * @access public - */ - function setIgnoreRegexp($regexp) - { - $this->_ignore_regexp = $regexp; - } - // }}} - - // {{{ setIgnoreList() - /** - * This method sets the regular expression for ignoring all files and directories - * matching the filenames in the array list at import, for example: - * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool')); - * - * @param array $list a list of file or directory names to ignore - * - * @access public - */ - function setIgnoreList($list) - { - $regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list); - $regexp = '#/'.join('$|/', $list).'#'; - $this->setIgnoreRegexp($regexp); - } - // }}} - - // {{{ _error() - function _error($p_message) - { - $this->error_object = &$this->raiseError($p_message); - } - // }}} - - // {{{ _warning() - function _warning($p_message) - { - $this->error_object = &$this->raiseError($p_message); - } - // }}} - - // {{{ _isArchive() - function _isArchive($p_filename=null) - { - if ($p_filename == null) { - $p_filename = $this->_tarname; - } - clearstatcache(); - return @is_file($p_filename) && !@is_link($p_filename); - } - // }}} - - // {{{ _openWrite() - function _openWrite() - { - if ($this->_compress_type == 'gz' && function_exists('gzopen')) - $this->_file = @gzopen($this->_tarname, "wb9"); - else if ($this->_compress_type == 'bz2' && function_exists('bzopen')) - $this->_file = @bzopen($this->_tarname, "w"); - else if ($this->_compress_type == 'none') - $this->_file = @fopen($this->_tarname, "wb"); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - if ($this->_file == 0) { - $this->_error('Unable to open in write mode \'' - .$this->_tarname.'\''); - return false; - } - - return true; - } - // }}} - - // {{{ _openRead() - function _openRead() - { - if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') { - - // ----- Look if a local copy need to be done - if ($this->_temp_tarname == '') { - $this->_temp_tarname = uniqid('tar').'.tmp'; - if (!$v_file_from = @fopen($this->_tarname, 'rb')) { - $this->_error('Unable to open in read mode \'' - .$this->_tarname.'\''); - $this->_temp_tarname = ''; - return false; - } - if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) { - $this->_error('Unable to open in write mode \'' - .$this->_temp_tarname.'\''); - $this->_temp_tarname = ''; - return false; - } - while ($v_data = @fread($v_file_from, 1024)) - @fwrite($v_file_to, $v_data); - @fclose($v_file_from); - @fclose($v_file_to); - } - - // ----- File to open if the local copy - $v_filename = $this->_temp_tarname; - - } else - // ----- File to open if the normal Tar file - $v_filename = $this->_tarname; - - if ($this->_compress_type == 'gz') - $this->_file = @gzopen($v_filename, "rb"); - else if ($this->_compress_type == 'bz2') - $this->_file = @bzopen($v_filename, "r"); - else if ($this->_compress_type == 'none') - $this->_file = @fopen($v_filename, "rb"); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - if ($this->_file == 0) { - $this->_error('Unable to open in read mode \''.$v_filename.'\''); - return false; - } - - return true; - } - // }}} - - // {{{ _openReadWrite() - function _openReadWrite() - { - if ($this->_compress_type == 'gz') - $this->_file = @gzopen($this->_tarname, "r+b"); - else if ($this->_compress_type == 'bz2') { - $this->_error('Unable to open bz2 in read/write mode \'' - .$this->_tarname.'\' (limitation of bz2 extension)'); - return false; - } else if ($this->_compress_type == 'none') - $this->_file = @fopen($this->_tarname, "r+b"); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - if ($this->_file == 0) { - $this->_error('Unable to open in read/write mode \'' - .$this->_tarname.'\''); - return false; - } - - return true; - } - // }}} - - // {{{ _close() - function _close() - { - //if (isset($this->_file)) { - if (is_resource($this->_file)) { - if ($this->_compress_type == 'gz') - @gzclose($this->_file); - else if ($this->_compress_type == 'bz2') - @bzclose($this->_file); - else if ($this->_compress_type == 'none') - @fclose($this->_file); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - $this->_file = 0; - } - - // ----- Look if a local copy need to be erase - // Note that it might be interesting to keep the url for a time : ToDo - if ($this->_temp_tarname != '') { - @unlink($this->_temp_tarname); - $this->_temp_tarname = ''; - } - - return true; - } - // }}} - - // {{{ _cleanFile() - function _cleanFile() - { - $this->_close(); - - // ----- Look for a local copy - if ($this->_temp_tarname != '') { - // ----- Remove the local copy but not the remote tarname - @unlink($this->_temp_tarname); - $this->_temp_tarname = ''; - } else { - // ----- Remove the local tarname file - @unlink($this->_tarname); - } - $this->_tarname = ''; - - return true; - } - // }}} - - // {{{ _writeBlock() - function _writeBlock($p_binary_data, $p_len=null) - { - if (is_resource($this->_file)) { - if ($p_len === null) { - if ($this->_compress_type == 'gz') - @gzputs($this->_file, $p_binary_data); - else if ($this->_compress_type == 'bz2') - @bzwrite($this->_file, $p_binary_data); - else if ($this->_compress_type == 'none') - @fputs($this->_file, $p_binary_data); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - } else { - if ($this->_compress_type == 'gz') - @gzputs($this->_file, $p_binary_data, $p_len); - else if ($this->_compress_type == 'bz2') - @bzwrite($this->_file, $p_binary_data, $p_len); - else if ($this->_compress_type == 'none') - @fputs($this->_file, $p_binary_data, $p_len); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - } - } - return true; - } - // }}} - - // {{{ _readBlock() - function _readBlock() - { - $v_block = null; - if (is_resource($this->_file)) { - if ($this->_compress_type == 'gz') - $v_block = @gzread($this->_file, 512); - else if ($this->_compress_type == 'bz2') - $v_block = @bzread($this->_file, 512); - else if ($this->_compress_type == 'none') - $v_block = @fread($this->_file, 512); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - } - return $v_block; - } - // }}} - - // {{{ _jumpBlock() - function _jumpBlock($p_len=null) - { - if (is_resource($this->_file)) { - if ($p_len === null) - $p_len = 1; - - if ($this->_compress_type == 'gz') { - @gzseek($this->_file, gztell($this->_file)+($p_len*512)); - } - else if ($this->_compress_type == 'bz2') { - // ----- Replace missing bztell() and bzseek() - for ($i=0; $i<$p_len; $i++) - $this->_readBlock(); - } else if ($this->_compress_type == 'none') - @fseek($this->_file, $p_len*512, SEEK_CUR); - else - $this->_error('Unknown or missing compression type (' - .$this->_compress_type.')'); - - } - return true; - } - // }}} - - // {{{ _writeFooter() - function _writeFooter() - { - if (is_resource($this->_file)) { - // ----- Write the last 0 filled block for end of archive - $v_binary_data = pack('a1024', ''); - $this->_writeBlock($v_binary_data); - } - return true; - } - // }}} - - // {{{ _addList() - function _addList($p_list, $p_add_dir, $p_remove_dir) - { - $v_result=true; - $v_header = array(); - - // ----- Remove potential windows directory separator - $p_add_dir = $this->_translateWinPath($p_add_dir); - $p_remove_dir = $this->_translateWinPath($p_remove_dir, false); - - if (!$this->_file) { - $this->_error('Invalid file descriptor'); - return false; - } - - if (sizeof($p_list) == 0) - return true; - - foreach ($p_list as $v_filename) { - if (!$v_result) { - break; - } - - // ----- Skip the current tar name - if ($v_filename == $this->_tarname) - continue; - - if ($v_filename == '') - continue; - - // ----- ignore files and directories matching the ignore regular expression - if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/'.$v_filename)) { - $this->_warning("File '$v_filename' ignored"); - continue; - } - - if (!file_exists($v_filename) && !is_link($v_filename)) { - $this->_warning("File '$v_filename' does not exist"); - continue; - } - - // ----- Add the file or directory header - if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) - return false; - - if (@is_dir($v_filename) && !@is_link($v_filename)) { - if (!($p_hdir = opendir($v_filename))) { - $this->_warning("Directory '$v_filename' can not be read"); - continue; - } - while (false !== ($p_hitem = readdir($p_hdir))) { - if (($p_hitem != '.') && ($p_hitem != '..')) { - if ($v_filename != ".") - $p_temp_list[0] = $v_filename.'/'.$p_hitem; - else - $p_temp_list[0] = $p_hitem; - - $v_result = $this->_addList($p_temp_list, - $p_add_dir, - $p_remove_dir); - } - } - - unset($p_temp_list); - unset($p_hdir); - unset($p_hitem); - } - } - - return $v_result; - } - // }}} - - // {{{ _addFile() - function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename=null) - { - if (!$this->_file) { - $this->_error('Invalid file descriptor'); - return false; - } - - if ($p_filename == '') { - $this->_error('Invalid file name'); - return false; - } - - // ownCloud change to make it possible to specify the filename to use - if(is_null($v_stored_filename)) { - // ----- Calculate the stored filename - $p_filename = $this->_translateWinPath($p_filename, false); - $v_stored_filename = $p_filename; - if (strcmp($p_filename, $p_remove_dir) == 0) { - return true; - } - if ($p_remove_dir != '') { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= '/'; - - if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) - $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); - } - $v_stored_filename = $this->_translateWinPath($v_stored_filename); - if ($p_add_dir != '') { - if (substr($p_add_dir, -1) == '/') - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir.'/'.$v_stored_filename; - } - - $v_stored_filename = $this->_pathReduction($v_stored_filename); - } - - if ($this->_isArchive($p_filename)) { - if (($v_file = @fopen($p_filename, "rb")) == 0) { - $this->_warning("Unable to open file '".$p_filename - ."' in binary read mode"); - return true; - } - - if (!$this->_writeHeader($p_filename, $v_stored_filename)) - return false; - - while (($v_buffer = fread($v_file, 512)) != '') { - $v_binary_data = pack("a512", "$v_buffer"); - $this->_writeBlock($v_binary_data); - } - - fclose($v_file); - - } else { - // ----- Only header for dir - if (!$this->_writeHeader($p_filename, $v_stored_filename)) - return false; - } - - return true; - } - // }}} - - // {{{ _addString() - function _addString($p_filename, $p_string) - { - if (!$this->_file) { - $this->_error('Invalid file descriptor'); - return false; - } - - if ($p_filename == '') { - $this->_error('Invalid file name'); - return false; - } - - // ----- Calculate the stored filename - $p_filename = $this->_translateWinPath($p_filename, false);; - - if (!$this->_writeHeaderBlock($p_filename, strlen($p_string), - time(), 384, "", 0, 0)) - return false; - - $i=0; - while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') { - $v_binary_data = pack("a512", $v_buffer); - $this->_writeBlock($v_binary_data); - } - - return true; - } - // }}} - - // {{{ _writeHeader() - function _writeHeader($p_filename, $p_stored_filename) - { - if ($p_stored_filename == '') - $p_stored_filename = $p_filename; - $v_reduce_filename = $this->_pathReduction($p_stored_filename); - - if (strlen($v_reduce_filename) > 99) { - if (!$this->_writeLongHeader($v_reduce_filename)) - return false; - } - - $v_info = lstat($p_filename); - $v_uid = sprintf("%07s", DecOct($v_info[4])); - $v_gid = sprintf("%07s", DecOct($v_info[5])); - $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777)); - - $v_mtime = sprintf("%011s", DecOct($v_info['mtime'])); - - $v_linkname = ''; - - if (@is_link($p_filename)) { - $v_typeflag = '2'; - $v_linkname = readlink($p_filename); - $v_size = sprintf("%011s", DecOct(0)); - } elseif (@is_dir($p_filename)) { - $v_typeflag = "5"; - $v_size = sprintf("%011s", DecOct(0)); - } else { - $v_typeflag = '0'; - clearstatcache(); - $v_size = sprintf("%011s", DecOct($v_info['size'])); - } - - $v_magic = 'ustar '; - - $v_version = ' '; - - if (function_exists('posix_getpwuid')) - { - $userinfo = posix_getpwuid($v_info[4]); - $groupinfo = posix_getgrgid($v_info[5]); - - $v_uname = $userinfo['name']; - $v_gname = $groupinfo['name']; - } - else - { - $v_uname = ''; - $v_gname = ''; - } - - $v_devmajor = ''; - - $v_devminor = ''; - - $v_prefix = ''; - - $v_binary_data_first = pack("a100a8a8a8a12a12", - $v_reduce_filename, $v_perms, $v_uid, - $v_gid, $v_size, $v_mtime); - $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", - $v_typeflag, $v_linkname, $v_magic, - $v_version, $v_uname, $v_gname, - $v_devmajor, $v_devminor, $v_prefix, ''); - - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - $v_checksum += ord(substr($v_binary_data_first,$i,1)); - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - $v_checksum += ord(' '); - // ..... Last part of the header - for ($i=156, $j=0; $i<512; $i++, $j++) - $v_checksum += ord(substr($v_binary_data_last,$j,1)); - - // ----- Write the first 148 bytes of the header in the archive - $this->_writeBlock($v_binary_data_first, 148); - - // ----- Write the calculated checksum - $v_checksum = sprintf("%06s ", DecOct($v_checksum)); - $v_binary_data = pack("a8", $v_checksum); - $this->_writeBlock($v_binary_data, 8); - - // ----- Write the last 356 bytes of the header in the archive - $this->_writeBlock($v_binary_data_last, 356); - - return true; - } - // }}} - - // {{{ _writeHeaderBlock() - function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0, - $p_type='', $p_uid=0, $p_gid=0) - { - $p_filename = $this->_pathReduction($p_filename); - - if (strlen($p_filename) > 99) { - if (!$this->_writeLongHeader($p_filename)) - return false; - } - - if ($p_type == "5") { - $v_size = sprintf("%011s", DecOct(0)); - } else { - $v_size = sprintf("%011s", DecOct($p_size)); - } - - $v_uid = sprintf("%07s", DecOct($p_uid)); - $v_gid = sprintf("%07s", DecOct($p_gid)); - $v_perms = sprintf("%07s", DecOct($p_perms & 000777)); - - $v_mtime = sprintf("%11s", DecOct($p_mtime)); - - $v_linkname = ''; - - $v_magic = 'ustar '; - - $v_version = ' '; - - if (function_exists('posix_getpwuid')) - { - $userinfo = posix_getpwuid($p_uid); - $groupinfo = posix_getgrgid($p_gid); - - $v_uname = $userinfo['name']; - $v_gname = $groupinfo['name']; - } - else - { - $v_uname = ''; - $v_gname = ''; - } - - $v_devmajor = ''; - - $v_devminor = ''; - - $v_prefix = ''; - - $v_binary_data_first = pack("a100a8a8a8a12A12", - $p_filename, $v_perms, $v_uid, $v_gid, - $v_size, $v_mtime); - $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", - $p_type, $v_linkname, $v_magic, - $v_version, $v_uname, $v_gname, - $v_devmajor, $v_devminor, $v_prefix, ''); - - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - $v_checksum += ord(substr($v_binary_data_first,$i,1)); - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - $v_checksum += ord(' '); - // ..... Last part of the header - for ($i=156, $j=0; $i<512; $i++, $j++) - $v_checksum += ord(substr($v_binary_data_last,$j,1)); - - // ----- Write the first 148 bytes of the header in the archive - $this->_writeBlock($v_binary_data_first, 148); - - // ----- Write the calculated checksum - $v_checksum = sprintf("%06s ", DecOct($v_checksum)); - $v_binary_data = pack("a8", $v_checksum); - $this->_writeBlock($v_binary_data, 8); - - // ----- Write the last 356 bytes of the header in the archive - $this->_writeBlock($v_binary_data_last, 356); - - return true; - } - // }}} - - // {{{ _writeLongHeader() - function _writeLongHeader($p_filename) - { - $v_size = sprintf("%11s ", DecOct(strlen($p_filename))); - - $v_typeflag = 'L'; - - $v_linkname = ''; - - $v_magic = ''; - - $v_version = ''; - - $v_uname = ''; - - $v_gname = ''; - - $v_devmajor = ''; - - $v_devminor = ''; - - $v_prefix = ''; - - $v_binary_data_first = pack("a100a8a8a8a12a12", - '././@LongLink', 0, 0, 0, $v_size, 0); - $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", - $v_typeflag, $v_linkname, $v_magic, - $v_version, $v_uname, $v_gname, - $v_devmajor, $v_devminor, $v_prefix, ''); - - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - $v_checksum += ord(substr($v_binary_data_first,$i,1)); - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - $v_checksum += ord(' '); - // ..... Last part of the header - for ($i=156, $j=0; $i<512; $i++, $j++) - $v_checksum += ord(substr($v_binary_data_last,$j,1)); - - // ----- Write the first 148 bytes of the header in the archive - $this->_writeBlock($v_binary_data_first, 148); - - // ----- Write the calculated checksum - $v_checksum = sprintf("%06s ", DecOct($v_checksum)); - $v_binary_data = pack("a8", $v_checksum); - $this->_writeBlock($v_binary_data, 8); - - // ----- Write the last 356 bytes of the header in the archive - $this->_writeBlock($v_binary_data_last, 356); - - // ----- Write the filename as content of the block - $i=0; - while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') { - $v_binary_data = pack("a512", "$v_buffer"); - $this->_writeBlock($v_binary_data); - } - - return true; - } - // }}} - - // {{{ _readHeader() - function _readHeader($v_binary_data, &$v_header) - { - if (strlen($v_binary_data)==0) { - $v_header['filename'] = ''; - return true; - } - - if (strlen($v_binary_data) != 512) { - $v_header['filename'] = ''; - $this->_error('Invalid block size : '.strlen($v_binary_data)); - return false; - } - - if (!is_array($v_header)) { - $v_header = array(); - } - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - $v_checksum+=ord(substr($v_binary_data,$i,1)); - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - $v_checksum += ord(' '); - // ..... Last part of the header - for ($i=156; $i<512; $i++) - $v_checksum+=ord(substr($v_binary_data,$i,1)); - - $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" . - "a8checksum/a1typeflag/a100link/a6magic/a2version/" . - "a32uname/a32gname/a8devmajor/a8devminor/a131prefix", - $v_binary_data); - - if (strlen($v_data["prefix"]) > 0) { - $v_data["filename"] = "$v_data[prefix]/$v_data[filename]"; - } - - // ----- Extract the checksum - $v_header['checksum'] = OctDec(trim($v_data['checksum'])); - if ($v_header['checksum'] != $v_checksum) { - $v_header['filename'] = ''; - - // ----- Look for last block (empty block) - if (($v_checksum == 256) && ($v_header['checksum'] == 0)) - return true; - - $this->_error('Invalid checksum for file "'.$v_data['filename'] - .'" : '.$v_checksum.' calculated, ' - .$v_header['checksum'].' expected'); - return false; - } - - // ----- Extract the properties - $v_header['filename'] = $v_data['filename']; - if ($this->_maliciousFilename($v_header['filename'])) { - $this->_error('Malicious .tar detected, file "' . $v_header['filename'] . - '" will not install in desired directory tree'); - return false; - } - $v_header['mode'] = OctDec(trim($v_data['mode'])); - $v_header['uid'] = OctDec(trim($v_data['uid'])); - $v_header['gid'] = OctDec(trim($v_data['gid'])); - $v_header['size'] = OctDec(trim($v_data['size'])); - $v_header['mtime'] = OctDec(trim($v_data['mtime'])); - if (($v_header['typeflag'] = $v_data['typeflag']) == "5") { - $v_header['size'] = 0; - } - $v_header['link'] = trim($v_data['link']); - /* ----- All these fields are removed form the header because - they do not carry interesting info - $v_header[magic] = trim($v_data[magic]); - $v_header[version] = trim($v_data[version]); - $v_header[uname] = trim($v_data[uname]); - $v_header[gname] = trim($v_data[gname]); - $v_header[devmajor] = trim($v_data[devmajor]); - $v_header[devminor] = trim($v_data[devminor]); - */ - - return true; - } - // }}} - - // {{{ _maliciousFilename() - /** - * Detect and report a malicious file name - * - * @param string $file - * - * @return bool - * @access private - */ - function _maliciousFilename($file) - { - if (strpos($file, '/../') !== false) { - return true; - } - if (strpos($file, '../') === 0) { - return true; - } - return false; - } - // }}} - - // {{{ _readLongHeader() - function _readLongHeader(&$v_header) - { - $v_filename = ''; - $n = floor($v_header['size']/512); - for ($i=0; $i<$n; $i++) { - $v_content = $this->_readBlock(); - $v_filename .= $v_content; - } - if (($v_header['size'] % 512) != 0) { - $v_content = $this->_readBlock(); - $v_filename .= trim($v_content); - } - - // ----- Read the next header - $v_binary_data = $this->_readBlock(); - - if (!$this->_readHeader($v_binary_data, $v_header)) - return false; - - $v_filename = trim($v_filename); - $v_header['filename'] = $v_filename; - if ($this->_maliciousFilename($v_filename)) { - $this->_error('Malicious .tar detected, file "' . $v_filename . - '" will not install in desired directory tree'); - return false; - } - - return true; - } - // }}} - - // {{{ _extractInString() - /** - * This method extract from the archive one file identified by $p_filename. - * The return value is a string with the file content, or null on error. - * - * @param string $p_filename The path of the file to extract in a string. - * - * @return a string with the file content or null. - * @access private - */ - function _extractInString($p_filename) - { - $v_result_str = ""; - - While (strlen($v_binary_data = $this->_readBlock()) != 0) - { - if (!$this->_readHeader($v_binary_data, $v_header)) - return null; - - if ($v_header['filename'] == '') - continue; - - // ----- Look for long filename - if ($v_header['typeflag'] == 'L') { - if (!$this->_readLongHeader($v_header)) - return null; - } - - if ($v_header['filename'] == $p_filename) { - if ($v_header['typeflag'] == "5") { - $this->_error('Unable to extract in string a directory ' - .'entry {'.$v_header['filename'].'}'); - return null; - } else { - $n = floor($v_header['size']/512); - for ($i=0; $i<$n; $i++) { - $v_result_str .= $this->_readBlock(); - } - if (($v_header['size'] % 512) != 0) { - $v_content = $this->_readBlock(); - $v_result_str .= substr($v_content, 0, - ($v_header['size'] % 512)); - } - return $v_result_str; - } - } else { - $this->_jumpBlock(ceil(($v_header['size']/512))); - } - } - - return null; - } - // }}} - - // {{{ _extractList() - function _extractList($p_path, &$p_list_detail, $p_mode, - $p_file_list, $p_remove_path, $p_preserve=false) - { - $v_result=true; - $v_nb = 0; - $v_extract_all = true; - $v_listing = false; - - $p_path = $this->_translateWinPath($p_path, false); - if ($p_path == '' || (substr($p_path, 0, 1) != '/' - && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) { - $p_path = "./".$p_path; - } - $p_remove_path = $this->_translateWinPath($p_remove_path); - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) - $p_remove_path .= '/'; - $p_remove_path_size = strlen($p_remove_path); - - switch ($p_mode) { - case "complete" : - $v_extract_all = true; - $v_listing = false; - break; - case "partial" : - $v_extract_all = false; - $v_listing = false; - break; - case "list" : - $v_extract_all = false; - $v_listing = true; - break; - default : - $this->_error('Invalid extract mode ('.$p_mode.')'); - return false; - } - - clearstatcache(); - - while (strlen($v_binary_data = $this->_readBlock()) != 0) - { - $v_extract_file = FALSE; - $v_extraction_stopped = 0; - - if (!$this->_readHeader($v_binary_data, $v_header)) - return false; - - if ($v_header['filename'] == '') { - continue; - } - - // ----- Look for long filename - if ($v_header['typeflag'] == 'L') { - if (!$this->_readLongHeader($v_header)) - return false; - } - - if ((!$v_extract_all) && (is_array($p_file_list))) { - // ----- By default no unzip if the file is not found - $v_extract_file = false; - - for ($i=0; $i strlen($p_file_list[$i])) - && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) - == $p_file_list[$i])) { - $v_extract_file = true; - break; - } - } - - // ----- It is a file, so compare the file names - elseif ($p_file_list[$i] == $v_header['filename']) { - $v_extract_file = true; - break; - } - } - } else { - $v_extract_file = true; - } - - // ----- Look if this file need to be extracted - if (($v_extract_file) && (!$v_listing)) - { - if (($p_remove_path != '') - && (substr($v_header['filename'], 0, $p_remove_path_size) - == $p_remove_path)) - $v_header['filename'] = substr($v_header['filename'], - $p_remove_path_size); - if (($p_path != './') && ($p_path != '/')) { - while (substr($p_path, -1) == '/') - $p_path = substr($p_path, 0, strlen($p_path)-1); - - if (substr($v_header['filename'], 0, 1) == '/') - $v_header['filename'] = $p_path.$v_header['filename']; - else - $v_header['filename'] = $p_path.'/'.$v_header['filename']; - } - if (file_exists($v_header['filename'])) { - if ( (@is_dir($v_header['filename'])) - && ($v_header['typeflag'] == '')) { - $this->_error('File '.$v_header['filename'] - .' already exists as a directory'); - return false; - } - if ( ($this->_isArchive($v_header['filename'])) - && ($v_header['typeflag'] == "5")) { - $this->_error('Directory '.$v_header['filename'] - .' already exists as a file'); - return false; - } - if (!is_writeable($v_header['filename'])) { - $this->_error('File '.$v_header['filename'] - .' already exists and is write protected'); - return false; - } - if (filemtime($v_header['filename']) > $v_header['mtime']) { - // To be completed : An error or silent no replace ? - } - } - - // ----- Check the directory availability and create it if necessary - elseif (($v_result - = $this->_dirCheck(($v_header['typeflag'] == "5" - ?$v_header['filename'] - :dirname($v_header['filename'])))) != 1) { - $this->_error('Unable to create path for '.$v_header['filename']); - return false; - } - - if ($v_extract_file) { - if ($v_header['typeflag'] == "5") { - if (!@file_exists($v_header['filename'])) { - if (!@mkdir($v_header['filename'], 0777)) { - $this->_error('Unable to create directory {' - .$v_header['filename'].'}'); - return false; - } - } - } elseif ($v_header['typeflag'] == "2") { - if (@file_exists($v_header['filename'])) { - @unlink($v_header['filename']); - } - if (!@symlink($v_header['link'], $v_header['filename'])) { - $this->_error('Unable to extract symbolic link {' - .$v_header['filename'].'}'); - return false; - } - } else { - if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { - $this->_error('Error while opening {'.$v_header['filename'] - .'} in write binary mode'); - return false; - } else { - $n = floor($v_header['size']/512); - for ($i=0; $i<$n; $i++) { - $v_content = $this->_readBlock(); - fwrite($v_dest_file, $v_content, 512); - } - if (($v_header['size'] % 512) != 0) { - $v_content = $this->_readBlock(); - fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); - } - - @fclose($v_dest_file); - - if ($p_preserve) { - @chown($v_header['filename'], $v_header['uid']); - @chgrp($v_header['filename'], $v_header['gid']); - } - - // ----- Change the file mode, mtime - @touch($v_header['filename'], $v_header['mtime']); - if ($v_header['mode'] & 0111) { - // make file executable, obey umask - $mode = fileperms($v_header['filename']) | (~umask() & 0111); - @chmod($v_header['filename'], $mode); - } - } - - // ----- Check the file size - clearstatcache(); - if (!is_file($v_header['filename'])) { - $this->_error('Extracted file '.$v_header['filename'] - .'does not exist. Archive may be corrupted.'); - return false; - } - - $filesize = filesize($v_header['filename']); - if ($filesize != $v_header['size']) { - $this->_error('Extracted file '.$v_header['filename'] - .' does not have the correct file size \'' - .$filesize - .'\' ('.$v_header['size'] - .' expected). Archive may be corrupted.'); - return false; - } - } - } else { - $this->_jumpBlock(ceil(($v_header['size']/512))); - } - } else { - $this->_jumpBlock(ceil(($v_header['size']/512))); - } - - /* TBC : Seems to be unused ... - if ($this->_compress) - $v_end_of_file = @gzeof($this->_file); - else - $v_end_of_file = @feof($this->_file); - */ - - if ($v_listing || $v_extract_file || $v_extraction_stopped) { - // ----- Log extracted files - if (($v_file_dir = dirname($v_header['filename'])) - == $v_header['filename']) - $v_file_dir = ''; - if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) - $v_file_dir = '/'; - - $p_list_detail[$v_nb++] = $v_header; - if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { - return true; - } - } - } - - return true; - } - // }}} - - // {{{ _openAppend() - function _openAppend() - { - if (filesize($this->_tarname) == 0) - return $this->_openWrite(); - - if ($this->_compress) { - $this->_close(); - - if (!@rename($this->_tarname, $this->_tarname.".tmp")) { - $this->_error('Error while renaming \''.$this->_tarname - .'\' to temporary file \''.$this->_tarname - .'.tmp\''); - return false; - } - - if ($this->_compress_type == 'gz') - $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb"); - elseif ($this->_compress_type == 'bz2') - $v_temp_tar = @bzopen($this->_tarname.".tmp", "r"); - - if ($v_temp_tar == 0) { - $this->_error('Unable to open file \''.$this->_tarname - .'.tmp\' in binary read mode'); - @rename($this->_tarname.".tmp", $this->_tarname); - return false; - } - - if (!$this->_openWrite()) { - @rename($this->_tarname.".tmp", $this->_tarname); - return false; - } - - if ($this->_compress_type == 'gz') { - $end_blocks = 0; - - while (!@gzeof($v_temp_tar)) { - $v_buffer = @gzread($v_temp_tar, 512); - if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { - $end_blocks++; - // do not copy end blocks, we will re-make them - // after appending - continue; - } elseif ($end_blocks > 0) { - for ($i = 0; $i < $end_blocks; $i++) { - $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); - } - $end_blocks = 0; - } - $v_binary_data = pack("a512", $v_buffer); - $this->_writeBlock($v_binary_data); - } - - @gzclose($v_temp_tar); - } - elseif ($this->_compress_type == 'bz2') { - $end_blocks = 0; - - while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { - if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { - $end_blocks++; - // do not copy end blocks, we will re-make them - // after appending - continue; - } elseif ($end_blocks > 0) { - for ($i = 0; $i < $end_blocks; $i++) { - $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); - } - $end_blocks = 0; - } - $v_binary_data = pack("a512", $v_buffer); - $this->_writeBlock($v_binary_data); - } - - @bzclose($v_temp_tar); - } - - if (!@unlink($this->_tarname.".tmp")) { - $this->_error('Error while deleting temporary file \'' - .$this->_tarname.'.tmp\''); - } - - } else { - // ----- For not compressed tar, just add files before the last - // one or two 512 bytes block - if (!$this->_openReadWrite()) - return false; - - clearstatcache(); - $v_size = filesize($this->_tarname); - - // We might have zero, one or two end blocks. - // The standard is two, but we should try to handle - // other cases. - fseek($this->_file, $v_size - 1024); - if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { - fseek($this->_file, $v_size - 1024); - } - elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { - fseek($this->_file, $v_size - 512); - } - } - - return true; - } - // }}} - - // {{{ _append() - function _append($p_filelist, $p_add_dir='', $p_remove_dir='') - { - if (!$this->_openAppend()) - return false; - - if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) - $this->_writeFooter(); - - $this->_close(); - - return true; - } - // }}} - - // {{{ _dirCheck() - - /** - * Check if a directory exists and create it (including parent - * dirs) if not. - * - * @param string $p_dir directory to check - * - * @return bool true if the directory exists or was created - */ - function _dirCheck($p_dir) - { - clearstatcache(); - if ((@is_dir($p_dir)) || ($p_dir == '')) - return true; - - $p_parent_dir = dirname($p_dir); - - if (($p_parent_dir != $p_dir) && - ($p_parent_dir != '') && - (!$this->_dirCheck($p_parent_dir))) - return false; - - if (!@mkdir($p_dir, 0777)) { - $this->_error("Unable to create directory '$p_dir'"); - return false; - } - - return true; - } - - // }}} - - // {{{ _pathReduction() - - /** - * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar", - * rand emove double slashes. - * - * @param string $p_dir path to reduce - * - * @return string reduced path - * - * @access private - * - */ - function _pathReduction($p_dir) - { - $v_result = ''; - - // ----- Look for not empty path - if ($p_dir != '') { - // ----- Explode path by directory names - $v_list = explode('/', $p_dir); - - // ----- Study directories from last to first - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - // ----- Ignore it and ignore the $i-1 - $i--; - } - else if ( ($v_list[$i] == '') - && ($i!=(sizeof($v_list)-1)) - && ($i!=0)) { - // ----- Ignore only the double '//' in path, - // but not the first and last / - } else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/' - .$v_result:''); - } - } - } - - if (defined('OS_WINDOWS') && OS_WINDOWS) { - $v_result = strtr($v_result, '\\', '/'); - } - - return $v_result; - } - - // }}} - - // {{{ _translateWinPath() - function _translateWinPath($p_path, $p_remove_disk_letter=true) - { - if (defined('OS_WINDOWS') && OS_WINDOWS) { - // ----- Look for potential disk letter - if ( ($p_remove_disk_letter) - && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; - } - // }}} - -} -?> diff --git a/3rdparty/Console/Getopt.php b/3rdparty/Console/Getopt.php deleted file mode 100644 index aec980b34d..0000000000 --- a/3rdparty/Console/Getopt.php +++ /dev/null @@ -1,251 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Getopt.php,v 1.21.4.7 2003/12/05 21:57:01 andrei Exp $ - -require_once( 'PEAR.php'); - -/** - * Command-line options parsing class. - * - * @author Andrei Zmievski - * - */ -class Console_Getopt { - /** - * Parses the command-line options. - * - * The first parameter to this function should be the list of command-line - * arguments without the leading reference to the running program. - * - * The second parameter is a string of allowed short options. Each of the - * option letters can be followed by a colon ':' to specify that the option - * requires an argument, or a double colon '::' to specify that the option - * takes an optional argument. - * - * The third argument is an optional array of allowed long options. The - * leading '--' should not be included in the option name. Options that - * require an argument should be followed by '=', and options that take an - * option argument should be followed by '=='. - * - * The return value is an array of two elements: the list of parsed - * options and the list of non-option command-line arguments. Each entry in - * the list of parsed options is a pair of elements - the first one - * specifies the option, and the second one specifies the option argument, - * if there was one. - * - * Long and short options can be mixed. - * - * Most of the semantics of this function are based on GNU getopt_long(). - * - * @param array $args an array of command-line arguments - * @param string $short_options specifies the list of allowed short options - * @param array $long_options specifies the list of allowed long options - * - * @return array two-element array containing the list of parsed options and - * the non-option arguments - * - * @access public - * - */ - function getopt2($args, $short_options, $long_options = null) - { - return Console_Getopt::doGetopt(2, $args, $short_options, $long_options); - } - - /** - * This function expects $args to start with the script name (POSIX-style). - * Preserved for backwards compatibility. - * @see getopt2() - */ - function getopt($args, $short_options, $long_options = null) - { - return Console_Getopt::doGetopt(1, $args, $short_options, $long_options); - } - - /** - * The actual implementation of the argument parsing code. - */ - function doGetopt($version, $args, $short_options, $long_options = null) - { - // in case you pass directly readPHPArgv() as the first arg - if (PEAR::isError($args)) { - return $args; - } - if (empty($args)) { - return array(array(), array()); - } - $opts = array(); - $non_opts = array(); - - settype($args, 'array'); - - if ($long_options) { - sort($long_options); - } - - /* - * Preserve backwards compatibility with callers that relied on - * erroneous POSIX fix. - */ - if ($version < 2) { - if (isset($args[0]{0}) && $args[0]{0} != '-') { - array_shift($args); - } - } - - reset($args); - while (list($i, $arg) = each($args)) { - - /* The special element '--' means explicit end of - options. Treat the rest of the arguments as non-options - and end the loop. */ - if ($arg == '--') { - $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); - break; - } - - if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) { - $non_opts = array_merge($non_opts, array_slice($args, $i)); - break; - } elseif (strlen($arg) > 1 && $arg{1} == '-') { - $error = Console_Getopt::_parseLongOption(substr($arg, 2), $long_options, $opts, $args); - if (PEAR::isError($error)) - return $error; - } else { - $error = Console_Getopt::_parseShortOption(substr($arg, 1), $short_options, $opts, $args); - if (PEAR::isError($error)) - return $error; - } - } - - return array($opts, $non_opts); - } - - /** - * @access private - * - */ - function _parseShortOption($arg, $short_options, &$opts, &$args) - { - for ($i = 0; $i < strlen($arg); $i++) { - $opt = $arg{$i}; - $opt_arg = null; - - /* Try to find the short option in the specifier string. */ - if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':') - { - return PEAR::raiseError("Console_Getopt: unrecognized option -- $opt"); - } - - if (strlen($spec) > 1 && $spec{1} == ':') { - if (strlen($spec) > 2 && $spec{2} == ':') { - if ($i + 1 < strlen($arg)) { - /* Option takes an optional argument. Use the remainder of - the arg string if there is anything left. */ - $opts[] = array($opt, substr($arg, $i + 1)); - break; - } - } else { - /* Option requires an argument. Use the remainder of the arg - string if there is anything left. */ - if ($i + 1 < strlen($arg)) { - $opts[] = array($opt, substr($arg, $i + 1)); - break; - } else if (list(, $opt_arg) = each($args)) - /* Else use the next argument. */; - else - return PEAR::raiseError("Console_Getopt: option requires an argument -- $opt"); - } - } - - $opts[] = array($opt, $opt_arg); - } - } - - /** - * @access private - * - */ - function _parseLongOption($arg, $long_options, &$opts, &$args) - { - @list($opt, $opt_arg) = explode('=', $arg); - $opt_len = strlen($opt); - - for ($i = 0; $i < count($long_options); $i++) { - $long_opt = $long_options[$i]; - $opt_start = substr($long_opt, 0, $opt_len); - - /* Option doesn't match. Go on to the next one. */ - if ($opt_start != $opt) - continue; - - $opt_rest = substr($long_opt, $opt_len); - - /* Check that the options uniquely matches one of the allowed - options. */ - if ($opt_rest != '' && $opt{0} != '=' && - $i + 1 < count($long_options) && - $opt == substr($long_options[$i+1], 0, $opt_len)) { - return PEAR::raiseError("Console_Getopt: option --$opt is ambiguous"); - } - - if (substr($long_opt, -1) == '=') { - if (substr($long_opt, -2) != '==') { - /* Long option requires an argument. - Take the next argument if one wasn't specified. */; - if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) { - return PEAR::raiseError("Console_Getopt: option --$opt requires an argument"); - } - } - } else if ($opt_arg) { - return PEAR::raiseError("Console_Getopt: option --$opt doesn't allow an argument"); - } - - $opts[] = array('--' . $opt, $opt_arg); - return; - } - - return PEAR::raiseError("Console_Getopt: unrecognized option --$opt"); - } - - /** - * Safely read the $argv PHP array across different PHP configurations. - * Will take care on register_globals and register_argc_argv ini directives - * - * @access public - * @return mixed the $argv PHP array or PEAR error if not registered - */ - function readPHPArgv() - { - global $argv; - if (!is_array($argv)) { - if (!@is_array($_SERVER['argv'])) { - if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) { - return PEAR::raiseError("Console_Getopt: Could not read cmd args (register_argc_argv=Off?)"); - } - return $GLOBALS['HTTP_SERVER_VARS']['argv']; - } - return $_SERVER['argv']; - } - return $argv; - } - -} - -?> diff --git a/3rdparty/Crypt_Blowfish/Blowfish.php b/3rdparty/Crypt_Blowfish/Blowfish.php deleted file mode 100644 index 4ccacb963e..0000000000 --- a/3rdparty/Crypt_Blowfish/Blowfish.php +++ /dev/null @@ -1,317 +0,0 @@ - - * @copyright 2005 Matthew Fonda - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: Blowfish.php,v 1.81 2005/05/30 18:40:36 mfonda Exp $ - * @link http://pear.php.net/package/Crypt_Blowfish - */ - - -require_once 'PEAR.php'; - - -/** - * - * Example usage: - * $bf = new Crypt_Blowfish('some secret key!'); - * $encrypted = $bf->encrypt('this is some example plain text'); - * $plaintext = $bf->decrypt($encrypted); - * echo "plain text: $plaintext"; - * - * - * @category Encryption - * @package Crypt_Blowfish - * @author Matthew Fonda - * @copyright 2005 Matthew Fonda - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @link http://pear.php.net/package/Crypt_Blowfish - * @version @package_version@ - * @access public - */ -class Crypt_Blowfish -{ - /** - * P-Array contains 18 32-bit subkeys - * - * @var array - * @access private - */ - var $_P = array(); - - - /** - * Array of four S-Blocks each containing 256 32-bit entries - * - * @var array - * @access private - */ - var $_S = array(); - - /** - * Mcrypt td resource - * - * @var resource - * @access private - */ - var $_td = null; - - /** - * Initialization vector - * - * @var string - * @access private - */ - var $_iv = null; - - - /** - * Crypt_Blowfish Constructor - * Initializes the Crypt_Blowfish object, and gives a sets - * the secret key - * - * @param string $key - * @access public - */ - function Crypt_Blowfish($key) - { - if (extension_loaded('mcrypt')) { - $this->_td = mcrypt_module_open(MCRYPT_BLOWFISH, '', 'ecb', ''); - $this->_iv = mcrypt_create_iv(8, MCRYPT_RAND); - } - $this->setKey($key); - } - - /** - * Deprecated isReady method - * - * @return bool - * @access public - * @deprecated - */ - function isReady() - { - return true; - } - - /** - * Deprecated init method - init is now a private - * method and has been replaced with _init - * - * @return bool - * @access public - * @deprecated - * @see Crypt_Blowfish::_init() - */ - function init() - { - $this->_init(); - } - - /** - * Initializes the Crypt_Blowfish object - * - * @access private - */ - function _init() - { - $defaults = new Crypt_Blowfish_DefaultKey(); - $this->_P = $defaults->P; - $this->_S = $defaults->S; - } - - /** - * Enciphers a single 64 bit block - * - * @param int &$Xl - * @param int &$Xr - * @access private - */ - function _encipher(&$Xl, &$Xr) - { - for ($i = 0; $i < 16; $i++) { - $temp = $Xl ^ $this->_P[$i]; - $Xl = ((($this->_S[0][($temp>>24) & 255] + - $this->_S[1][($temp>>16) & 255]) ^ - $this->_S[2][($temp>>8) & 255]) + - $this->_S[3][$temp & 255]) ^ $Xr; - $Xr = $temp; - } - $Xr = $Xl ^ $this->_P[16]; - $Xl = $temp ^ $this->_P[17]; - } - - - /** - * Deciphers a single 64 bit block - * - * @param int &$Xl - * @param int &$Xr - * @access private - */ - function _decipher(&$Xl, &$Xr) - { - for ($i = 17; $i > 1; $i--) { - $temp = $Xl ^ $this->_P[$i]; - $Xl = ((($this->_S[0][($temp>>24) & 255] + - $this->_S[1][($temp>>16) & 255]) ^ - $this->_S[2][($temp>>8) & 255]) + - $this->_S[3][$temp & 255]) ^ $Xr; - $Xr = $temp; - } - $Xr = $Xl ^ $this->_P[1]; - $Xl = $temp ^ $this->_P[0]; - } - - - /** - * Encrypts a string - * - * @param string $plainText - * @return string Returns cipher text on success, PEAR_Error on failure - * @access public - */ - function encrypt($plainText) - { - if (!is_string($plainText)) { - PEAR::raiseError('Plain text must be a string', 0, PEAR_ERROR_DIE); - } - - if (extension_loaded('mcrypt')) { - return mcrypt_generic($this->_td, $plainText); - } - - $cipherText = ''; - $len = strlen($plainText); - $plainText .= str_repeat(chr(0),(8 - ($len%8))%8); - for ($i = 0; $i < $len; $i += 8) { - list(,$Xl,$Xr) = unpack("N2",substr($plainText,$i,8)); - $this->_encipher($Xl, $Xr); - $cipherText .= pack("N2", $Xl, $Xr); - } - return $cipherText; - } - - - /** - * Decrypts an encrypted string - * - * @param string $cipherText - * @return string Returns plain text on success, PEAR_Error on failure - * @access public - */ - function decrypt($cipherText) - { - if (!is_string($cipherText)) { - PEAR::raiseError('Cipher text must be a string', 1, PEAR_ERROR_DIE); - } - - if (extension_loaded('mcrypt')) { - return mdecrypt_generic($this->_td, $cipherText); - } - - $plainText = ''; - $len = strlen($cipherText); - $cipherText .= str_repeat(chr(0),(8 - ($len%8))%8); - for ($i = 0; $i < $len; $i += 8) { - list(,$Xl,$Xr) = unpack("N2",substr($cipherText,$i,8)); - $this->_decipher($Xl, $Xr); - $plainText .= pack("N2", $Xl, $Xr); - } - return $plainText; - } - - - /** - * Sets the secret key - * The key must be non-zero, and less than or equal to - * 56 characters in length. - * - * @param string $key - * @return bool Returns true on success, PEAR_Error on failure - * @access public - */ - function setKey($key) - { - if (!is_string($key)) { - PEAR::raiseError('Key must be a string', 2, PEAR_ERROR_DIE); - } - - $len = strlen($key); - - if ($len > 56 || $len == 0) { - PEAR::raiseError('Key must be less than 56 characters and non-zero. Supplied key length: ' . $len, 3, PEAR_ERROR_DIE); - } - - if (extension_loaded('mcrypt')) { - mcrypt_generic_init($this->_td, $key, $this->_iv); - return true; - } - - require_once 'Blowfish/DefaultKey.php'; - $this->_init(); - - $k = 0; - $data = 0; - $datal = 0; - $datar = 0; - - for ($i = 0; $i < 18; $i++) { - $data = 0; - for ($j = 4; $j > 0; $j--) { - $data = $data << 8 | ord($key{$k}); - $k = ($k+1) % $len; - } - $this->_P[$i] ^= $data; - } - - for ($i = 0; $i <= 16; $i += 2) { - $this->_encipher($datal, $datar); - $this->_P[$i] = $datal; - $this->_P[$i+1] = $datar; - } - for ($i = 0; $i < 256; $i += 2) { - $this->_encipher($datal, $datar); - $this->_S[0][$i] = $datal; - $this->_S[0][$i+1] = $datar; - } - for ($i = 0; $i < 256; $i += 2) { - $this->_encipher($datal, $datar); - $this->_S[1][$i] = $datal; - $this->_S[1][$i+1] = $datar; - } - for ($i = 0; $i < 256; $i += 2) { - $this->_encipher($datal, $datar); - $this->_S[2][$i] = $datal; - $this->_S[2][$i+1] = $datar; - } - for ($i = 0; $i < 256; $i += 2) { - $this->_encipher($datal, $datar); - $this->_S[3][$i] = $datal; - $this->_S[3][$i+1] = $datar; - } - - return true; - } - -} - -?> diff --git a/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php b/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php deleted file mode 100644 index 2ff8ac788a..0000000000 --- a/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php +++ /dev/null @@ -1,327 +0,0 @@ - - * @copyright 2005 Matthew Fonda - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: DefaultKey.php,v 1.81 2005/05/30 18:40:37 mfonda Exp $ - * @link http://pear.php.net/package/Crypt_Blowfish - */ - - -/** - * Class containing default key - * - * @category Encryption - * @package Crypt_Blowfish - * @author Matthew Fonda - * @copyright 2005 Matthew Fonda - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @link http://pear.php.net/package/Crypt_Blowfish - * @version @package_version@ - * @access public - */ -class Crypt_Blowfish_DefaultKey -{ - var $P = array(); - - var $S = array(); - - function Crypt_Blowfish_DefaultKey() - { - $this->P = array( - 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, - 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, - 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, - 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, - 0x9216D5D9, 0x8979FB1B - ); - - $this->S = array( - array( - 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, - 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, - 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, - 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, - 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, - 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, - 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, - 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, - 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, - 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, - 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, - 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, - 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, - 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, - 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, - 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, - 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, - 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, - 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, - 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, - 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, - 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, - 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, - 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, - 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, - 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, - 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, - 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, - 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, - 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, - 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, - 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, - 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, - 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, - 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, - 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, - 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, - 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, - 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, - 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, - 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, - 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, - 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, - 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, - 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, - 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, - 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, - 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, - 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, - 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, - 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, - 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, - 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, - 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, - 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, - 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, - 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, - 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, - 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, - 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, - 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, - 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, - 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, - 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A - ), - array( - 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, - 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, - 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, - 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, - 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, - 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, - 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, - 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, - 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, - 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, - 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, - 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, - 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, - 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, - 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, - 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, - 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, - 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, - 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, - 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, - 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, - 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, - 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, - 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, - 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, - 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, - 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, - 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, - 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, - 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, - 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, - 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, - 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, - 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, - 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, - 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, - 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, - 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, - 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, - 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, - 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, - 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, - 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, - 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, - 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, - 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, - 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, - 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, - 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, - 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, - 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, - 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, - 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, - 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, - 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, - 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, - 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, - 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, - 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, - 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, - 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, - 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, - 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, - 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 - ), - array( - 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, - 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, - 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, - 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, - 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, - 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, - 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, - 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, - 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, - 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, - 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, - 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, - 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, - 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, - 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, - 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, - 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, - 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, - 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, - 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, - 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, - 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, - 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, - 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, - 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, - 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, - 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, - 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, - 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, - 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, - 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, - 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, - 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, - 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, - 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, - 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, - 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, - 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, - 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, - 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, - 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, - 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, - 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, - 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, - 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, - 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, - 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, - 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, - 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, - 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, - 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, - 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, - 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, - 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, - 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, - 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, - 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, - 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, - 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, - 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, - 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, - 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, - 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, - 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 - ), - array( - 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, - 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, - 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, - 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, - 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, - 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, - 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, - 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, - 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, - 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, - 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, - 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, - 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, - 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, - 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, - 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, - 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, - 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, - 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, - 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, - 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, - 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, - 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, - 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, - 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, - 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, - 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, - 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, - 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, - 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, - 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, - 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, - 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, - 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, - 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, - 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, - 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, - 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, - 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, - 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, - 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, - 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, - 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, - 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, - 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, - 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, - 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, - 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, - 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, - 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, - 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, - 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, - 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, - 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, - 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, - 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, - 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, - 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, - 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, - 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, - 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, - 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, - 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, - 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 - ) - ); - } - -} - -?> diff --git a/3rdparty/Dropbox/API.php b/3rdparty/Dropbox/API.php deleted file mode 100644 index 8cdce678e1..0000000000 --- a/3rdparty/Dropbox/API.php +++ /dev/null @@ -1,380 +0,0 @@ -oauth = $oauth; - $this->root = $root; - $this->useSSL = $useSSL; - if (!$this->useSSL) - { - throw new Dropbox_Exception('Dropbox REST API now requires that all requests use SSL'); - } - - } - - /** - * Returns information about the current dropbox account - * - * @return stdclass - */ - public function getAccountInfo() { - - $data = $this->oauth->fetch($this->api_url . 'account/info'); - return json_decode($data['body'],true); - - } - - /** - * Returns a file's contents - * - * @param string $path path - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return string - */ - public function getFile($path = '', $root = null) { - - if (is_null($root)) $root = $this->root; - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $result = $this->oauth->fetch($this->api_content_url . 'files/' . $root . '/' . ltrim($path,'/')); - return $result['body']; - - } - - /** - * Uploads a new file - * - * @param string $path Target path (including filename) - * @param string $file Either a path to a file or a stream resource - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return bool - */ - public function putFile($path, $file, $root = null) { - - $directory = dirname($path); - $filename = basename($path); - - if($directory==='.') $directory = ''; - $directory = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($directory)); -// $filename = str_replace('~', '%7E', rawurlencode($filename)); - if (is_null($root)) $root = $this->root; - - if (is_string($file)) { - - $file = fopen($file,'rb'); - - } elseif (!is_resource($file)) { - throw new Dropbox_Exception('File must be a file-resource or a string'); - } - $result=$this->multipartFetch($this->api_content_url . 'files/' . - $root . '/' . trim($directory,'/'), $file, $filename); - - if(!isset($result["httpStatus"]) || $result["httpStatus"] != 200) - throw new Dropbox_Exception("Uploading file to Dropbox failed"); - - return true; - } - - - /** - * Copies a file or directory from one location to another - * - * This method returns the file information of the newly created file. - * - * @param string $from source path - * @param string $to destination path - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return stdclass - */ - public function copy($from, $to, $root = null) { - - if (is_null($root)) $root = $this->root; - $response = $this->oauth->fetch($this->api_url . 'fileops/copy', array('from_path' => $from, 'to_path' => $to, 'root' => $root), 'POST'); - - return json_decode($response['body'],true); - - } - - /** - * Creates a new folder - * - * This method returns the information from the newly created directory - * - * @param string $path - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return stdclass - */ - public function createFolder($path, $root = null) { - - if (is_null($root)) $root = $this->root; - - // Making sure the path starts with a / -// $path = '/' . ltrim($path,'/'); - - $response = $this->oauth->fetch($this->api_url . 'fileops/create_folder', array('path' => $path, 'root' => $root),'POST'); - return json_decode($response['body'],true); - - } - - /** - * Deletes a file or folder. - * - * This method will return the metadata information from the deleted file or folder, if successful. - * - * @param string $path Path to new folder - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return array - */ - public function delete($path, $root = null) { - - if (is_null($root)) $root = $this->root; - $response = $this->oauth->fetch($this->api_url . 'fileops/delete', array('path' => $path, 'root' => $root), 'POST'); - return json_decode($response['body']); - - } - - /** - * Moves a file or directory to a new location - * - * This method returns the information from the newly created directory - * - * @param mixed $from Source path - * @param mixed $to destination path - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return stdclass - */ - public function move($from, $to, $root = null) { - - if (is_null($root)) $root = $this->root; - $response = $this->oauth->fetch($this->api_url . 'fileops/move', array('from_path' => rawurldecode($from), 'to_path' => rawurldecode($to), 'root' => $root), 'POST'); - - return json_decode($response['body'],true); - - } - - /** - * Returns file and directory information - * - * @param string $path Path to receive information from - * @param bool $list When set to true, this method returns information from all files in a directory. When set to false it will only return infromation from the specified directory. - * @param string $hash If a hash is supplied, this method simply returns true if nothing has changed since the last request. Good for caching. - * @param int $fileLimit Maximum number of file-information to receive - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return array|true - */ - public function getMetaData($path, $list = true, $hash = null, $fileLimit = null, $root = null) { - - if (is_null($root)) $root = $this->root; - - $args = array( - 'list' => $list, - ); - - if (!is_null($hash)) $args['hash'] = $hash; - if (!is_null($fileLimit)) $args['file_limit'] = $fileLimit; - - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $response = $this->oauth->fetch($this->api_url . 'metadata/' . $root . '/' . ltrim($path,'/'), $args); - - /* 304 is not modified */ - if ($response['httpStatus']==304) { - return true; - } else { - return json_decode($response['body'],true); - } - - } - - /** - * A way of letting you keep up with changes to files and folders in a user's Dropbox. You can periodically call /delta to get a list of "delta entries", which are instructions on how to update your local state to match the server's state. - * - * This method returns the information from the newly created directory - * - * @param string $cursor A string that is used to keep track of your current state. On the next call pass in this value to return delta entries that have been recorded since the cursor was returned. - * @return stdclass - */ - public function delta($cursor) { - - $arg['cursor'] = $cursor; - - $response = $this->oauth->fetch($this->api_url . 'delta', $arg, 'POST'); - return json_decode($response['body'],true); - - } - - /** - * Returns a thumbnail (as a string) for a file path. - * - * @param string $path Path to file - * @param string $size small, medium or large - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @return string - */ - public function getThumbnail($path, $size = 'small', $root = null) { - - if (is_null($root)) $root = $this->root; - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $response = $this->oauth->fetch($this->api_content_url . 'thumbnails/' . $root . '/' . ltrim($path,'/'),array('size' => $size)); - - return $response['body']; - - } - - /** - * This method is used to generate multipart POST requests for file upload - * - * @param string $uri - * @param array $arguments - * @return bool - */ - protected function multipartFetch($uri, $file, $filename) { - - /* random string */ - $boundary = 'R50hrfBj5JYyfR3vF3wR96GPCC9Fd2q2pVMERvEaOE3D8LZTgLLbRpNwXek3'; - - $headers = array( - 'Content-Type' => 'multipart/form-data; boundary=' . $boundary, - ); - - $body="--" . $boundary . "\r\n"; - $body.="Content-Disposition: form-data; name=file; filename=".rawurldecode($filename)."\r\n"; - $body.="Content-type: application/octet-stream\r\n"; - $body.="\r\n"; - $body.=stream_get_contents($file); - $body.="\r\n"; - $body.="--" . $boundary . "--"; - - // Dropbox requires the filename to also be part of the regular arguments, so it becomes - // part of the signature. - $uri.='?file=' . $filename; - - return $this->oauth->fetch($uri, $body, 'POST', $headers); - - } - - - /** - * Search - * - * Returns metadata for all files and folders that match the search query. - * - * @added by: diszo.sasil - * - * @param string $query - * @param string $root Use this to override the default root path (sandbox/dropbox) - * @param string $path - * @return array - */ - public function search($query = '', $root = null, $path = ''){ - if (is_null($root)) $root = $this->root; - if(!empty($path)){ - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - } - $response = $this->oauth->fetch($this->api_url . 'search/' . $root . '/' . ltrim($path,'/'),array('query' => $query)); - return json_decode($response['body'],true); - } - - /** - * Creates and returns a shareable link to files or folders. - * - * Note: Links created by the /shares API call expire after thirty days. - * - * @param type $path - * @param type $root - * @return type - */ - public function share($path, $root = null) { - if (is_null($root)) $root = $this->root; - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $response = $this->oauth->fetch($this->api_url. 'shares/'. $root . '/' . ltrim($path, '/'), array(), 'POST'); - return json_decode($response['body'],true); - - } - - /** - * Returns a link directly to a file. - * Similar to /shares. The difference is that this bypasses the Dropbox webserver, used to provide a preview of the file, so that you can effectively stream the contents of your media. - * - * Note: The /media link expires after four hours, allotting enough time to stream files, but not enough to leave a connection open indefinitely. - * - * @param type $path - * @param type $root - * @return type - */ - public function media($path, $root = null) { - - if (is_null($root)) $root = $this->root; - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $response = $this->oauth->fetch($this->api_url. 'media/'. $root . '/' . ltrim($path, '/'), array(), 'POST'); - return json_decode($response['body'],true); - - } - - /** - * Creates and returns a copy_ref to a file. This reference string can be used to copy that file to another user's Dropbox by passing it in as the from_copy_ref parameter on /fileops/copy. - * - * @param type $path - * @param type $root - * @return type - */ - public function copy_ref($path, $root = null) { - - if (is_null($root)) $root = $this->root; - $path = str_replace(array('%2F','~'), array('/','%7E'), rawurlencode($path)); - $response = $this->oauth->fetch($this->api_url. 'copy_ref/'. $root . '/' . ltrim($path, '/')); - return json_decode($response['body'],true); - - } - - -} diff --git a/3rdparty/Dropbox/Exception.php b/3rdparty/Dropbox/Exception.php deleted file mode 100644 index 50cbc4c791..0000000000 --- a/3rdparty/Dropbox/Exception.php +++ /dev/null @@ -1,15 +0,0 @@ -oauth_token = $token['token']; - $this->oauth_token_secret = $token['token_secret']; - } else { - $this->oauth_token = $token; - $this->oauth_token_secret = $token_secret; - } - - } - - /** - * Returns the oauth request tokens as an associative array. - * - * The array will contain the elements 'token' and 'token_secret'. - * - * @return array - */ - public function getToken() { - - return array( - 'token' => $this->oauth_token, - 'token_secret' => $this->oauth_token_secret, - ); - - } - - /** - * Returns the authorization url - * - * @param string $callBack Specify a callback url to automatically redirect the user back - * @return string - */ - public function getAuthorizeUrl($callBack = null) { - - // Building the redirect uri - $token = $this->getToken(); - $uri = self::URI_AUTHORIZE . '?oauth_token=' . $token['token']; - if ($callBack) $uri.='&oauth_callback=' . $callBack; - return $uri; - } - - /** - * Fetches a secured oauth url and returns the response body. - * - * @param string $uri - * @param mixed $arguments - * @param string $method - * @param array $httpHeaders - * @return string - */ - public abstract function fetch($uri, $arguments = array(), $method = 'GET', $httpHeaders = array()); - - /** - * Requests the OAuth request token. - * - * @return array - */ - abstract public function getRequestToken(); - - /** - * Requests the OAuth access tokens. - * - * @return array - */ - abstract public function getAccessToken(); - -} diff --git a/3rdparty/Dropbox/OAuth/Consumer/Dropbox.php b/3rdparty/Dropbox/OAuth/Consumer/Dropbox.php deleted file mode 100644 index 204a659de0..0000000000 --- a/3rdparty/Dropbox/OAuth/Consumer/Dropbox.php +++ /dev/null @@ -1,37 +0,0 @@ -consumerRequest instanceof HTTP_OAuth_Consumer_Request) { - $this->consumerRequest = new HTTP_OAuth_Consumer_Request; - } - - // TODO: Change this and add in code to validate the SSL cert. - // see https://github.com/bagder/curl/blob/master/lib/mk-ca-bundle.pl - $this->consumerRequest->setConfig(array( - 'ssl_verify_peer' => false, - 'ssl_verify_host' => false - )); - - return $this->consumerRequest; - } -} diff --git a/3rdparty/Dropbox/OAuth/Curl.php b/3rdparty/Dropbox/OAuth/Curl.php deleted file mode 100644 index b75b27bb36..0000000000 --- a/3rdparty/Dropbox/OAuth/Curl.php +++ /dev/null @@ -1,282 +0,0 @@ -consumerKey = $consumerKey; - $this->consumerSecret = $consumerSecret; - } - - /** - * Fetches a secured oauth url and returns the response body. - * - * @param string $uri - * @param mixed $arguments - * @param string $method - * @param array $httpHeaders - * @return string - */ - public function fetch($uri, $arguments = array(), $method = 'GET', $httpHeaders = array()) { - - $uri=str_replace('http://', 'https://', $uri); // all https, upload makes problems if not - if (is_string($arguments) and strtoupper($method) == 'POST') { - preg_match("/\?file=(.*)$/i", $uri, $matches); - if (isset($matches[1])) { - $uri = str_replace($matches[0], "", $uri); - $filename = $matches[1]; - $httpHeaders=array_merge($httpHeaders,$this->getOAuthHeader($uri, array("file" => $filename), $method)); - } - } else { - $httpHeaders=array_merge($httpHeaders,$this->getOAuthHeader($uri, $arguments, $method)); - } - $ch = curl_init(); - if (strtoupper($method) == 'POST') { - curl_setopt($ch, CURLOPT_URL, $uri); - curl_setopt($ch, CURLOPT_POST, true); -// if (is_array($arguments)) -// $arguments=http_build_query($arguments); - curl_setopt($ch, CURLOPT_POSTFIELDS, $arguments); -// $httpHeaders['Content-Length']=strlen($arguments); - } else { - curl_setopt($ch, CURLOPT_URL, $uri.'?'.http_build_query($arguments)); - curl_setopt($ch, CURLOPT_POST, false); - } - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 300); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); -// curl_setopt($ch, CURLOPT_CAINFO, "rootca"); - curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); - //Build header - $headers = array(); - foreach ($httpHeaders as $name => $value) { - $headers[] = "{$name}: $value"; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - if (!ini_get('safe_mode') && !ini_get('open_basedir')) - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); - if (function_exists($this->ProgressFunction) and defined('CURLOPT_PROGRESSFUNCTION')) { - curl_setopt($ch, CURLOPT_NOPROGRESS, false); - curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, $this->ProgressFunction); - curl_setopt($ch, CURLOPT_BUFFERSIZE, 512); - } - $response=curl_exec($ch); - $errorno=curl_errno($ch); - $error=curl_error($ch); - $status=curl_getinfo($ch,CURLINFO_HTTP_CODE); - curl_close($ch); - - - if (!empty($errorno)) - throw new Dropbox_Exception_NotFound('Curl error: ('.$errorno.') '.$error."\n"); - - if ($status>=300) { - $body = json_decode($response,true); - switch ($status) { - // Not modified - case 304 : - return array( - 'httpStatus' => 304, - 'body' => null, - ); - break; - case 403 : - throw new Dropbox_Exception_Forbidden('Forbidden. - This could mean a bad OAuth request, or a file or folder already existing at the target location. - ' . $body["error"] . "\n"); - case 404 : - throw new Dropbox_Exception_NotFound('Resource at uri: ' . $uri . ' could not be found. ' . - $body["error"] . "\n"); - case 507 : - throw new Dropbox_Exception_OverQuota('This dropbox is full. ' . - $body["error"] . "\n"); - } - if (!empty($body["error"])) - throw new Dropbox_Exception_RequestToken('Error: ('.$status.') '.$body["error"]."\n"); - } - - return array( - 'body' => $response, - 'httpStatus' => $status - ); - } - - /** - * Returns named array with oauth parameters for further use - * @return array Array with oauth_ parameters - */ - private function getOAuthBaseParams() { - $params['oauth_version'] = '1.0'; - $params['oauth_signature_method'] = 'HMAC-SHA1'; - - $params['oauth_consumer_key'] = $this->consumerKey; - $tokens = $this->getToken(); - if (isset($tokens['token']) && $tokens['token']) { - $params['oauth_token'] = $tokens['token']; - } - $params['oauth_timestamp'] = time(); - $params['oauth_nonce'] = md5(microtime() . mt_rand()); - return $params; - } - - /** - * Creates valid Authorization header for OAuth, based on URI and Params - * - * @param string $uri - * @param array $params - * @param string $method GET or POST, standard is GET - * @param array $oAuthParams optional, pass your own oauth_params here - * @return array Array for request's headers section like - * array('Authorization' => 'OAuth ...'); - */ - private function getOAuthHeader($uri, $params, $method = 'GET', $oAuthParams = null) { - $oAuthParams = $oAuthParams ? $oAuthParams : $this->getOAuthBaseParams(); - - // create baseString to encode for the sent parameters - $baseString = $method . '&'; - $baseString .= $this->oauth_urlencode($uri) . "&"; - - // OAuth header does not include GET-Parameters - $signatureParams = array_merge($params, $oAuthParams); - - // sorting the parameters - ksort($signatureParams); - - $encodedParams = array(); - foreach ($signatureParams as $key => $value) { - $encodedParams[] = $this->oauth_urlencode($key) . '=' . $this->oauth_urlencode($value); - } - - $baseString .= $this->oauth_urlencode(implode('&', $encodedParams)); - - // encode the signature - $tokens = $this->getToken(); - $hash = $this->hash_hmac_sha1($this->consumerSecret.'&'.$tokens['token_secret'], $baseString); - $signature = base64_encode($hash); - - // add signature to oAuthParams - $oAuthParams['oauth_signature'] = $signature; - - $oAuthEncoded = array(); - foreach ($oAuthParams as $key => $value) { - $oAuthEncoded[] = $key . '="' . $this->oauth_urlencode($value) . '"'; - } - - return array('Authorization' => 'OAuth ' . implode(', ', $oAuthEncoded)); - } - - /** - * Requests the OAuth request token. - * - * @return void - */ - public function getRequestToken() { - $result = $this->fetch(self::URI_REQUEST_TOKEN, array(), 'POST'); - if ($result['httpStatus'] == "200") { - $tokens = array(); - parse_str($result['body'], $tokens); - $this->setToken($tokens['oauth_token'], $tokens['oauth_token_secret']); - return $this->getToken(); - } else { - throw new Dropbox_Exception_RequestToken('We were unable to fetch request tokens. This likely means that your consumer key and/or secret are incorrect.'); - } - } - - /** - * Requests the OAuth access tokens. - * - * This method requires the 'unauthorized' request tokens - * and, if successful will set the authorized request tokens. - * - * @return void - */ - public function getAccessToken() { - $result = $this->fetch(self::URI_ACCESS_TOKEN, array(), 'POST'); - if ($result['httpStatus'] == "200") { - $tokens = array(); - parse_str($result['body'], $tokens); - $this->setToken($tokens['oauth_token'], $tokens['oauth_token_secret']); - return $this->getToken(); - } else { - throw new Dropbox_Exception_RequestToken('We were unable to fetch request tokens. This likely means that your consumer key and/or secret are incorrect.'); - } - } - - /** - * Helper function to properly urlencode parameters. - * See http://php.net/manual/en/function.oauth-urlencode.php - * - * @param string $string - * @return string - */ - private function oauth_urlencode($string) { - return str_replace('%E7', '~', rawurlencode($string)); - } - - /** - * Hash function for hmac_sha1; uses native function if available. - * - * @param string $key - * @param string $data - * @return string - */ - private function hash_hmac_sha1($key, $data) { - if (function_exists('hash_hmac') && in_array('sha1', hash_algos())) { - return hash_hmac('sha1', $data, $key, true); - } else { - $blocksize = 64; - $hashfunc = 'sha1'; - if (strlen($key) > $blocksize) { - $key = pack('H*', $hashfunc($key)); - } - - $key = str_pad($key, $blocksize, chr(0x00)); - $ipad = str_repeat(chr(0x36), $blocksize); - $opad = str_repeat(chr(0x5c), $blocksize); - $hash = pack('H*', $hashfunc(( $key ^ $opad ) . pack('H*', $hashfunc(($key ^ $ipad) . $data)))); - - return $hash; - } - } - - -} \ No newline at end of file diff --git a/3rdparty/Dropbox/README.md b/3rdparty/Dropbox/README.md deleted file mode 100644 index 54e05db762..0000000000 --- a/3rdparty/Dropbox/README.md +++ /dev/null @@ -1,31 +0,0 @@ -Dropbox-php -=========== - -This PHP library allows you to easily integrate dropbox with PHP. - -The following PHP extension is required: - -* json - -The library makes use of OAuth. At the moment you can use either of these libraries: - -[PHP OAuth extension](http://pecl.php.net/package/oauth) -[PEAR's HTTP_OAUTH package](http://pear.php.net/package/http_oauth) - -The extension is recommended, but if you can't install php extensions you should go for the pear package. -Installing ----------- - - pear channel-discover pear.dropbox-php.com - pear install dropbox-php/Dropbox-alpha - -Documentation -------------- -Check out the [documentation](http://www.dropbox-php.com/docs). - -Questions? ----------- - -[Dropbox-php Mailing list](http://groups.google.com/group/dropbox-php) -[Official Dropbox developer forum](http://forums.dropbox.com/forum.php?id=5) - diff --git a/3rdparty/Dropbox/autoload.php b/3rdparty/Dropbox/autoload.php deleted file mode 100644 index 5388ea6334..0000000000 --- a/3rdparty/Dropbox/autoload.php +++ /dev/null @@ -1,29 +0,0 @@ -key = $key; - $this->secret = $secret; - $this->callback_url = $callback_url; - }/*}}}*/ -}/*}}}*/ - -class OAuthToken {/*{{{*/ - // access tokens and request tokens - public $key; - public $secret; - - /** - * key = the token - * secret = the token secret - */ - function __construct($key, $secret) {/*{{{*/ - $this->key = $key; - $this->secret = $secret; - }/*}}}*/ - - /** - * generates the basic string serialization of a token that a server - * would respond to request_token and access_token calls with - */ - function to_string() {/*{{{*/ - return "oauth_token=" . OAuthUtil::urlencodeRFC3986($this->key) . - "&oauth_token_secret=" . OAuthUtil::urlencodeRFC3986($this->secret); - }/*}}}*/ - - function __toString() {/*{{{*/ - return $this->to_string(); - }/*}}}*/ -}/*}}}*/ - -class OAuthSignatureMethod {/*{{{*/ - public function check_signature(&$request, $consumer, $token, $signature) { - $built = $this->build_signature($request, $consumer, $token); - return $built == $signature; - } -}/*}}}*/ - -class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {/*{{{*/ - function get_name() {/*{{{*/ - return "HMAC-SHA1"; - }/*}}}*/ - - public function build_signature($request, $consumer, $token, $privKey=NULL) {/*{{{*/ - $base_string = $request->get_signature_base_string(); - $request->base_string = $base_string; - - $key_parts = array( - $consumer->secret, - ($token) ? $token->secret : "" - ); - - $key_parts = array_map(array('OAuthUtil','urlencodeRFC3986'), $key_parts); - $key = implode('&', $key_parts); - - return base64_encode( hash_hmac('sha1', $base_string, $key, true)); - }/*}}}*/ -}/*}}}*/ - -class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {/*{{{*/ - public function get_name() {/*{{{*/ - return "RSA-SHA1"; - }/*}}}*/ - - protected function fetch_public_cert(&$request) {/*{{{*/ - // not implemented yet, ideas are: - // (1) do a lookup in a table of trusted certs keyed off of consumer - // (2) fetch via http using a url provided by the requester - // (3) some sort of specific discovery code based on request - // - // either way should return a string representation of the certificate - throw Exception("fetch_public_cert not implemented"); - }/*}}}*/ - - protected function fetch_private_cert($privKey) {//&$request) {/*{{{*/ - // not implemented yet, ideas are: - // (1) do a lookup in a table of trusted certs keyed off of consumer - // - // either way should return a string representation of the certificate - throw Exception("fetch_private_cert not implemented"); - }/*}}}*/ - - public function build_signature(&$request, $consumer, $token, $privKey) {/*{{{*/ - $base_string = $request->get_signature_base_string(); - - // Fetch the private key cert based on the request - //$cert = $this->fetch_private_cert($consumer->privKey); - - //Pull the private key ID from the certificate - //$privatekeyid = openssl_get_privatekey($cert); - - // hacked in - if ($privKey == '') { - $fp = fopen($GLOBALS['PRIV_KEY_FILE'], "r"); - $privKey = fread($fp, 8192); - fclose($fp); - } - $privatekeyid = openssl_get_privatekey($privKey); - - //Check the computer signature against the one passed in the query - $ok = openssl_sign($base_string, $signature, $privatekeyid); - - //Release the key resource - openssl_free_key($privatekeyid); - - return base64_encode($signature); - } /*}}}*/ - - public function check_signature(&$request, $consumer, $token, $signature) {/*{{{*/ - $decoded_sig = base64_decode($signature); - - $base_string = $request->get_signature_base_string(); - - // Fetch the public key cert based on the request - $cert = $this->fetch_public_cert($request); - - //Pull the public key ID from the certificate - $publickeyid = openssl_get_publickey($cert); - - //Check the computer signature against the one passed in the query - $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); - - //Release the key resource - openssl_free_key($publickeyid); - - return $ok == 1; - } /*}}}*/ -}/*}}}*/ - -class OAuthRequest {/*{{{*/ - private $parameters; - private $http_method; - private $http_url; - // for debug purposes - public $base_string; - public static $version = '1.0'; - - function __construct($http_method, $http_url, $parameters=NULL) {/*{{{*/ - @$parameters or $parameters = array(); - $this->parameters = $parameters; - $this->http_method = $http_method; - $this->http_url = $http_url; - }/*}}}*/ - - - /** - * attempt to build up a request from what was passed to the server - */ - public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {/*{{{*/ - $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") ? 'http' : 'https'; - @$http_url or $http_url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - @$http_method or $http_method = $_SERVER['REQUEST_METHOD']; - - $request_headers = OAuthRequest::get_headers(); - - // let the library user override things however they'd like, if they know - // which parameters to use then go for it, for example XMLRPC might want to - // do this - if ($parameters) { - $req = new OAuthRequest($http_method, $http_url, $parameters); - } - // next check for the auth header, we need to do some extra stuff - // if that is the case, namely suck in the parameters from GET or POST - // so that we can include them in the signature - else if (@substr($request_headers['Authorization'], 0, 5) == "OAuth") { - $header_parameters = OAuthRequest::split_header($request_headers['Authorization']); - if ($http_method == "GET") { - $req_parameters = $_GET; - } - else if ($http_method = "POST") { - $req_parameters = $_POST; - } - $parameters = array_merge($header_parameters, $req_parameters); - $req = new OAuthRequest($http_method, $http_url, $parameters); - } - else if ($http_method == "GET") { - $req = new OAuthRequest($http_method, $http_url, $_GET); - } - else if ($http_method == "POST") { - $req = new OAuthRequest($http_method, $http_url, $_POST); - } - return $req; - }/*}}}*/ - - /** - * pretty much a helper function to set up the request - */ - public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {/*{{{*/ - @$parameters or $parameters = array(); - $defaults = array("oauth_version" => OAuthRequest::$version, - "oauth_nonce" => OAuthRequest::generate_nonce(), - "oauth_timestamp" => OAuthRequest::generate_timestamp(), - "oauth_consumer_key" => $consumer->key); - $parameters = array_merge($defaults, $parameters); - - if ($token) { - $parameters['oauth_token'] = $token->key; - } - - // oauth v1.0a - /*if (isset($_REQUEST['oauth_verifier'])) { - $parameters['oauth_verifier'] = $_REQUEST['oauth_verifier']; - }*/ - - - return new OAuthRequest($http_method, $http_url, $parameters); - }/*}}}*/ - - public function set_parameter($name, $value) {/*{{{*/ - $this->parameters[$name] = $value; - }/*}}}*/ - - public function get_parameter($name) {/*{{{*/ - return $this->parameters[$name]; - }/*}}}*/ - - public function get_parameters() {/*{{{*/ - return $this->parameters; - }/*}}}*/ - - /** - * Returns the normalized parameters of the request - * - * This will be all (except oauth_signature) parameters, - * sorted first by key, and if duplicate keys, then by - * value. - * - * The returned string will be all the key=value pairs - * concated by &. - * - * @return string - */ - public function get_signable_parameters() {/*{{{*/ - // Grab all parameters - $params = $this->parameters; - - // Remove oauth_signature if present - if (isset($params['oauth_signature'])) { - unset($params['oauth_signature']); - } - - // Urlencode both keys and values - $keys = array_map(array('OAuthUtil', 'urlencodeRFC3986'), array_keys($params)); - $values = array_map(array('OAuthUtil', 'urlencodeRFC3986'), array_values($params)); - $params = array_combine($keys, $values); - - // Sort by keys (natsort) - uksort($params, 'strnatcmp'); - -if(isset($params['title']) && isset($params['title-exact'])) { - $temp = $params['title-exact']; - $title = $params['title']; - - unset($params['title']); - unset($params['title-exact']); - - $params['title-exact'] = $temp; - $params['title'] = $title; -} - - // Generate key=value pairs - $pairs = array(); - foreach ($params as $key=>$value ) { - if (is_array($value)) { - // If the value is an array, it's because there are multiple - // with the same key, sort them, then add all the pairs - natsort($value); - foreach ($value as $v2) { - $pairs[] = $key . '=' . $v2; - } - } else { - $pairs[] = $key . '=' . $value; - } - } - - // Return the pairs, concated with & - return implode('&', $pairs); - }/*}}}*/ - - /** - * Returns the base string of this request - * - * The base string defined as the method, the url - * and the parameters (normalized), each urlencoded - * and the concated with &. - */ - public function get_signature_base_string() {/*{{{*/ - $parts = array( - $this->get_normalized_http_method(), - $this->get_normalized_http_url(), - $this->get_signable_parameters() - ); - - $parts = array_map(array('OAuthUtil', 'urlencodeRFC3986'), $parts); - - return implode('&', $parts); - }/*}}}*/ - - /** - * just uppercases the http method - */ - public function get_normalized_http_method() {/*{{{*/ - return strtoupper($this->http_method); - }/*}}}*/ - -/** - * parses the url and rebuilds it to be - * scheme://host/path - */ - public function get_normalized_http_url() { - $parts = parse_url($this->http_url); - - $scheme = (isset($parts['scheme'])) ? $parts['scheme'] : 'http'; - $port = (isset($parts['port'])) ? $parts['port'] : (($scheme == 'https') ? '443' : '80'); - $host = (isset($parts['host'])) ? strtolower($parts['host']) : ''; - $path = (isset($parts['path'])) ? $parts['path'] : ''; - - if (($scheme == 'https' && $port != '443') - || ($scheme == 'http' && $port != '80')) { - $host = "$host:$port"; - } - return "$scheme://$host$path"; - } - - /** - * builds a url usable for a GET request - */ - public function to_url() {/*{{{*/ - $out = $this->get_normalized_http_url() . "?"; - $out .= $this->to_postdata(); - return $out; - }/*}}}*/ - - /** - * builds the data one would send in a POST request - */ - public function to_postdata() {/*{{{*/ - $total = array(); - foreach ($this->parameters as $k => $v) { - $total[] = OAuthUtil::urlencodeRFC3986($k) . "=" . OAuthUtil::urlencodeRFC3986($v); - } - $out = implode("&", $total); - return $out; - }/*}}}*/ - - /** - * builds the Authorization: header - */ - public function to_header() {/*{{{*/ - $out ='Authorization: OAuth '; - $total = array(); - - /* - $sig = $this->parameters['oauth_signature']; - unset($this->parameters['oauth_signature']); - uksort($this->parameters, 'strnatcmp'); - $this->parameters['oauth_signature'] = $sig; - */ - - foreach ($this->parameters as $k => $v) { - if (substr($k, 0, 5) != "oauth") continue; - $out .= OAuthUtil::urlencodeRFC3986($k) . '="' . OAuthUtil::urlencodeRFC3986($v) . '", '; - } - $out = substr_replace($out, '', strlen($out) - 2); - - return $out; - }/*}}}*/ - - public function __toString() {/*{{{*/ - return $this->to_url(); - }/*}}}*/ - - - public function sign_request($signature_method, $consumer, $token, $privKey=NULL) {/*{{{*/ - $this->set_parameter("oauth_signature_method", $signature_method->get_name()); - $signature = $this->build_signature($signature_method, $consumer, $token, $privKey); - $this->set_parameter("oauth_signature", $signature); - }/*}}}*/ - - public function build_signature($signature_method, $consumer, $token, $privKey=NULL) {/*{{{*/ - $signature = $signature_method->build_signature($this, $consumer, $token, $privKey); - return $signature; - }/*}}}*/ - - /** - * util function: current timestamp - */ - private static function generate_timestamp() {/*{{{*/ - return time(); - }/*}}}*/ - - /** - * util function: current nonce - */ - private static function generate_nonce() {/*{{{*/ - $mt = microtime(); - $rand = mt_rand(); - - return md5($mt . $rand); // md5s look nicer than numbers - }/*}}}*/ - - /** - * util function for turning the Authorization: header into - * parameters, has to do some unescaping - */ - private static function split_header($header) {/*{{{*/ - // this should be a regex - // error cases: commas in parameter values - $parts = explode(",", $header); - $out = array(); - foreach ($parts as $param) { - $param = ltrim($param); - // skip the "realm" param, nobody ever uses it anyway - if (substr($param, 0, 5) != "oauth") continue; - - $param_parts = explode("=", $param); - - // rawurldecode() used because urldecode() will turn a "+" in the - // value into a space - $out[$param_parts[0]] = rawurldecode(substr($param_parts[1], 1, -1)); - } - return $out; - }/*}}}*/ - - /** - * helper to try to sort out headers for people who aren't running apache - */ - private static function get_headers() {/*{{{*/ - if (function_exists('apache_request_headers')) { - // we need this to get the actual Authorization: header - // because apache tends to tell us it doesn't exist - return apache_request_headers(); - } - // otherwise we don't have apache and are just going to have to hope - // that $_SERVER actually contains what we need - $out = array(); - foreach ($_SERVER as $key => $value) { - if (substr($key, 0, 5) == "HTTP_") { - // this is chaos, basically it is just there to capitalize the first - // letter of every word that is not an initial HTTP and strip HTTP - // code from przemek - $key = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($key, 5))))); - $out[$key] = $value; - } - } - return $out; - }/*}}}*/ -}/*}}}*/ - -class OAuthServer {/*{{{*/ - protected $timestamp_threshold = 300; // in seconds, five minutes - protected $version = 1.0; // hi blaine - protected $signature_methods = array(); - - protected $data_store; - - function __construct($data_store) {/*{{{*/ - $this->data_store = $data_store; - }/*}}}*/ - - public function add_signature_method($signature_method) {/*{{{*/ - $this->signature_methods[$signature_method->get_name()] = - $signature_method; - }/*}}}*/ - - // high level functions - - /** - * process a request_token request - * returns the request token on success - */ - public function fetch_request_token(&$request) {/*{{{*/ - $this->get_version($request); - - $consumer = $this->get_consumer($request); - - // no token required for the initial token request - $token = NULL; - - $this->check_signature($request, $consumer, $token); - - $new_token = $this->data_store->new_request_token($consumer); - - return $new_token; - }/*}}}*/ - - /** - * process an access_token request - * returns the access token on success - */ - public function fetch_access_token(&$request) {/*{{{*/ - $this->get_version($request); - - $consumer = $this->get_consumer($request); - - // requires authorized request token - $token = $this->get_token($request, $consumer, "request"); - - $this->check_signature($request, $consumer, $token); - - $new_token = $this->data_store->new_access_token($token, $consumer); - - return $new_token; - }/*}}}*/ - - /** - * verify an api call, checks all the parameters - */ - public function verify_request(&$request) {/*{{{*/ - $this->get_version($request); - $consumer = $this->get_consumer($request); - $token = $this->get_token($request, $consumer, "access"); - $this->check_signature($request, $consumer, $token); - return array($consumer, $token); - }/*}}}*/ - - // Internals from here - /** - * version 1 - */ - private function get_version(&$request) {/*{{{*/ - $version = $request->get_parameter("oauth_version"); - if (!$version) { - $version = 1.0; - } - if ($version && $version != $this->version) { - throw new OAuthException("OAuth version '$version' not supported"); - } - return $version; - }/*}}}*/ - - /** - * figure out the signature with some defaults - */ - private function get_signature_method(&$request) {/*{{{*/ - $signature_method = - @$request->get_parameter("oauth_signature_method"); - if (!$signature_method) { - $signature_method = "PLAINTEXT"; - } - if (!in_array($signature_method, - array_keys($this->signature_methods))) { - throw new OAuthException( - "Signature method '$signature_method' not supported try one of the following: " . implode(", ", array_keys($this->signature_methods)) - ); - } - return $this->signature_methods[$signature_method]; - }/*}}}*/ - - /** - * try to find the consumer for the provided request's consumer key - */ - private function get_consumer(&$request) {/*{{{*/ - $consumer_key = @$request->get_parameter("oauth_consumer_key"); - if (!$consumer_key) { - throw new OAuthException("Invalid consumer key"); - } - - $consumer = $this->data_store->lookup_consumer($consumer_key); - if (!$consumer) { - throw new OAuthException("Invalid consumer"); - } - - return $consumer; - }/*}}}*/ - - /** - * try to find the token for the provided request's token key - */ - private function get_token(&$request, $consumer, $token_type="access") {/*{{{*/ - $token_field = @$request->get_parameter('oauth_token'); - $token = $this->data_store->lookup_token( - $consumer, $token_type, $token_field - ); - if (!$token) { - throw new OAuthException("Invalid $token_type token: $token_field"); - } - return $token; - }/*}}}*/ - - /** - * all-in-one function to check the signature on a request - * should guess the signature method appropriately - */ - private function check_signature(&$request, $consumer, $token) {/*{{{*/ - // this should probably be in a different method - $timestamp = @$request->get_parameter('oauth_timestamp'); - $nonce = @$request->get_parameter('oauth_nonce'); - - $this->check_timestamp($timestamp); - $this->check_nonce($consumer, $token, $nonce, $timestamp); - - $signature_method = $this->get_signature_method($request); - - $signature = $request->get_parameter('oauth_signature'); - $valid_sig = $signature_method->check_signature( - $request, - $consumer, - $token, - $signature - ); - - if (!$valid_sig) { - throw new OAuthException("Invalid signature"); - } - }/*}}}*/ - - /** - * check that the timestamp is new enough - */ - private function check_timestamp($timestamp) {/*{{{*/ - // verify that timestamp is recentish - $now = time(); - if ($now - $timestamp > $this->timestamp_threshold) { - throw new OAuthException("Expired timestamp, yours $timestamp, ours $now"); - } - }/*}}}*/ - - /** - * check that the nonce is not repeated - */ - private function check_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/ - // verify that the nonce is uniqueish - $found = $this->data_store->lookup_nonce($consumer, $token, $nonce, $timestamp); - if ($found) { - throw new OAuthException("Nonce already used: $nonce"); - } - }/*}}}*/ - - - -}/*}}}*/ - -class OAuthDataStore {/*{{{*/ - function lookup_consumer($consumer_key) {/*{{{*/ - // implement me - }/*}}}*/ - - function lookup_token($consumer, $token_type, $token) {/*{{{*/ - // implement me - }/*}}}*/ - - function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/ - // implement me - }/*}}}*/ - - function fetch_request_token($consumer) {/*{{{*/ - // return a new token attached to this consumer - }/*}}}*/ - - function fetch_access_token($token, $consumer) {/*{{{*/ - // return a new access token attached to this consumer - // for the user associated with this token if the request token - // is authorized - // should also invalidate the request token - }/*}}}*/ - -}/*}}}*/ - - -/* A very naive dbm-based oauth storage - */ -class SimpleOAuthDataStore extends OAuthDataStore {/*{{{*/ - private $dbh; - - function __construct($path = "oauth.gdbm") {/*{{{*/ - $this->dbh = dba_popen($path, 'c', 'gdbm'); - }/*}}}*/ - - function __destruct() {/*{{{*/ - dba_close($this->dbh); - }/*}}}*/ - - function lookup_consumer($consumer_key) {/*{{{*/ - $rv = dba_fetch("consumer_$consumer_key", $this->dbh); - if ($rv === FALSE) { - return NULL; - } - $obj = unserialize($rv); - if (!($obj instanceof OAuthConsumer)) { - return NULL; - } - return $obj; - }/*}}}*/ - - function lookup_token($consumer, $token_type, $token) {/*{{{*/ - $rv = dba_fetch("${token_type}_${token}", $this->dbh); - if ($rv === FALSE) { - return NULL; - } - $obj = unserialize($rv); - if (!($obj instanceof OAuthToken)) { - return NULL; - } - return $obj; - }/*}}}*/ - - function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/ - return dba_exists("nonce_$nonce", $this->dbh); - }/*}}}*/ - - function new_token($consumer, $type="request") {/*{{{*/ - $key = md5(time()); - $secret = time() + time(); - $token = new OAuthToken($key, md5(md5($secret))); - if (!dba_insert("${type}_$key", serialize($token), $this->dbh)) { - throw new OAuthException("doooom!"); - } - return $token; - }/*}}}*/ - - function new_request_token($consumer) {/*{{{*/ - return $this->new_token($consumer, "request"); - }/*}}}*/ - - function new_access_token($token, $consumer) {/*{{{*/ - - $token = $this->new_token($consumer, 'access'); - dba_delete("request_" . $token->key, $this->dbh); - return $token; - }/*}}}*/ -}/*}}}*/ - -class OAuthUtil {/*{{{*/ - public static function urlencodeRFC3986($string) {/*{{{*/ - return str_replace('%7E', '~', rawurlencode($string)); - }/*}}}*/ - - public static function urldecodeRFC3986($string) {/*{{{*/ - return rawurldecode($string); - }/*}}}*/ -}/*}}}*/ - -?> \ No newline at end of file diff --git a/3rdparty/Google/common.inc.php b/3rdparty/Google/common.inc.php deleted file mode 100755 index 57185cdc4d..0000000000 --- a/3rdparty/Google/common.inc.php +++ /dev/null @@ -1,185 +0,0 @@ - - */ - -$PRIV_KEY_FILE = '/path/to/your/rsa_private_key.pem'; - -// OAuth library - http://oauth.googlecode.com/svn/code/php/ -require_once('OAuth.php'); - -// Google's accepted signature methods -$hmac_method = new OAuthSignatureMethod_HMAC_SHA1(); -$rsa_method = new OAuthSignatureMethod_RSA_SHA1(); -$SIG_METHODS = array($rsa_method->get_name() => $rsa_method, - $hmac_method->get_name() => $hmac_method); - -/** - * Makes an HTTP request to the specified URL - * - * @param string $http_method The HTTP method (GET, POST, PUT, DELETE) - * @param string $url Full URL of the resource to access - * @param array $extraHeaders (optional) Additional headers to include in each - * request. Elements are header/value pair strings ('Host: example.com') - * @param string $postData (optional) POST/PUT request body - * @param bool $returnResponseHeaders True if resp. headers should be returned. - * @return string Response body from the server - */ -function send_signed_request($http_method, $url, $extraHeaders=null, - $postData=null, $returnResponseHeaders=true) { - $curl = curl_init($url); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_FAILONERROR, false); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); - - // Return request headers in the reponse -// curl_setopt($curl, CURLINFO_HEADER_OUT, true); - - // Return response headers ni the response? - if ($returnResponseHeaders) { - curl_setopt($curl, CURLOPT_HEADER, true); - } - - $headers = array(); - //$headers[] = 'GData-Version: 2.0'; // use GData v2 by default - if (is_array($extraHeaders)) { - $headers = array_merge($headers, $extraHeaders); - } - - // Setup default curl options for each type of HTTP request. - // This is also a great place to add additional headers for each request. - switch($http_method) { - case 'GET': - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - break; - case 'POST': - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_POST, 1); - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - break; - case 'PUT': - $headers[] = 'If-Match: *'; - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $http_method); - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - break; - case 'DELETE': - $headers[] = 'If-Match: *'; - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $http_method); - break; - default: - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - } - - // Execute the request. If an error occures, fill the response body with it. - $response = curl_exec($curl); - if (!$response) { - $response = curl_error($curl); - } - - // Add server's response headers to our response body - $response = curl_getinfo($curl, CURLINFO_HEADER_OUT) . $response; - - curl_close($curl); - - return $response; -} - -/** -* Takes XML as a string and returns it nicely indented -* -* @param string $xml The xml to beautify -* @param boolean $html_output True if returned XML should be escaped for HTML. -* @return string The beautified xml -*/ -function xml_pretty_printer($xml, $html_output=false) { - $xml_obj = new SimpleXMLElement($xml); - $level = 2; - - // Get an array containing each XML element - $xml = explode("\n", preg_replace('/>\s*\n<", $xml_obj->asXML())); - - // Hold current indentation level - $indent = 0; - - $pretty = array(); - - // Shift off opening XML tag if present - if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) { - $pretty[] = array_shift($xml); - } - - foreach ($xml as $el) { - if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) { - // opening tag, increase indent - $pretty[] = str_repeat(' ', $indent) . $el; - $indent += $level; - } else { - if (preg_match('/^<\/.+>$/', $el)) { - $indent -= $level; // closing tag, decrease indent - } - if ($indent < 0) { - $indent += $level; - } - $pretty[] = str_repeat(' ', $indent) . $el; - } - } - - $xml = implode("\n", $pretty); - return $html_output ? htmlentities($xml) : $xml; -} - -/** - * Joins key/value pairs by $inner_glue and each pair together by $outer_glue. - * - * Example: implode_assoc('=', '&', array('a' => 1, 'b' => 2)) === 'a=1&b=2' - * - * @param string $inner_glue What to implode each key/value pair with - * @param string $outer_glue What to impode each key/value string subset with - * @param array $array Associative array of query parameters - * @return string Urlencoded string of query parameters - */ -function implode_assoc($inner_glue, $outer_glue, $array) { - $output = array(); - foreach($array as $key => $item) { - $output[] = $key . $inner_glue . urlencode($item); - } - return implode($outer_glue, $output); -} - -/** - * Explodes a string of key/value url parameters into an associative array. - * This method performs the compliment operations of implode_assoc(). - * - * Example: explode_assoc('=', '&', 'a=1&b=2') === array('a' => 1, 'b' => 2) - * - * @param string $inner_glue What each key/value pair is joined with - * @param string $outer_glue What each set of key/value pairs is joined with. - * @param array $array Associative array of query parameters - * @return array Urlencoded string of query parameters - */ -function explode_assoc($inner_glue, $outer_glue, $params) { - $tempArr = explode($outer_glue, $params); - foreach($tempArr as $val) { - $pos = strpos($val, $inner_glue); - $key = substr($val, 0, $pos); - $array2[$key] = substr($val, $pos + 1, strlen($val)); - } - return $array2; -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2.php b/3rdparty/MDB2.php deleted file mode 100644 index a0ead9b9bc..0000000000 --- a/3rdparty/MDB2.php +++ /dev/null @@ -1,4587 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -require_once 'PEAR.php'; - -// {{{ Error constants - -/** - * The method mapErrorCode in each MDB2_dbtype implementation maps - * native error codes to one of these. - * - * If you add an error code here, make sure you also add a textual - * version of it in MDB2::errorMessage(). - */ - -define('MDB2_OK', true); -define('MDB2_ERROR', -1); -define('MDB2_ERROR_SYNTAX', -2); -define('MDB2_ERROR_CONSTRAINT', -3); -define('MDB2_ERROR_NOT_FOUND', -4); -define('MDB2_ERROR_ALREADY_EXISTS', -5); -define('MDB2_ERROR_UNSUPPORTED', -6); -define('MDB2_ERROR_MISMATCH', -7); -define('MDB2_ERROR_INVALID', -8); -define('MDB2_ERROR_NOT_CAPABLE', -9); -define('MDB2_ERROR_TRUNCATED', -10); -define('MDB2_ERROR_INVALID_NUMBER', -11); -define('MDB2_ERROR_INVALID_DATE', -12); -define('MDB2_ERROR_DIVZERO', -13); -define('MDB2_ERROR_NODBSELECTED', -14); -define('MDB2_ERROR_CANNOT_CREATE', -15); -define('MDB2_ERROR_CANNOT_DELETE', -16); -define('MDB2_ERROR_CANNOT_DROP', -17); -define('MDB2_ERROR_NOSUCHTABLE', -18); -define('MDB2_ERROR_NOSUCHFIELD', -19); -define('MDB2_ERROR_NEED_MORE_DATA', -20); -define('MDB2_ERROR_NOT_LOCKED', -21); -define('MDB2_ERROR_VALUE_COUNT_ON_ROW', -22); -define('MDB2_ERROR_INVALID_DSN', -23); -define('MDB2_ERROR_CONNECT_FAILED', -24); -define('MDB2_ERROR_EXTENSION_NOT_FOUND',-25); -define('MDB2_ERROR_NOSUCHDB', -26); -define('MDB2_ERROR_ACCESS_VIOLATION', -27); -define('MDB2_ERROR_CANNOT_REPLACE', -28); -define('MDB2_ERROR_CONSTRAINT_NOT_NULL',-29); -define('MDB2_ERROR_DEADLOCK', -30); -define('MDB2_ERROR_CANNOT_ALTER', -31); -define('MDB2_ERROR_MANAGER', -32); -define('MDB2_ERROR_MANAGER_PARSE', -33); -define('MDB2_ERROR_LOADMODULE', -34); -define('MDB2_ERROR_INSUFFICIENT_DATA', -35); -define('MDB2_ERROR_NO_PERMISSION', -36); -define('MDB2_ERROR_DISCONNECT_FAILED', -37); - -// }}} -// {{{ Verbose constants -/** - * These are just helper constants to more verbosely express parameters to prepare() - */ - -define('MDB2_PREPARE_MANIP', false); -define('MDB2_PREPARE_RESULT', null); - -// }}} -// {{{ Fetchmode constants - -/** - * This is a special constant that tells MDB2 the user hasn't specified - * any particular get mode, so the default should be used. - */ -define('MDB2_FETCHMODE_DEFAULT', 0); - -/** - * Column data indexed by numbers, ordered from 0 and up - */ -define('MDB2_FETCHMODE_ORDERED', 1); - -/** - * Column data indexed by column names - */ -define('MDB2_FETCHMODE_ASSOC', 2); - -/** - * Column data as object properties - */ -define('MDB2_FETCHMODE_OBJECT', 3); - -/** - * For multi-dimensional results: normally the first level of arrays - * is the row number, and the second level indexed by column number or name. - * MDB2_FETCHMODE_FLIPPED switches this order, so the first level of arrays - * is the column name, and the second level the row number. - */ -define('MDB2_FETCHMODE_FLIPPED', 4); - -// }}} -// {{{ Portability mode constants - -/** - * Portability: turn off all portability features. - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_NONE', 0); - -/** - * Portability: convert names of tables and fields to case defined in the - * "field_case" option when using the query*(), fetch*() and tableInfo() methods. - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_FIX_CASE', 1); - -/** - * Portability: right trim the data output by query*() and fetch*(). - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_RTRIM', 2); - -/** - * Portability: force reporting the number of rows deleted. - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_DELETE_COUNT', 4); - -/** - * Portability: not needed in MDB2 (just left here for compatibility to DB) - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_NUMROWS', 8); - -/** - * Portability: makes certain error messages in certain drivers compatible - * with those from other DBMS's. - * - * + mysql, mysqli: change unique/primary key constraints - * MDB2_ERROR_ALREADY_EXISTS -> MDB2_ERROR_CONSTRAINT - * - * + odbc(access): MS's ODBC driver reports 'no such field' as code - * 07001, which means 'too few parameters.' When this option is on - * that code gets mapped to MDB2_ERROR_NOSUCHFIELD. - * - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_ERRORS', 16); - -/** - * Portability: convert empty values to null strings in data output by - * query*() and fetch*(). - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_EMPTY_TO_NULL', 32); - -/** - * Portability: removes database/table qualifiers from associative indexes - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES', 64); - -/** - * Portability: turn on all portability features. - * @see MDB2_Driver_Common::setOption() - */ -define('MDB2_PORTABILITY_ALL', 127); - -// }}} -// {{{ Globals for class instance tracking - -/** - * These are global variables that are used to track the various class instances - */ - -$GLOBALS['_MDB2_databases'] = array(); -$GLOBALS['_MDB2_dsninfo_default'] = array( - 'phptype' => false, - 'dbsyntax' => false, - 'username' => false, - 'password' => false, - 'protocol' => false, - 'hostspec' => false, - 'port' => false, - 'socket' => false, - 'database' => false, - 'mode' => false, -); - -// }}} -// {{{ class MDB2 - -/** - * The main 'MDB2' class is simply a container class with some static - * methods for creating DB objects as well as some utility functions - * common to all parts of DB. - * - * The object model of MDB2 is as follows (indentation means inheritance): - * - * MDB2 The main MDB2 class. This is simply a utility class - * with some 'static' methods for creating MDB2 objects as - * well as common utility functions for other MDB2 classes. - * - * MDB2_Driver_Common The base for each MDB2 implementation. Provides default - * | implementations (in OO lingo virtual methods) for - * | the actual DB implementations as well as a bunch of - * | query utility functions. - * | - * +-MDB2_Driver_mysql The MDB2 implementation for MySQL. Inherits MDB2_Driver_Common. - * When calling MDB2::factory or MDB2::connect for MySQL - * connections, the object returned is an instance of this - * class. - * +-MDB2_Driver_pgsql The MDB2 implementation for PostGreSQL. Inherits MDB2_Driver_Common. - * When calling MDB2::factory or MDB2::connect for PostGreSQL - * connections, the object returned is an instance of this - * class. - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2 -{ - // {{{ function setOptions($db, $options) - - /** - * set option array in an exiting database object - * - * @param MDB2_Driver_Common MDB2 object - * @param array An associative array of option names and their values. - * - * @return mixed MDB2_OK or a PEAR Error object - * - * @access public - */ - static function setOptions($db, $options) - { - if (is_array($options)) { - foreach ($options as $option => $value) { - $test = $db->setOption($option, $value); - if (MDB2::isError($test)) { - return $test; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ function classExists($classname) - - /** - * Checks if a class exists without triggering __autoload - * - * @param string classname - * - * @return bool true success and false on error - * @static - * @access public - */ - static function classExists($classname) - { - return class_exists($classname, false); - } - - // }}} - // {{{ function loadClass($class_name, $debug) - - /** - * Loads a PEAR class. - * - * @param string classname to load - * @param bool if errors should be suppressed - * - * @return mixed true success or PEAR_Error on failure - * - * @access public - */ - static function loadClass($class_name, $debug) - { - if (!MDB2::classExists($class_name)) { - $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php'; - if ($debug) { - $include = include_once($file_name); - } else { - $include = @include_once($file_name); - } - if (!$include) { - if (!MDB2::fileExists($file_name)) { - $msg = "unable to find package '$class_name' file '$file_name'"; - } else { - $msg = "unable to load class '$class_name' from file '$file_name'"; - } - $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg); - return $err; - } - if (!MDB2::classExists($class_name)) { - $msg = "unable to load class '$class_name' from file '$file_name'"; - $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg); - return $err; - } - } - return MDB2_OK; - } - - // }}} - // {{{ function factory($dsn, $options = false) - - /** - * Create a new MDB2 object for the specified database type - * - * @param mixed 'data source name', see the MDB2::parseDSN - * method for a description of the dsn format. - * Can also be specified as an array of the - * format returned by MDB2::parseDSN. - * @param array An associative array of option names and - * their values. - * - * @return mixed a newly created MDB2 object, or false on error - * - * @access public - */ - static function factory($dsn, $options = false) - { - $dsninfo = MDB2::parseDSN($dsn); - if (empty($dsninfo['phptype'])) { - $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, - null, null, 'no RDBMS driver specified'); - return $err; - } - $class_name = 'MDB2_Driver_'.$dsninfo['phptype']; - - $debug = (!empty($options['debug'])); - $err = MDB2::loadClass($class_name, $debug); - if (MDB2::isError($err)) { - return $err; - } - - $db = new $class_name(); - $db->setDSN($dsninfo); - $err = MDB2::setOptions($db, $options); - if (MDB2::isError($err)) { - return $err; - } - - return $db; - } - - // }}} - // {{{ function connect($dsn, $options = false) - - /** - * Create a new MDB2_Driver_* connection object and connect to the specified - * database - * - * @param mixed $dsn 'data source name', see the MDB2::parseDSN - * method for a description of the dsn format. - * Can also be specified as an array of the - * format returned by MDB2::parseDSN. - * @param array $options An associative array of option names and - * their values. - * - * @return mixed a newly created MDB2 connection object, or a MDB2 - * error object on error - * - * @access public - * @see MDB2::parseDSN - */ - static function connect($dsn, $options = false) - { - $db = MDB2::factory($dsn, $options); - if (MDB2::isError($db)) { - return $db; - } - - $err = $db->connect(); - if (MDB2::isError($err)) { - $dsn = $db->getDSN('string', 'xxx'); - $db->disconnect(); - $err->addUserInfo($dsn); - return $err; - } - - return $db; - } - - // }}} - // {{{ function singleton($dsn = null, $options = false) - - /** - * Returns a MDB2 connection with the requested DSN. - * A new MDB2 connection object is only created if no object with the - * requested DSN exists yet. - * - * @param mixed 'data source name', see the MDB2::parseDSN - * method for a description of the dsn format. - * Can also be specified as an array of the - * format returned by MDB2::parseDSN. - * @param array An associative array of option names and - * their values. - * - * @return mixed a newly created MDB2 connection object, or a MDB2 - * error object on error - * - * @access public - * @see MDB2::parseDSN - */ - static function singleton($dsn = null, $options = false) - { - if ($dsn) { - $dsninfo = MDB2::parseDSN($dsn); - $dsninfo = array_merge($GLOBALS['_MDB2_dsninfo_default'], $dsninfo); - $keys = array_keys($GLOBALS['_MDB2_databases']); - for ($i=0, $j=count($keys); $i<$j; ++$i) { - if (isset($GLOBALS['_MDB2_databases'][$keys[$i]])) { - $tmp_dsn = $GLOBALS['_MDB2_databases'][$keys[$i]]->getDSN('array'); - if (count(array_diff_assoc($tmp_dsn, $dsninfo)) == 0) { - MDB2::setOptions($GLOBALS['_MDB2_databases'][$keys[$i]], $options); - return $GLOBALS['_MDB2_databases'][$keys[$i]]; - } - } - } - } elseif (is_array($GLOBALS['_MDB2_databases']) && reset($GLOBALS['_MDB2_databases'])) { - return $GLOBALS['_MDB2_databases'][key($GLOBALS['_MDB2_databases'])]; - } - $db = MDB2::factory($dsn, $options); - return $db; - } - - // }}} - // {{{ function areEquals() - - /** - * It looks like there's a memory leak in array_diff() in PHP 5.1.x, - * so use this method instead. - * @see http://pear.php.net/bugs/bug.php?id=11790 - * - * @param array $arr1 - * @param array $arr2 - * @return boolean - */ - static function areEquals($arr1, $arr2) - { - if (count($arr1) != count($arr2)) { - return false; - } - foreach (array_keys($arr1) as $k) { - if (!array_key_exists($k, $arr2) || $arr1[$k] != $arr2[$k]) { - return false; - } - } - return true; - } - - // }}} - // {{{ function loadFile($file) - - /** - * load a file (like 'Date') - * - * @param string $file name of the file in the MDB2 directory (without '.php') - * - * @return string name of the file that was included - * - * @access public - */ - static function loadFile($file) - { - $file_name = 'MDB2'.DIRECTORY_SEPARATOR.$file.'.php'; - if (!MDB2::fileExists($file_name)) { - return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'unable to find: '.$file_name); - } - if (!include_once($file_name)) { - return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'unable to load driver class: '.$file_name); - } - return $file_name; - } - - // }}} - // {{{ function apiVersion() - - /** - * Return the MDB2 API version - * - * @return string the MDB2 API version number - * - * @access public - */ - function apiVersion() - { - return '@package_version@'; - } - - // }}} - // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null) - - /** - * This method is used to communicate an error and invoke error - * callbacks etc. Basically a wrapper for PEAR::raiseError - * without the message string. - * - * @param mixed int error code - * - * @param int error mode, see PEAR_Error docs - * - * @param mixed If error mode is PEAR_ERROR_TRIGGER, this is the - * error level (E_USER_NOTICE etc). If error mode is - * PEAR_ERROR_CALLBACK, this is the callback function, - * either as a function name, or as an array of an - * object and method name. For other error modes this - * parameter is ignored. - * - * @param string Extra debug information. Defaults to the last - * query and native error code. - * - * @return PEAR_Error instance of a PEAR Error object - * - * @access private - * @see PEAR_Error - */ - public static function &raiseError($code = null, - $mode = null, - $options = null, - $userinfo = null, - $dummy1 = null, - $dummy2 = null, - $dummy3 = false) - { - $pear = new PEAR; - $err = $pear->raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true); - return $err; - } - - // }}} - // {{{ function isError($data, $code = null) - - /** - * Tell whether a value is a MDB2 error. - * - * @param mixed the value to test - * @param int if is an error object, return true - * only if $code is a string and - * $db->getMessage() == $code or - * $code is an integer and $db->getCode() == $code - * - * @return bool true if parameter is an error - * - * @access public - */ - static function isError($data, $code = null) - { - if ($data instanceof MDB2_Error) { - if (null === $code) { - return true; - } - if (is_string($code)) { - return $data->getMessage() === $code; - } - return in_array($data->getCode(), (array)$code); - } - return false; - } - - // }}} - // {{{ function isConnection($value) - - /** - * Tell whether a value is a MDB2 connection - * - * @param mixed value to test - * - * @return bool whether $value is a MDB2 connection - * @access public - */ - static function isConnection($value) - { - return ($value instanceof MDB2_Driver_Common); - } - - // }}} - // {{{ function isResult($value) - - /** - * Tell whether a value is a MDB2 result - * - * @param mixed $value value to test - * - * @return bool whether $value is a MDB2 result - * - * @access public - */ - function isResult($value) - { - return ($value instanceof MDB2_Result); - } - - // }}} - // {{{ function isResultCommon($value) - - /** - * Tell whether a value is a MDB2 result implementing the common interface - * - * @param mixed $value value to test - * - * @return bool whether $value is a MDB2 result implementing the common interface - * - * @access public - */ - static function isResultCommon($value) - { - return ($value instanceof MDB2_Result_Common); - } - - // }}} - // {{{ function isStatement($value) - - /** - * Tell whether a value is a MDB2 statement interface - * - * @param mixed value to test - * - * @return bool whether $value is a MDB2 statement interface - * - * @access public - */ - function isStatement($value) - { - return ($value instanceof MDB2_Statement_Common); - } - - // }}} - // {{{ function errorMessage($value = null) - - /** - * Return a textual error message for a MDB2 error code - * - * @param int|array integer error code, - null to get the current error code-message map, - or an array with a new error code-message map - * - * @return string error message, or false if the error code was - * not recognized - * - * @access public - */ - static function errorMessage($value = null) - { - static $errorMessages; - - if (is_array($value)) { - $errorMessages = $value; - return MDB2_OK; - } - - if (!isset($errorMessages)) { - $errorMessages = array( - MDB2_OK => 'no error', - MDB2_ERROR => 'unknown error', - MDB2_ERROR_ALREADY_EXISTS => 'already exists', - MDB2_ERROR_CANNOT_CREATE => 'can not create', - MDB2_ERROR_CANNOT_ALTER => 'can not alter', - MDB2_ERROR_CANNOT_REPLACE => 'can not replace', - MDB2_ERROR_CANNOT_DELETE => 'can not delete', - MDB2_ERROR_CANNOT_DROP => 'can not drop', - MDB2_ERROR_CONSTRAINT => 'constraint violation', - MDB2_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', - MDB2_ERROR_DIVZERO => 'division by zero', - MDB2_ERROR_INVALID => 'invalid', - MDB2_ERROR_INVALID_DATE => 'invalid date or time', - MDB2_ERROR_INVALID_NUMBER => 'invalid number', - MDB2_ERROR_MISMATCH => 'mismatch', - MDB2_ERROR_NODBSELECTED => 'no database selected', - MDB2_ERROR_NOSUCHFIELD => 'no such field', - MDB2_ERROR_NOSUCHTABLE => 'no such table', - MDB2_ERROR_NOT_CAPABLE => 'MDB2 backend not capable', - MDB2_ERROR_NOT_FOUND => 'not found', - MDB2_ERROR_NOT_LOCKED => 'not locked', - MDB2_ERROR_SYNTAX => 'syntax error', - MDB2_ERROR_UNSUPPORTED => 'not supported', - MDB2_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', - MDB2_ERROR_INVALID_DSN => 'invalid DSN', - MDB2_ERROR_CONNECT_FAILED => 'connect failed', - MDB2_ERROR_NEED_MORE_DATA => 'insufficient data supplied', - MDB2_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', - MDB2_ERROR_NOSUCHDB => 'no such database', - MDB2_ERROR_ACCESS_VIOLATION => 'insufficient permissions', - MDB2_ERROR_LOADMODULE => 'error while including on demand module', - MDB2_ERROR_TRUNCATED => 'truncated', - MDB2_ERROR_DEADLOCK => 'deadlock detected', - MDB2_ERROR_NO_PERMISSION => 'no permission', - MDB2_ERROR_DISCONNECT_FAILED => 'disconnect failed', - ); - } - - if (null === $value) { - return $errorMessages; - } - - if (MDB2::isError($value)) { - $value = $value->getCode(); - } - - return isset($errorMessages[$value]) ? - $errorMessages[$value] : $errorMessages[MDB2_ERROR]; - } - - // }}} - // {{{ function parseDSN($dsn) - - /** - * Parse a data source name. - * - * Additional keys can be added by appending a URI query string to the - * end of the DSN. - * - * The format of the supplied DSN is in its fullest form: - * - * phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true - * - * - * Most variations are allowed: - * - * phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 - * phptype://username:password@hostspec/database_name - * phptype://username:password@hostspec - * phptype://username@hostspec - * phptype://hostspec/database - * phptype://hostspec - * phptype(dbsyntax) - * phptype - * - * - * @param string Data Source Name to be parsed - * - * @return array an associative array with the following keys: - * + phptype: Database backend used in PHP (mysql, odbc etc.) - * + dbsyntax: Database used with regards to SQL syntax etc. - * + protocol: Communication protocol to use (tcp, unix etc.) - * + hostspec: Host specification (hostname[:port]) - * + database: Database to use on the DBMS server - * + username: User name for login - * + password: Password for login - * - * @access public - * @author Tomas V.V.Cox - */ - static function parseDSN($dsn) - { - $parsed = $GLOBALS['_MDB2_dsninfo_default']; - - if (is_array($dsn)) { - $dsn = array_merge($parsed, $dsn); - if (!$dsn['dbsyntax']) { - $dsn['dbsyntax'] = $dsn['phptype']; - } - return $dsn; - } - - // Find phptype and dbsyntax - if (($pos = strpos($dsn, '://')) !== false) { - $str = substr($dsn, 0, $pos); - $dsn = substr($dsn, $pos + 3); - } else { - $str = $dsn; - $dsn = null; - } - - // Get phptype and dbsyntax - // $str => phptype(dbsyntax) - if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { - $parsed['phptype'] = $arr[1]; - $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; - } else { - $parsed['phptype'] = $str; - $parsed['dbsyntax'] = $str; - } - - if (!count($dsn)) { - return $parsed; - } - - // Get (if found): username and password - // $dsn => username:password@protocol+hostspec/database - if (($at = strrpos($dsn,'@')) !== false) { - $str = substr($dsn, 0, $at); - $dsn = substr($dsn, $at + 1); - if (($pos = strpos($str, ':')) !== false) { - $parsed['username'] = rawurldecode(substr($str, 0, $pos)); - $parsed['password'] = rawurldecode(substr($str, $pos + 1)); - } else { - $parsed['username'] = rawurldecode($str); - } - } - - // Find protocol and hostspec - - // $dsn => proto(proto_opts)/database - if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { - $proto = $match[1]; - $proto_opts = $match[2] ? $match[2] : false; - $dsn = $match[3]; - - // $dsn => protocol+hostspec/database (old format) - } else { - if (strpos($dsn, '+') !== false) { - list($proto, $dsn) = explode('+', $dsn, 2); - } - if ( strpos($dsn, '//') === 0 - && strpos($dsn, '/', 2) !== false - && $parsed['phptype'] == 'oci8' - ) { - //oracle's "Easy Connect" syntax: - //"username/password@[//]host[:port][/service_name]" - //e.g. "scott/tiger@//mymachine:1521/oracle" - $proto_opts = $dsn; - $pos = strrpos($proto_opts, '/'); - $dsn = substr($proto_opts, $pos + 1); - $proto_opts = substr($proto_opts, 0, $pos); - } elseif (strpos($dsn, '/') !== false) { - list($proto_opts, $dsn) = explode('/', $dsn, 2); - } else { - $proto_opts = $dsn; - $dsn = null; - } - } - - // process the different protocol options - $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; - $proto_opts = rawurldecode($proto_opts); - if (strpos($proto_opts, ':') !== false) { - list($proto_opts, $parsed['port']) = explode(':', $proto_opts); - } - if ($parsed['protocol'] == 'tcp') { - $parsed['hostspec'] = $proto_opts; - } elseif ($parsed['protocol'] == 'unix') { - $parsed['socket'] = $proto_opts; - } - - // Get dabase if any - // $dsn => database - if ($dsn) { - // /database - if (($pos = strpos($dsn, '?')) === false) { - $parsed['database'] = rawurldecode($dsn); - // /database?param1=value1¶m2=value2 - } else { - $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); - $dsn = substr($dsn, $pos + 1); - if (strpos($dsn, '&') !== false) { - $opts = explode('&', $dsn); - } else { // database?param1=value1 - $opts = array($dsn); - } - foreach ($opts as $opt) { - list($key, $value) = explode('=', $opt); - if (!array_key_exists($key, $parsed) || false === $parsed[$key]) { - // don't allow params overwrite - $parsed[$key] = rawurldecode($value); - } - } - } - } - - return $parsed; - } - - // }}} - // {{{ function fileExists($file) - - /** - * Checks if a file exists in the include path - * - * @param string filename - * - * @return bool true success and false on error - * - * @access public - */ - static function fileExists($file) - { - // safe_mode does notwork with is_readable() - if (!@ini_get('safe_mode')) { - $dirs = explode(PATH_SEPARATOR, ini_get('include_path')); - foreach ($dirs as $dir) { - if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) { - return true; - } - } - } else { - $fp = @fopen($file, 'r', true); - if (is_resource($fp)) { - @fclose($fp); - return true; - } - } - return false; - } - // }}} -} - -// }}} -// {{{ class MDB2_Error extends PEAR_Error - -/** - * MDB2_Error implements a class for reporting portable database error - * messages. - * - * @package MDB2 - * @category Database - * @author Stig Bakken - */ -class MDB2_Error extends PEAR_Error -{ - // {{{ constructor: function MDB2_Error($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null) - - /** - * MDB2_Error constructor. - * - * @param mixed MDB2 error code, or string with error message. - * @param int what 'error mode' to operate in - * @param int what error level to use for $mode & PEAR_ERROR_TRIGGER - * @param mixed additional debug info, such as the last query - */ - function __construct($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN, - $level = E_USER_NOTICE, $debuginfo = null, $dummy = null) - { - if (null === $code) { - $code = MDB2_ERROR; - } - $this->PEAR_Error('MDB2 Error: '.MDB2::errorMessage($code), $code, - $mode, $level, $debuginfo); - } - - // }}} -} - -// }}} -// {{{ class MDB2_Driver_Common extends PEAR - -/** - * MDB2_Driver_Common: Base class that is extended by each MDB2 driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Common -{ - // {{{ Variables (Properties) - - /** - * @var MDB2_Driver_Datatype_Common - */ - public $datatype; - - /** - * @var MDB2_Extended - */ - public $extended; - - /** - * @var MDB2_Driver_Function_Common - */ - public $function; - - /** - * @var MDB2_Driver_Manager_Common - */ - public $manager; - - /** - * @var MDB2_Driver_Native_Commonn - */ - public $native; - - /** - * @var MDB2_Driver_Reverse_Common - */ - public $reverse; - - /** - * index of the MDB2 object within the $GLOBALS['_MDB2_databases'] array - * @var int - * @access public - */ - public $db_index = 0; - - /** - * DSN used for the next query - * @var array - * @access protected - */ - public $dsn = array(); - - /** - * DSN that was used to create the current connection - * @var array - * @access protected - */ - public $connected_dsn = array(); - - /** - * connection resource - * @var mixed - * @access protected - */ - public $connection = 0; - - /** - * if the current opened connection is a persistent connection - * @var bool - * @access protected - */ - public $opened_persistent; - - /** - * the name of the database for the next query - * @var string - * @access public - */ - public $database_name = ''; - - /** - * the name of the database currently selected - * @var string - * @access protected - */ - public $connected_database_name = ''; - - /** - * server version information - * @var string - * @access protected - */ - public $connected_server_info = ''; - - /** - * list of all supported features of the given driver - * @var array - * @access public - */ - public $supported = array( - 'sequences' => false, - 'indexes' => false, - 'affected_rows' => false, - 'summary_functions' => false, - 'order_by_text' => false, - 'transactions' => false, - 'savepoints' => false, - 'current_id' => false, - 'limit_queries' => false, - 'LOBs' => false, - 'replace' => false, - 'sub_selects' => false, - 'triggers' => false, - 'auto_increment' => false, - 'primary_key' => false, - 'result_introspection' => false, - 'prepared_statements' => false, - 'identifier_quoting' => false, - 'pattern_escaping' => false, - 'new_link' => false, - ); - - /** - * Array of supported options that can be passed to the MDB2 instance. - * - * The options can be set during object creation, using - * MDB2::connect(), MDB2::factory() or MDB2::singleton(). The options can - * also be set after the object is created, using MDB2::setOptions() or - * MDB2_Driver_Common::setOption(). - * The list of available option includes: - *
      - *
    • $options['ssl'] -> boolean: determines if ssl should be used for connections
    • - *
    • $options['field_case'] -> CASE_LOWER|CASE_UPPER: determines what case to force on field/table names
    • - *
    • $options['disable_query'] -> boolean: determines if queries should be executed
    • - *
    • $options['result_class'] -> string: class used for result sets
    • - *
    • $options['buffered_result_class'] -> string: class used for buffered result sets
    • - *
    • $options['result_wrap_class'] -> string: class used to wrap result sets into
    • - *
    • $options['result_buffering'] -> boolean should results be buffered or not?
    • - *
    • $options['fetch_class'] -> string: class to use when fetch mode object is used
    • - *
    • $options['persistent'] -> boolean: persistent connection?
    • - *
    • $options['debug'] -> integer: numeric debug level
    • - *
    • $options['debug_handler'] -> string: function/method that captures debug messages
    • - *
    • $options['debug_expanded_output'] -> bool: BC option to determine if more context information should be send to the debug handler
    • - *
    • $options['default_text_field_length'] -> integer: default text field length to use
    • - *
    • $options['lob_buffer_length'] -> integer: LOB buffer length
    • - *
    • $options['log_line_break'] -> string: line-break format
    • - *
    • $options['idxname_format'] -> string: pattern for index name
    • - *
    • $options['seqname_format'] -> string: pattern for sequence name
    • - *
    • $options['savepoint_format'] -> string: pattern for auto generated savepoint names
    • - *
    • $options['statement_format'] -> string: pattern for prepared statement names
    • - *
    • $options['seqcol_name'] -> string: sequence column name
    • - *
    • $options['quote_identifier'] -> boolean: if identifier quoting should be done when check_option is used
    • - *
    • $options['use_transactions'] -> boolean: if transaction use should be enabled
    • - *
    • $options['decimal_places'] -> integer: number of decimal places to handle
    • - *
    • $options['portability'] -> integer: portability constant
    • - *
    • $options['modules'] -> array: short to long module name mapping for __call()
    • - *
    • $options['emulate_prepared'] -> boolean: force prepared statements to be emulated
    • - *
    • $options['datatype_map'] -> array: map user defined datatypes to other primitive datatypes
    • - *
    • $options['datatype_map_callback'] -> array: callback function/method that should be called
    • - *
    • $options['bindname_format'] -> string: regular expression pattern for named parameters
    • - *
    • $options['multi_query'] -> boolean: determines if queries returning multiple result sets should be executed
    • - *
    • $options['max_identifiers_length'] -> integer: max identifier length
    • - *
    • $options['default_fk_action_onupdate'] -> string: default FOREIGN KEY ON UPDATE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']
    • - *
    • $options['default_fk_action_ondelete'] -> string: default FOREIGN KEY ON DELETE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']
    • - *
    - * - * @var array - * @access public - * @see MDB2::connect() - * @see MDB2::factory() - * @see MDB2::singleton() - * @see MDB2_Driver_Common::setOption() - */ - public $options = array( - 'ssl' => false, - 'field_case' => CASE_LOWER, - 'disable_query' => false, - 'result_class' => 'MDB2_Result_%s', - 'buffered_result_class' => 'MDB2_BufferedResult_%s', - 'result_wrap_class' => false, - 'result_buffering' => true, - 'fetch_class' => 'stdClass', - 'persistent' => false, - 'debug' => 0, - 'debug_handler' => 'MDB2_defaultDebugOutput', - 'debug_expanded_output' => false, - 'default_text_field_length' => 4096, - 'lob_buffer_length' => 8192, - 'log_line_break' => "\n", - 'idxname_format' => '%s_idx', - 'seqname_format' => '%s_seq', - 'savepoint_format' => 'MDB2_SAVEPOINT_%s', - 'statement_format' => 'MDB2_STATEMENT_%1$s_%2$s', - 'seqcol_name' => 'sequence', - 'quote_identifier' => false, - 'use_transactions' => true, - 'decimal_places' => 2, - 'portability' => MDB2_PORTABILITY_ALL, - 'modules' => array( - 'ex' => 'Extended', - 'dt' => 'Datatype', - 'mg' => 'Manager', - 'rv' => 'Reverse', - 'na' => 'Native', - 'fc' => 'Function', - ), - 'emulate_prepared' => false, - 'datatype_map' => array(), - 'datatype_map_callback' => array(), - 'nativetype_map_callback' => array(), - 'lob_allow_url_include' => false, - 'bindname_format' => '(?:\d+)|(?:[a-zA-Z][a-zA-Z0-9_]*)', - 'max_identifiers_length' => 30, - 'default_fk_action_onupdate' => 'RESTRICT', - 'default_fk_action_ondelete' => 'RESTRICT', - ); - - /** - * string array - * @var string - * @access public - */ - public $string_quoting = array( - 'start' => "'", - 'end' => "'", - 'escape' => false, - 'escape_pattern' => false, - ); - - /** - * identifier quoting - * @var array - * @access public - */ - public $identifier_quoting = array( - 'start' => '"', - 'end' => '"', - 'escape' => '"', - ); - - /** - * sql comments - * @var array - * @access protected - */ - public $sql_comments = array( - array('start' => '--', 'end' => "\n", 'escape' => false), - array('start' => '/*', 'end' => '*/', 'escape' => false), - ); - - /** - * comparision wildcards - * @var array - * @access protected - */ - protected $wildcards = array('%', '_'); - - /** - * column alias keyword - * @var string - * @access protected - */ - public $as_keyword = ' AS '; - - /** - * warnings - * @var array - * @access protected - */ - public $warnings = array(); - - /** - * string with the debugging information - * @var string - * @access public - */ - public $debug_output = ''; - - /** - * determine if there is an open transaction - * @var bool - * @access protected - */ - public $in_transaction = false; - - /** - * the smart transaction nesting depth - * @var int - * @access protected - */ - public $nested_transaction_counter = null; - - /** - * the first error that occured inside a nested transaction - * @var MDB2_Error|bool - * @access protected - */ - protected $has_transaction_error = false; - - /** - * result offset used in the next query - * @var int - * @access public - */ - public $offset = 0; - - /** - * result limit used in the next query - * @var int - * @access public - */ - public $limit = 0; - - /** - * Database backend used in PHP (mysql, odbc etc.) - * @var string - * @access public - */ - public $phptype; - - /** - * Database used with regards to SQL syntax etc. - * @var string - * @access public - */ - public $dbsyntax; - - /** - * the last query sent to the driver - * @var string - * @access public - */ - public $last_query; - - /** - * the default fetchmode used - * @var int - * @access public - */ - public $fetchmode = MDB2_FETCHMODE_ORDERED; - - /** - * array of module instances - * @var array - * @access protected - */ - protected $modules = array(); - - /** - * determines of the PHP4 destructor emulation has been enabled yet - * @var array - * @access protected - */ - protected $destructor_registered = true; - - /** - * @var PEAR - */ - protected $pear; - - // }}} - // {{{ constructor: function __construct() - - /** - * Constructor - */ - function __construct() - { - end($GLOBALS['_MDB2_databases']); - $db_index = key($GLOBALS['_MDB2_databases']) + 1; - $GLOBALS['_MDB2_databases'][$db_index] = &$this; - $this->db_index = $db_index; - $this->pear = new PEAR; - } - - // }}} - // {{{ destructor: function __destruct() - - /** - * Destructor - */ - function __destruct() - { - $this->disconnect(false); - } - - // }}} - // {{{ function free() - - /** - * Free the internal references so that the instance can be destroyed - * - * @return bool true on success, false if result is invalid - * - * @access public - */ - function free() - { - unset($GLOBALS['_MDB2_databases'][$this->db_index]); - unset($this->db_index); - return MDB2_OK; - } - - // }}} - // {{{ function __toString() - - /** - * String conversation - * - * @return string representation of the object - * - * @access public - */ - function __toString() - { - $info = get_class($this); - $info.= ': (phptype = '.$this->phptype.', dbsyntax = '.$this->dbsyntax.')'; - if ($this->connection) { - $info.= ' [connected]'; - } - return $info; - } - - // }}} - // {{{ function errorInfo($error = null) - - /** - * This method is used to collect information about an error - * - * @param mixed error code or resource - * - * @return array with MDB2 errorcode, native error code, native message - * - * @access public - */ - function errorInfo($error = null) - { - return array($error, null, null); - } - - // }}} - // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null) - - /** - * This method is used to communicate an error and invoke error - * callbacks etc. Basically a wrapper for PEAR::raiseError - * without the message string. - * - * @param mixed $code integer error code, or a PEAR error object (all - * other parameters are ignored if this parameter is - * an object - * @param int $mode error mode, see PEAR_Error docs - * @param mixed $options If error mode is PEAR_ERROR_TRIGGER, this is the - * error level (E_USER_NOTICE etc). If error mode is - * PEAR_ERROR_CALLBACK, this is the callback function, - * either as a function name, or as an array of an - * object and method name. For other error modes this - * parameter is ignored. - * @param string $userinfo Extra debug information. Defaults to the last - * query and native error code. - * @param string $method name of the method that triggered the error - * @param string $dummy1 not used - * @param bool $dummy2 not used - * - * @return PEAR_Error instance of a PEAR Error object - * @access public - * @see PEAR_Error - */ - function &raiseError($code = null, - $mode = null, - $options = null, - $userinfo = null, - $method = null, - $dummy1 = null, - $dummy2 = false - ) { - $userinfo = "[Error message: $userinfo]\n"; - // The error is yet a MDB2 error object - if (MDB2::isError($code)) { - // because we use the static PEAR::raiseError, our global - // handler should be used if it is set - if ((null === $mode) && !empty($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - } - if (null === $userinfo) { - $userinfo = $code->getUserinfo(); - } - $code = $code->getCode(); - } elseif ($code == MDB2_ERROR_NOT_FOUND) { - // extension not loaded: don't call $this->errorInfo() or the script - // will die - } elseif (isset($this->connection)) { - if (!empty($this->last_query)) { - $userinfo.= "[Last executed query: {$this->last_query}]\n"; - } - $native_errno = $native_msg = null; - list($code, $native_errno, $native_msg) = $this->errorInfo($code); - if ((null !== $native_errno) && $native_errno !== '') { - $userinfo.= "[Native code: $native_errno]\n"; - } - if ((null !== $native_msg) && $native_msg !== '') { - $userinfo.= "[Native message: ". strip_tags($native_msg) ."]\n"; - } - if (null !== $method) { - $userinfo = $method.': '.$userinfo; - } - } - - $err = $this->pear->raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true); - if ($err->getMode() !== PEAR_ERROR_RETURN - && isset($this->nested_transaction_counter) && !$this->has_transaction_error) { - $this->has_transaction_error = $err; - } - return $err; - } - - // }}} - // {{{ function resetWarnings() - - /** - * reset the warning array - * - * @return void - * - * @access public - */ - function resetWarnings() - { - $this->warnings = array(); - } - - // }}} - // {{{ function getWarnings() - - /** - * Get all warnings in reverse order. - * This means that the last warning is the first element in the array - * - * @return array with warnings - * - * @access public - * @see resetWarnings() - */ - function getWarnings() - { - return array_reverse($this->warnings); - } - - // }}} - // {{{ function setFetchMode($fetchmode, $object_class = 'stdClass') - - /** - * Sets which fetch mode should be used by default on queries - * on this connection - * - * @param int MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC - * or MDB2_FETCHMODE_OBJECT - * @param string the class name of the object to be returned - * by the fetch methods when the - * MDB2_FETCHMODE_OBJECT mode is selected. - * If no class is specified by default a cast - * to object from the assoc array row will be - * done. There is also the possibility to use - * and extend the 'MDB2_row' class. - * - * @return mixed MDB2_OK or MDB2 Error Object - * - * @access public - * @see MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC, MDB2_FETCHMODE_OBJECT - */ - function setFetchMode($fetchmode, $object_class = 'stdClass') - { - switch ($fetchmode) { - case MDB2_FETCHMODE_OBJECT: - $this->options['fetch_class'] = $object_class; - case MDB2_FETCHMODE_ORDERED: - case MDB2_FETCHMODE_ASSOC: - $this->fetchmode = $fetchmode; - break; - default: - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'invalid fetchmode mode', __FUNCTION__); - } - - return MDB2_OK; - } - - // }}} - // {{{ function setOption($option, $value) - - /** - * set the option for the db class - * - * @param string option name - * @param mixed value for the option - * - * @return mixed MDB2_OK or MDB2 Error Object - * - * @access public - */ - function setOption($option, $value) - { - if (array_key_exists($option, $this->options)) { - $this->options[$option] = $value; - return MDB2_OK; - } - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - "unknown option $option", __FUNCTION__); - } - - // }}} - // {{{ function getOption($option) - - /** - * Returns the value of an option - * - * @param string option name - * - * @return mixed the option value or error object - * - * @access public - */ - function getOption($option) - { - if (array_key_exists($option, $this->options)) { - return $this->options[$option]; - } - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - "unknown option $option", __FUNCTION__); - } - - // }}} - // {{{ function debug($message, $scope = '', $is_manip = null) - - /** - * set a debug message - * - * @param string message that should be appended to the debug variable - * @param string usually the method name that triggered the debug call: - * for example 'query', 'prepare', 'execute', 'parameters', - * 'beginTransaction', 'commit', 'rollback' - * @param array contains context information about the debug() call - * common keys are: is_manip, time, result etc. - * - * @return void - * - * @access public - */ - function debug($message, $scope = '', $context = array()) - { - if ($this->options['debug'] && $this->options['debug_handler']) { - if (!$this->options['debug_expanded_output']) { - if (!empty($context['when']) && $context['when'] !== 'pre') { - return null; - } - $context = empty($context['is_manip']) ? false : $context['is_manip']; - } - return call_user_func_array($this->options['debug_handler'], array(&$this, $scope, $message, $context)); - } - return null; - } - - // }}} - // {{{ function getDebugOutput() - - /** - * output debug info - * - * @return string content of the debug_output class variable - * - * @access public - */ - function getDebugOutput() - { - return $this->debug_output; - } - - // }}} - // {{{ function escape($text) - - /** - * Quotes a string so it can be safely used in a query. It will quote - * the text so it can safely be used within a query. - * - * @param string the input string to quote - * @param bool escape wildcards - * - * @return string quoted string - * - * @access public - */ - function escape($text, $escape_wildcards = false) - { - if ($escape_wildcards) { - $text = $this->escapePattern($text); - } - - $text = str_replace($this->string_quoting['end'], $this->string_quoting['escape'] . $this->string_quoting['end'], $text); - return $text; - } - - // }}} - // {{{ function escapePattern($text) - - /** - * Quotes pattern (% and _) characters in a string) - * - * @param string the input string to quote - * - * @return string quoted string - * - * @access public - */ - function escapePattern($text) - { - if ($this->string_quoting['escape_pattern']) { - $text = str_replace($this->string_quoting['escape_pattern'], $this->string_quoting['escape_pattern'] . $this->string_quoting['escape_pattern'], $text); - foreach ($this->wildcards as $wildcard) { - $text = str_replace($wildcard, $this->string_quoting['escape_pattern'] . $wildcard, $text); - } - } - return $text; - } - - // }}} - // {{{ function quoteIdentifier($str, $check_option = false) - - /** - * Quote a string so it can be safely used as a table or column name - * - * Delimiting style depends on which database driver is being used. - * - * NOTE: just because you CAN use delimited identifiers doesn't mean - * you SHOULD use them. In general, they end up causing way more - * problems than they solve. - * - * NOTE: if you have table names containing periods, don't use this method - * (@see bug #11906) - * - * Portability is broken by using the following characters inside - * delimited identifiers: - * + backtick (`) -- due to MySQL - * + double quote (") -- due to Oracle - * + brackets ([ or ]) -- due to Access - * - * Delimited identifiers are known to generally work correctly under - * the following drivers: - * + mssql - * + mysql - * + mysqli - * + oci8 - * + pgsql - * + sqlite - * - * InterBase doesn't seem to be able to use delimited identifiers - * via PHP 4. They work fine under PHP 5. - * - * @param string identifier name to be quoted - * @param bool check the 'quote_identifier' option - * - * @return string quoted identifier string - * - * @access public - */ - function quoteIdentifier($str, $check_option = false) - { - if ($check_option && !$this->options['quote_identifier']) { - return $str; - } - $str = str_replace($this->identifier_quoting['end'], $this->identifier_quoting['escape'] . $this->identifier_quoting['end'], $str); - $parts = explode('.', $str); - foreach (array_keys($parts) as $k) { - $parts[$k] = $this->identifier_quoting['start'] . $parts[$k] . $this->identifier_quoting['end']; - } - return implode('.', $parts); - } - - // }}} - // {{{ function getAsKeyword() - - /** - * Gets the string to alias column - * - * @return string to use when aliasing a column - */ - function getAsKeyword() - { - return $this->as_keyword; - } - - // }}} - // {{{ function getConnection() - - /** - * Returns a native connection - * - * @return mixed a valid MDB2 connection object, - * or a MDB2 error object on error - * - * @access public - */ - function getConnection() - { - $result = $this->connect(); - if (MDB2::isError($result)) { - return $result; - } - return $this->connection; - } - - // }}} - // {{{ function _fixResultArrayValues(&$row, $mode) - - /** - * Do all necessary conversions on result arrays to fix DBMS quirks - * - * @param array the array to be fixed (passed by reference) - * @param array bit-wise addition of the required portability modes - * - * @return void - * - * @access protected - */ - function _fixResultArrayValues(&$row, $mode) - { - switch ($mode) { - case MDB2_PORTABILITY_EMPTY_TO_NULL: - foreach ($row as $key => $value) { - if ($value === '') { - $row[$key] = null; - } - } - break; - case MDB2_PORTABILITY_RTRIM: - foreach ($row as $key => $value) { - if (is_string($value)) { - $row[$key] = rtrim($value); - } - } - break; - case MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES: - $tmp_row = array(); - foreach ($row as $key => $value) { - $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value; - } - $row = $tmp_row; - break; - case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL): - foreach ($row as $key => $value) { - if ($value === '') { - $row[$key] = null; - } elseif (is_string($value)) { - $row[$key] = rtrim($value); - } - } - break; - case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES): - $tmp_row = array(); - foreach ($row as $key => $value) { - if (is_string($value)) { - $value = rtrim($value); - } - $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value; - } - $row = $tmp_row; - break; - case (MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES): - $tmp_row = array(); - foreach ($row as $key => $value) { - if ($value === '') { - $value = null; - } - $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value; - } - $row = $tmp_row; - break; - case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES): - $tmp_row = array(); - foreach ($row as $key => $value) { - if ($value === '') { - $value = null; - } elseif (is_string($value)) { - $value = rtrim($value); - } - $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value; - } - $row = $tmp_row; - break; - } - } - - // }}} - // {{{ function loadModule($module, $property = null, $phptype_specific = null) - - /** - * loads a module - * - * @param string name of the module that should be loaded - * (only used for error messages) - * @param string name of the property into which the class will be loaded - * @param bool if the class to load for the module is specific to the - * phptype - * - * @return object on success a reference to the given module is returned - * and on failure a PEAR error - * - * @access public - */ - function loadModule($module, $property = null, $phptype_specific = null) - { - if (!$property) { - $property = strtolower($module); - } - - if (!isset($this->{$property})) { - $version = $phptype_specific; - if ($phptype_specific !== false) { - $version = true; - $class_name = 'MDB2_Driver_'.$module.'_'.$this->phptype; - $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php'; - } - if ($phptype_specific === false - || (!MDB2::classExists($class_name) && !MDB2::fileExists($file_name)) - ) { - $version = false; - $class_name = 'MDB2_'.$module; - $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php'; - } - - $err = MDB2::loadClass($class_name, $this->getOption('debug')); - if (MDB2::isError($err)) { - return $err; - } - - // load module in a specific version - if ($version) { - if (method_exists($class_name, 'getClassName')) { - $class_name_new = call_user_func(array($class_name, 'getClassName'), $this->db_index); - if ($class_name != $class_name_new) { - $class_name = $class_name_new; - $err = MDB2::loadClass($class_name, $this->getOption('debug')); - if (MDB2::isError($err)) { - return $err; - } - } - } - } - - if (!MDB2::classExists($class_name)) { - $err = $this->raiseError(MDB2_ERROR_LOADMODULE, null, null, - "unable to load module '$module' into property '$property'", __FUNCTION__); - return $err; - } - $this->{$property} = new $class_name($this->db_index); - $this->modules[$module] = $this->{$property}; - if ($version) { - // this will be used in the connect method to determine if the module - // needs to be loaded with a different version if the server - // version changed in between connects - $this->loaded_version_modules[] = $property; - } - } - - return $this->{$property}; - } - - // }}} - // {{{ function __call($method, $params) - - /** - * Calls a module method using the __call magic method - * - * @param string Method name. - * @param array Arguments. - * - * @return mixed Returned value. - */ - function __call($method, $params) - { - $module = null; - if (preg_match('/^([a-z]+)([A-Z])(.*)$/', $method, $match) - && isset($this->options['modules'][$match[1]]) - ) { - $module = $this->options['modules'][$match[1]]; - $method = strtolower($match[2]).$match[3]; - if (!isset($this->modules[$module]) || !is_object($this->modules[$module])) { - $result = $this->loadModule($module); - if (MDB2::isError($result)) { - return $result; - } - } - } else { - foreach ($this->modules as $key => $foo) { - if (is_object($this->modules[$key]) - && method_exists($this->modules[$key], $method) - ) { - $module = $key; - break; - } - } - } - if (null !== $module) { - return call_user_func_array(array(&$this->modules[$module], $method), $params); - } - trigger_error(sprintf('Call to undefined function: %s::%s().', get_class($this), $method), E_USER_ERROR); - } - - // }}} - // {{{ function beginTransaction($savepoint = null) - - /** - * Start a transaction or set a savepoint. - * - * @param string name of a savepoint to set - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function beginTransaction($savepoint = null) - { - $this->debug('Starting transaction', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'transactions are not supported', __FUNCTION__); - } - - // }}} - // {{{ function commit($savepoint = null) - - /** - * Commit the database changes done during a transaction that is in - * progress or release a savepoint. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after committing the pending changes. - * - * @param string name of a savepoint to release - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function commit($savepoint = null) - { - $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'commiting transactions is not supported', __FUNCTION__); - } - - // }}} - // {{{ function rollback($savepoint = null) - - /** - * Cancel any database changes done during a transaction or since a specific - * savepoint that is in progress. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after canceling the pending changes. - * - * @param string name of a savepoint to rollback to - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function rollback($savepoint = null) - { - $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'rolling back transactions is not supported', __FUNCTION__); - } - - // }}} - // {{{ function inTransaction($ignore_nested = false) - - /** - * If a transaction is currently open. - * - * @param bool if the nested transaction count should be ignored - * @return int|bool - an integer with the nesting depth is returned if a - * nested transaction is open - * - true is returned for a normal open transaction - * - false is returned if no transaction is open - * - * @access public - */ - function inTransaction($ignore_nested = false) - { - if (!$ignore_nested && isset($this->nested_transaction_counter)) { - return $this->nested_transaction_counter; - } - return $this->in_transaction; - } - - // }}} - // {{{ function setTransactionIsolation($isolation) - - /** - * Set the transacton isolation level. - * - * @param string standard isolation level - * READ UNCOMMITTED (allows dirty reads) - * READ COMMITTED (prevents dirty reads) - * REPEATABLE READ (prevents nonrepeatable reads) - * SERIALIZABLE (prevents phantom reads) - * @param array some transaction options: - * 'wait' => 'WAIT' | 'NO WAIT' - * 'rw' => 'READ WRITE' | 'READ ONLY' - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function setTransactionIsolation($isolation, $options = array()) - { - $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'isolation level setting is not supported', __FUNCTION__); - } - - // }}} - // {{{ function beginNestedTransaction($savepoint = false) - - /** - * Start a nested transaction. - * - * @return mixed MDB2_OK on success/savepoint name, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function beginNestedTransaction() - { - if ($this->in_transaction) { - ++$this->nested_transaction_counter; - $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter); - if ($this->supports('savepoints') && $savepoint) { - return $this->beginTransaction($savepoint); - } - return MDB2_OK; - } - $this->has_transaction_error = false; - $result = $this->beginTransaction(); - $this->nested_transaction_counter = 1; - return $result; - } - - // }}} - // {{{ function completeNestedTransaction($force_rollback = false, $release = false) - - /** - * Finish a nested transaction by rolling back if an error occured or - * committing otherwise. - * - * @param bool if the transaction should be rolled back regardless - * even if no error was set within the nested transaction - * @return mixed MDB_OK on commit/counter decrementing, false on rollback - * and a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function completeNestedTransaction($force_rollback = false) - { - if ($this->nested_transaction_counter > 1) { - $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter); - if ($this->supports('savepoints') && $savepoint) { - if ($force_rollback || $this->has_transaction_error) { - $result = $this->rollback($savepoint); - if (!MDB2::isError($result)) { - $result = false; - $this->has_transaction_error = false; - } - } else { - $result = $this->commit($savepoint); - } - } else { - $result = MDB2_OK; - } - --$this->nested_transaction_counter; - return $result; - } - - $this->nested_transaction_counter = null; - $result = MDB2_OK; - - // transaction has not yet been rolled back - if ($this->in_transaction) { - if ($force_rollback || $this->has_transaction_error) { - $result = $this->rollback(); - if (!MDB2::isError($result)) { - $result = false; - } - } else { - $result = $this->commit(); - } - } - $this->has_transaction_error = false; - return $result; - } - - // }}} - // {{{ function failNestedTransaction($error = null, $immediately = false) - - /** - * Force setting nested transaction to failed. - * - * @param mixed value to return in getNestededTransactionError() - * @param bool if the transaction should be rolled back immediately - * @return bool MDB2_OK - * - * @access public - * @since 2.1.1 - */ - function failNestedTransaction($error = null, $immediately = false) - { - if (null !== $error) { - $error = $this->has_transaction_error ? $this->has_transaction_error : true; - } elseif (!$error) { - $error = true; - } - $this->has_transaction_error = $error; - if (!$immediately) { - return MDB2_OK; - } - return $this->rollback(); - } - - // }}} - // {{{ function getNestedTransactionError() - - /** - * The first error that occured since the transaction start. - * - * @return MDB2_Error|bool MDB2 error object if an error occured or false. - * - * @access public - * @since 2.1.1 - */ - function getNestedTransactionError() - { - return $this->has_transaction_error; - } - - // }}} - // {{{ connect() - - /** - * Connect to the database - * - * @return true on success, MDB2 Error Object on failure - */ - function connect() - { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ databaseExists() - - /** - * check if given database name is exists? - * - * @param string $name name of the database that should be checked - * - * @return mixed true/false on success, a MDB2 error on failure - * @access public - */ - function databaseExists($name) - { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ setCharset($charset, $connection = null) - - /** - * Set the charset on the current connection - * - * @param string charset - * @param resource connection handle - * - * @return true on success, MDB2 Error Object on failure - */ - function setCharset($charset, $connection = null) - { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function disconnect($force = true) - - /** - * Log out and disconnect from the database. - * - * @param boolean $force whether the disconnect should be forced even if the - * connection is opened persistently - * - * @return mixed true on success, false if not connected and error object on error - * - * @access public - */ - function disconnect($force = true) - { - $this->connection = 0; - $this->connected_dsn = array(); - $this->connected_database_name = ''; - $this->opened_persistent = null; - $this->connected_server_info = ''; - $this->in_transaction = null; - $this->nested_transaction_counter = null; - return MDB2_OK; - } - - // }}} - // {{{ function setDatabase($name) - - /** - * Select a different database - * - * @param string name of the database that should be selected - * - * @return string name of the database previously connected to - * - * @access public - */ - function setDatabase($name) - { - $previous_database_name = (isset($this->database_name)) ? $this->database_name : ''; - $this->database_name = $name; - if (!empty($this->connected_database_name) && ($this->connected_database_name != $this->database_name)) { - $this->disconnect(false); - } - return $previous_database_name; - } - - // }}} - // {{{ function getDatabase() - - /** - * Get the current database - * - * @return string name of the database - * - * @access public - */ - function getDatabase() - { - return $this->database_name; - } - - // }}} - // {{{ function setDSN($dsn) - - /** - * set the DSN - * - * @param mixed DSN string or array - * - * @return MDB2_OK - * - * @access public - */ - function setDSN($dsn) - { - $dsn_default = $GLOBALS['_MDB2_dsninfo_default']; - $dsn = MDB2::parseDSN($dsn); - if (array_key_exists('database', $dsn)) { - $this->database_name = $dsn['database']; - unset($dsn['database']); - } - $this->dsn = array_merge($dsn_default, $dsn); - return $this->disconnect(false); - } - - // }}} - // {{{ function getDSN($type = 'string', $hidepw = false) - - /** - * return the DSN as a string - * - * @param string format to return ("array", "string") - * @param string string to hide the password with - * - * @return mixed DSN in the chosen type - * - * @access public - */ - function getDSN($type = 'string', $hidepw = false) - { - $dsn = array_merge($GLOBALS['_MDB2_dsninfo_default'], $this->dsn); - $dsn['phptype'] = $this->phptype; - $dsn['database'] = $this->database_name; - if ($hidepw) { - $dsn['password'] = $hidepw; - } - switch ($type) { - // expand to include all possible options - case 'string': - $dsn = $dsn['phptype']. - ($dsn['dbsyntax'] ? ('('.$dsn['dbsyntax'].')') : ''). - '://'.$dsn['username'].':'. - $dsn['password'].'@'.$dsn['hostspec']. - ($dsn['port'] ? (':'.$dsn['port']) : ''). - '/'.$dsn['database']; - break; - case 'array': - default: - break; - } - return $dsn; - } - - // }}} - // {{{ _isNewLinkSet() - - /** - * Check if the 'new_link' option is set - * - * @return boolean - * - * @access protected - */ - function _isNewLinkSet() - { - return (isset($this->dsn['new_link']) - && ($this->dsn['new_link'] === true - || (is_string($this->dsn['new_link']) && preg_match('/^true$/i', $this->dsn['new_link'])) - || (is_numeric($this->dsn['new_link']) && 0 != (int)$this->dsn['new_link']) - ) - ); - } - - // }}} - // {{{ function &standaloneQuery($query, $types = null, $is_manip = false) - - /** - * execute a query as database administrator - * - * @param string the SQL query - * @param mixed array that contains the types of the columns in - * the result set - * @param bool if the query is a manipulation query - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function standaloneQuery($query, $types = null, $is_manip = false) - { - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - - $connection = $this->getConnection(); - if (MDB2::isError($connection)) { - return $connection; - } - - $result = $this->_doQuery($query, $is_manip, $connection, false); - if (MDB2::isError($result)) { - return $result; - } - - if ($is_manip) { - $affected_rows = $this->_affectedRows($connection, $result); - return $affected_rows; - } - $result = $this->_wrapResult($result, $types, true, true, $limit, $offset); - return $result; - } - - // }}} - // {{{ function _modifyQuery($query, $is_manip, $limit, $offset) - - /** - * Changes a query string for various DBMS specific reasons - * - * @param string query to modify - * @param bool if it is a DML query - * @param int limit the number of rows - * @param int start reading from given offset - * - * @return string modified query - * - * @access protected - */ - function _modifyQuery($query, $is_manip, $limit, $offset) - { - return $query; - } - - // }}} - // {{{ function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) - - /** - * Execute a query - * @param string query - * @param bool if the query is a manipulation query - * @param resource connection handle - * @param string database name - * - * @return result or error object - * - * @access protected - */ - function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) - { - $this->last_query = $query; - $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (MDB2::isError($result)) { - return $result; - } - $query = $result; - } - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $err; - } - - // }}} - // {{{ function _affectedRows($connection, $result = null) - - /** - * Returns the number of rows affected - * - * @param resource result handle - * @param resource connection handle - * - * @return mixed MDB2 Error Object or the number of rows affected - * - * @access private - */ - function _affectedRows($connection, $result = null) - { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function &exec($query) - - /** - * Execute a manipulation query to the database and return the number of affected rows - * - * @param string the SQL query - * - * @return mixed number of affected rows on success, a MDB2 error on failure - * - * @access public - */ - function exec($query) - { - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, true, $limit, $offset); - - $connection = $this->getConnection(); - if (MDB2::isError($connection)) { - return $connection; - } - - $result = $this->_doQuery($query, true, $connection, $this->database_name); - if (MDB2::isError($result)) { - return $result; - } - - $affectedRows = $this->_affectedRows($connection, $result); - return $affectedRows; - } - - // }}} - // {{{ function &query($query, $types = null, $result_class = true, $result_wrap_class = false) - - /** - * Send a query to the database and return any results - * - * @param string the SQL query - * @param mixed array that contains the types of the columns in - * the result set - * @param mixed string which specifies which result class to use - * @param mixed string which specifies which class to wrap results in - * - * @return mixed an MDB2_Result handle on success, a MDB2 error on failure - * - * @access public - */ - function query($query, $types = null, $result_class = true, $result_wrap_class = true) - { - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, false, $limit, $offset); - - $connection = $this->getConnection(); - if (MDB2::isError($connection)) { - return $connection; - } - - $result = $this->_doQuery($query, false, $connection, $this->database_name); - if (MDB2::isError($result)) { - return $result; - } - - $result = $this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset); - return $result; - } - - // }}} - // {{{ function _wrapResult($result_resource, $types = array(), $result_class = true, $result_wrap_class = false, $limit = null, $offset = null) - - /** - * wrap a result set into the correct class - * - * @param resource result handle - * @param mixed array that contains the types of the columns in - * the result set - * @param mixed string which specifies which result class to use - * @param mixed string which specifies which class to wrap results in - * @param string number of rows to select - * @param string first row to select - * - * @return mixed an MDB2_Result, a MDB2 error on failure - * - * @access protected - */ - function _wrapResult($result_resource, $types = array(), $result_class = true, - $result_wrap_class = true, $limit = null, $offset = null) - { - if ($types === true) { - if ($this->supports('result_introspection')) { - $this->loadModule('Reverse', null, true); - $tableInfo = $this->reverse->tableInfo($result_resource); - if (MDB2::isError($tableInfo)) { - return $tableInfo; - } - $types = array(); - $types_assoc = array(); - foreach ($tableInfo as $field) { - $types[] = $field['mdb2type']; - $types_assoc[$field['name']] = $field['mdb2type']; - } - } else { - $types = null; - } - } - - if ($result_class === true) { - $result_class = $this->options['result_buffering'] - ? $this->options['buffered_result_class'] : $this->options['result_class']; - } - - if ($result_class) { - $class_name = sprintf($result_class, $this->phptype); - if (!MDB2::classExists($class_name)) { - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'result class does not exist '.$class_name, __FUNCTION__); - return $err; - } - $result = new $class_name($this, $result_resource, $limit, $offset); - if (!MDB2::isResultCommon($result)) { - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'result class is not extended from MDB2_Result_Common', __FUNCTION__); - return $err; - } - - if (!empty($types)) { - $err = $result->setResultTypes($types); - if (MDB2::isError($err)) { - $result->free(); - return $err; - } - } - if (!empty($types_assoc)) { - $err = $result->setResultTypes($types_assoc); - if (MDB2::isError($err)) { - $result->free(); - return $err; - } - } - - if ($result_wrap_class === true) { - $result_wrap_class = $this->options['result_wrap_class']; - } - if ($result_wrap_class) { - if (!MDB2::classExists($result_wrap_class)) { - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'result wrap class does not exist '.$result_wrap_class, __FUNCTION__); - return $err; - } - $result = new $result_wrap_class($result, $this->fetchmode); - } - - return $result; - } - - return $result_resource; - } - - // }}} - // {{{ function getServerVersion($native = false) - - /** - * return version information about the server - * - * @param bool determines if the raw version string should be returned - * - * @return mixed array with version information or row string - * - * @access public - */ - function getServerVersion($native = false) - { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function setLimit($limit, $offset = null) - - /** - * set the range of the next query - * - * @param string number of rows to select - * @param string first row to select - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function setLimit($limit, $offset = null) - { - if (!$this->supports('limit_queries')) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'limit is not supported by this driver', __FUNCTION__); - } - $limit = (int)$limit; - if ($limit < 0) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null, - 'it was not specified a valid selected range row limit', __FUNCTION__); - } - $this->limit = $limit; - if (null !== $offset) { - $offset = (int)$offset; - if ($offset < 0) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null, - 'it was not specified a valid first selected range row', __FUNCTION__); - } - $this->offset = $offset; - } - return MDB2_OK; - } - - // }}} - // {{{ function subSelect($query, $type = false) - - /** - * simple subselect emulation: leaves the query untouched for all RDBMS - * that support subselects - * - * @param string the SQL query for the subselect that may only - * return a column - * @param string determines type of the field - * - * @return string the query - * - * @access public - */ - function subSelect($query, $type = false) - { - if ($this->supports('sub_selects') === true) { - return $query; - } - - if (!$this->supports('sub_selects')) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - $col = $this->queryCol($query, $type); - if (MDB2::isError($col)) { - return $col; - } - if (!is_array($col) || count($col) == 0) { - return 'NULL'; - } - if ($type) { - $this->loadModule('Datatype', null, true); - return $this->datatype->implodeArray($col, $type); - } - return implode(', ', $col); - } - - // }}} - // {{{ function replace($table, $fields) - - /** - * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT - * query, except that if there is already a row in the table with the same - * key field values, the old row is deleted before the new row is inserted. - * - * The REPLACE type of query does not make part of the SQL standards. Since - * practically only MySQL and SQLite implement it natively, this type of - * query isemulated through this method for other DBMS using standard types - * of queries inside a transaction to assure the atomicity of the operation. - * - * @param string name of the table on which the REPLACE query will - * be executed. - * @param array associative array that describes the fields and the - * values that will be inserted or updated in the specified table. The - * indexes of the array are the names of all the fields of the table. - * The values of the array are also associative arrays that describe - * the values and other properties of the table fields. - * - * Here follows a list of field properties that need to be specified: - * - * value - * Value to be assigned to the specified field. This value may be - * of specified in database independent type format as this - * function can perform the necessary datatype conversions. - * - * Default: this property is required unless the Null property is - * set to 1. - * - * type - * Name of the type of the field. Currently, all types MDB2 - * are supported except for clob and blob. - * - * Default: no type conversion - * - * null - * bool property that indicates that the value for this field - * should be set to null. - * - * The default value for fields missing in INSERT queries may be - * specified the definition of a table. Often, the default value - * is already null, but since the REPLACE may be emulated using - * an UPDATE query, make sure that all fields of the table are - * listed in this function argument array. - * - * Default: 0 - * - * key - * bool property that indicates that this field should be - * handled as a primary key or at least as part of the compound - * unique index of the table that will determine the row that will - * updated if it exists or inserted a new row otherwise. - * - * This function will fail if no key field is specified or if the - * value of a key field is set to null because fields that are - * part of unique index they may not be null. - * - * Default: 0 - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function replace($table, $fields) - { - if (!$this->supports('replace')) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'replace query is not supported', __FUNCTION__); - } - $count = count($fields); - $condition = $values = array(); - for ($colnum = 0, reset($fields); $colnum < $count; next($fields), $colnum++) { - $name = key($fields); - if (isset($fields[$name]['null']) && $fields[$name]['null']) { - $value = 'NULL'; - } else { - $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null; - $value = $this->quote($fields[$name]['value'], $type); - } - $values[$name] = $value; - if (isset($fields[$name]['key']) && $fields[$name]['key']) { - if ($value === 'NULL') { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'key value '.$name.' may not be NULL', __FUNCTION__); - } - $condition[] = $this->quoteIdentifier($name, true) . '=' . $value; - } - } - if (empty($condition)) { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'not specified which fields are keys', __FUNCTION__); - } - - $result = null; - $in_transaction = $this->in_transaction; - if (!$in_transaction && MDB2::isError($result = $this->beginTransaction())) { - return $result; - } - - $connection = $this->getConnection(); - if (MDB2::isError($connection)) { - return $connection; - } - - $condition = ' WHERE '.implode(' AND ', $condition); - $query = 'DELETE FROM ' . $this->quoteIdentifier($table, true) . $condition; - $result = $this->_doQuery($query, true, $connection); - if (!MDB2::isError($result)) { - $affected_rows = $this->_affectedRows($connection, $result); - $insert = ''; - foreach ($values as $key => $value) { - $insert .= ($insert?', ':'') . $this->quoteIdentifier($key, true); - } - $values = implode(', ', $values); - $query = 'INSERT INTO '. $this->quoteIdentifier($table, true) . "($insert) VALUES ($values)"; - $result = $this->_doQuery($query, true, $connection); - if (!MDB2::isError($result)) { - $affected_rows += $this->_affectedRows($connection, $result);; - } - } - - if (!$in_transaction) { - if (MDB2::isError($result)) { - $this->rollback(); - } else { - $result = $this->commit(); - } - } - - if (MDB2::isError($result)) { - return $result; - } - - return $affected_rows; - } - - // }}} - // {{{ function &prepare($query, $types = null, $result_types = null, $lobs = array()) - - /** - * Prepares a query for multiple execution with execute(). - * With some database backends, this is emulated. - * prepare() requires a generic query as string like - * 'INSERT INTO numbers VALUES(?,?)' or - * 'INSERT INTO numbers VALUES(:foo,:bar)'. - * The ? and :name and are placeholders which can be set using - * bindParam() and the query can be sent off using the execute() method. - * The allowed format for :name can be set with the 'bindname_format' option. - * - * @param string the query to prepare - * @param mixed array that contains the types of the placeholders - * @param mixed array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * @param mixed key (field) value (parameter) pair for all lob placeholders - * - * @return mixed resource handle for the prepared query on success, - * a MDB2 error on failure - * - * @access public - * @see bindParam, execute - */ - function prepare($query, $types = null, $result_types = null, $lobs = array()) - { - $is_manip = ($result_types === MDB2_PREPARE_MANIP); - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (MDB2::isError($result)) { - return $result; - } - $query = $result; - } - $placeholder_type_guess = $placeholder_type = null; - $question = '?'; - $colon = ':'; - $positions = array(); - $position = 0; - while ($position < strlen($query)) { - $q_position = strpos($query, $question, $position); - $c_position = strpos($query, $colon, $position); - if ($q_position && $c_position) { - $p_position = min($q_position, $c_position); - } elseif ($q_position) { - $p_position = $q_position; - } elseif ($c_position) { - $p_position = $c_position; - } else { - break; - } - if (null === $placeholder_type) { - $placeholder_type_guess = $query[$p_position]; - } - - $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); - if (MDB2::isError($new_pos)) { - return $new_pos; - } - if ($new_pos != $position) { - $position = $new_pos; - continue; //evaluate again starting from the new position - } - - if ($query[$position] == $placeholder_type_guess) { - if (null === $placeholder_type) { - $placeholder_type = $query[$p_position]; - $question = $colon = $placeholder_type; - if (!empty($types) && is_array($types)) { - if ($placeholder_type == ':') { - if (is_int(key($types))) { - $types_tmp = $types; - $types = array(); - $count = -1; - } - } else { - $types = array_values($types); - } - } - } - if ($placeholder_type == ':') { - $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; - $parameter = preg_replace($regexp, '\\1', $query); - if ($parameter === '') { - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null, - 'named parameter name must match "bindname_format" option', __FUNCTION__); - return $err; - } - $positions[$p_position] = $parameter; - $query = substr_replace($query, '?', $position, strlen($parameter)+1); - // use parameter name in type array - if (isset($count) && isset($types_tmp[++$count])) { - $types[$parameter] = $types_tmp[$count]; - } - } else { - $positions[$p_position] = count($positions); - } - $position = $p_position + 1; - } else { - $position = $p_position; - } - } - $class_name = 'MDB2_Statement_'.$this->phptype; - $statement = null; - $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); - $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); - return $obj; - } - - // }}} - // {{{ function _skipDelimitedStrings($query, $position, $p_position) - - /** - * Utility method, used by prepare() to avoid replacing placeholders within delimited strings. - * Check if the placeholder is contained within a delimited string. - * If so, skip it and advance the position, otherwise return the current position, - * which is valid - * - * @param string $query - * @param integer $position current string cursor position - * @param integer $p_position placeholder position - * - * @return mixed integer $new_position on success - * MDB2_Error on failure - * - * @access protected - */ - function _skipDelimitedStrings($query, $position, $p_position) - { - $ignores = array(); - $ignores[] = $this->string_quoting; - $ignores[] = $this->identifier_quoting; - $ignores = array_merge($ignores, $this->sql_comments); - - foreach ($ignores as $ignore) { - if (!empty($ignore['start'])) { - if (is_int($start_quote = strpos($query, $ignore['start'], $position)) && $start_quote < $p_position) { - $end_quote = $start_quote; - do { - if (!is_int($end_quote = strpos($query, $ignore['end'], $end_quote + 1))) { - if ($ignore['end'] === "\n") { - $end_quote = strlen($query) - 1; - } else { - $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null, - 'query with an unterminated text string specified', __FUNCTION__); - return $err; - } - } - } while ($ignore['escape'] - && $end_quote-1 != $start_quote - && $query[($end_quote - 1)] == $ignore['escape'] - && ( $ignore['escape_pattern'] !== $ignore['escape'] - || $query[($end_quote - 2)] != $ignore['escape']) - ); - - $position = $end_quote + 1; - return $position; - } - } - } - return $position; - } - - // }}} - // {{{ function quote($value, $type = null, $quote = true) - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string text string value that is intended to be converted. - * @param string type to which the value should be converted to - * @param bool quote - * @param bool escape wildcards - * - * @return string text string that represents the given argument value in - * a DBMS specific format. - * - * @access public - */ - function quote($value, $type = null, $quote = true, $escape_wildcards = false) - { - $result = $this->loadModule('Datatype', null, true); - if (MDB2::isError($result)) { - return $result; - } - - return $this->datatype->quote($value, $type, $quote, $escape_wildcards); - } - - // }}} - // {{{ function getDeclaration($type, $name, $field) - - /** - * Obtain DBMS specific SQL code portion needed to declare - * of the given type - * - * @param string type to which the value should be converted to - * @param string name the field to be declared. - * @param string definition of the field - * - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * - * @access public - */ - function getDeclaration($type, $name, $field) - { - $result = $this->loadModule('Datatype', null, true); - if (MDB2::isError($result)) { - return $result; - } - return $this->datatype->getDeclaration($type, $name, $field); - } - - // }}} - // {{{ function compareDefinition($current, $previous) - - /** - * Obtain an array of changes that may need to applied - * - * @param array new definition - * @param array old definition - * - * @return array containing all changes that will need to be applied - * - * @access public - */ - function compareDefinition($current, $previous) - { - $result = $this->loadModule('Datatype', null, true); - if (MDB2::isError($result)) { - return $result; - } - return $this->datatype->compareDefinition($current, $previous); - } - - // }}} - // {{{ function supports($feature) - - /** - * Tell whether a DB implementation or its backend extension - * supports a given feature. - * - * @param string name of the feature (see the MDB2 class doc) - * - * @return bool|string if this DB implementation supports a given feature - * false means no, true means native, - * 'emulated' means emulated - * - * @access public - */ - function supports($feature) - { - if (array_key_exists($feature, $this->supported)) { - return $this->supported[$feature]; - } - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - "unknown support feature $feature", __FUNCTION__); - } - - // }}} - // {{{ function getSequenceName($sqn) - - /** - * adds sequence name formatting to a sequence name - * - * @param string name of the sequence - * - * @return string formatted sequence name - * - * @access public - */ - function getSequenceName($sqn) - { - return sprintf($this->options['seqname_format'], - preg_replace('/[^a-z0-9_\-\$.]/i', '_', $sqn)); - } - - // }}} - // {{{ function getIndexName($idx) - - /** - * adds index name formatting to a index name - * - * @param string name of the index - * - * @return string formatted index name - * - * @access public - */ - function getIndexName($idx) - { - return sprintf($this->options['idxname_format'], - preg_replace('/[^a-z0-9_\-\$.]/i', '_', $idx)); - } - - // }}} - // {{{ function nextID($seq_name, $ondemand = true) - - /** - * Returns the next free id of a sequence - * - * @param string name of the sequence - * @param bool when true missing sequences are automatic created - * - * @return mixed MDB2 Error Object or id - * - * @access public - */ - function nextID($seq_name, $ondemand = true) - { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function lastInsertID($table = null, $field = null) - - /** - * Returns the autoincrement ID if supported or $id or fetches the current - * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) - * - * @param string name of the table into which a new row was inserted - * @param string name of the field into which a new row was inserted - * - * @return mixed MDB2 Error Object or id - * - * @access public - */ - function lastInsertID($table = null, $field = null) - { - return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function currID($seq_name) - - /** - * Returns the current id of a sequence - * - * @param string name of the sequence - * - * @return mixed MDB2 Error Object or id - * - * @access public - */ - function currID($seq_name) - { - $this->warnings[] = 'database does not support getting current - sequence value, the sequence value was incremented'; - return $this->nextID($seq_name); - } - - // }}} - // {{{ function queryOne($query, $type = null, $colnum = 0) - - /** - * Execute the specified query, fetch the value from the first column of - * the first row of the result set and then frees - * the result set. - * - * @param string $query the SELECT query statement to be executed. - * @param string $type optional argument that specifies the expected - * datatype of the result set field, so that an eventual - * conversion may be performed. The default datatype is - * text, meaning that no conversion is performed - * @param mixed $colnum the column number (or name) to fetch - * - * @return mixed MDB2_OK or field value on success, a MDB2 error on failure - * - * @access public - */ - function queryOne($query, $type = null, $colnum = 0) - { - $result = $this->query($query, $type); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $one = $result->fetchOne($colnum); - $result->free(); - return $one; - } - - // }}} - // {{{ function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT) - - /** - * Execute the specified query, fetch the values from the first - * row of the result set into an array and then frees - * the result set. - * - * @param string the SELECT query statement to be executed. - * @param array optional array argument that specifies a list of - * expected datatypes of the result set columns, so that the eventual - * conversions may be performed. The default list of datatypes is - * empty, meaning that no conversion is performed. - * @param int how the array data should be indexed - * - * @return mixed MDB2_OK or data array on success, a MDB2 error on failure - * - * @access public - */ - function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT) - { - $result = $this->query($query, $types); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $row = $result->fetchRow($fetchmode); - $result->free(); - return $row; - } - - // }}} - // {{{ function queryCol($query, $type = null, $colnum = 0) - - /** - * Execute the specified query, fetch the value from the first column of - * each row of the result set into an array and then frees the result set. - * - * @param string $query the SELECT query statement to be executed. - * @param string $type optional argument that specifies the expected - * datatype of the result set field, so that an eventual - * conversion may be performed. The default datatype is text, - * meaning that no conversion is performed - * @param mixed $colnum the column number (or name) to fetch - * - * @return mixed MDB2_OK or data array on success, a MDB2 error on failure - * @access public - */ - function queryCol($query, $type = null, $colnum = 0) - { - $result = $this->query($query, $type); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $col = $result->fetchCol($colnum); - $result->free(); - return $col; - } - - // }}} - // {{{ function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false) - - /** - * Execute the specified query, fetch all the rows of the result set into - * a two dimensional array and then frees the result set. - * - * @param string the SELECT query statement to be executed. - * @param array optional array argument that specifies a list of - * expected datatypes of the result set columns, so that the eventual - * conversions may be performed. The default list of datatypes is - * empty, meaning that no conversion is performed. - * @param int how the array data should be indexed - * @param bool if set to true, the $all will have the first - * column as its first dimension - * @param bool used only when the query returns exactly - * two columns. If true, the values of the returned array will be - * one-element arrays instead of scalars. - * @param bool if true, the values of the returned array is - * wrapped in another array. If the same key value (in the first - * column) repeats itself, the values will be appended to this array - * instead of overwriting the existing values. - * - * @return mixed MDB2_OK or data array on success, a MDB2 error on failure - * - * @access public - */ - function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, - $rekey = false, $force_array = false, $group = false) - { - $result = $this->query($query, $types); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group); - $result->free(); - return $all; - } - - // }}} - // {{{ function delExpect($error_code) - - /** - * This method deletes all occurences of the specified element from - * the expected error codes stack. - * - * @param mixed $error_code error code that should be deleted - * @return mixed list of error codes that were deleted or error - * - * @uses PEAR::delExpect() - */ - public function delExpect($error_code) - { - return $this->pear->delExpect($error_code); - } - - // }}} - // {{{ function expectError($code) - - /** - * This method is used to tell which errors you expect to get. - * Expected errors are always returned with error mode - * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, - * and this method pushes a new element onto it. The list of - * expected errors are in effect until they are popped off the - * stack with the popExpect() method. - * - * Note that this method can not be called statically - * - * @param mixed $code a single error code or an array of error codes to expect - * - * @return int the new depth of the "expected errors" stack - * - * @uses PEAR::expectError() - */ - public function expectError($code = '*') - { - return $this->pear->expectError($code); - } - - // }}} - // {{{ function getStaticProperty($class, $var) - - /** - * If you have a class that's mostly/entirely static, and you need static - * properties, you can use this method to simulate them. Eg. in your method(s) - * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); - * You MUST use a reference, or they will not persist! - * - * @param string $class The calling classname, to prevent clashes - * @param string $var The variable to retrieve. - * @return mixed A reference to the variable. If not set it will be - * auto initialised to NULL. - * - * @uses PEAR::getStaticProperty() - */ - public function &getStaticProperty($class, $var) - { - $tmp = $this->pear->getStaticProperty($class, $var); - return $tmp; - } - - // }}} - // {{{ function loadExtension($ext) - - /** - * OS independant PHP extension load. Remember to take care - * on the correct extension name for case sensitive OSes. - * - * @param string $ext The extension name - * @return bool Success or not on the dl() call - * - * @uses PEAR::loadExtension() - */ - public function loadExtension($ext) - { - return $this->pear->loadExtension($ext); - } - - // }}} - // {{{ function popErrorHandling() - - /** - * Pop the last error handler used - * - * @return bool Always true - * - * @see PEAR::pushErrorHandling - * @uses PEAR::popErrorHandling() - */ - public function popErrorHandling() - { - return $this->pear->popErrorHandling(); - } - - // }}} - // {{{ function popExpect() - - /** - * This method pops one element off the expected error codes - * stack. - * - * @return array the list of error codes that were popped - * - * @uses PEAR::popExpect() - */ - public function popExpect() - { - return $this->pear->popExpect(); - } - - // }}} - // {{{ function pushErrorHandling($mode, $options = null) - - /** - * Push a new error handler on top of the error handler options stack. With this - * you can easily override the actual error handler for some code and restore - * it later with popErrorHandling. - * - * @param mixed $mode (same as setErrorHandling) - * @param mixed $options (same as setErrorHandling) - * - * @return bool Always true - * - * @see PEAR::setErrorHandling - * @uses PEAR::pushErrorHandling() - */ - public function pushErrorHandling($mode, $options = null) - { - return $this->pear->pushErrorHandling($mode, $options); - } - - // }}} - // {{{ function registerShutdownFunc($func, $args = array()) - - /** - * Use this function to register a shutdown method for static - * classes. - * - * @param mixed $func The function name (or array of class/method) to call - * @param mixed $args The arguments to pass to the function - * @return void - * - * @uses PEAR::registerShutdownFunc() - */ - public function registerShutdownFunc($func, $args = array()) - { - return $this->pear->registerShutdownFunc($func, $args); - } - - // }}} - // {{{ function setErrorHandling($mode = null, $options = null) - - /** - * Sets how errors generated by this object should be handled. - * Can be invoked both in objects and statically. If called - * statically, setErrorHandling sets the default behaviour for all - * PEAR objects. If called in an object, setErrorHandling sets - * the default behaviour for that object. - * - * @param int $mode - * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. - * - * @param mixed $options - * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one - * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * - * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is the object, and the element at index 1 is - * the name of the method to call in the object. - * - * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is - * a printf format string used when printing the error - * message. - * - * @access public - * @return void - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - * @see PEAR_ERROR_EXCEPTION - * - * @since PHP 4.0.5 - * @uses PEAR::setErrorHandling($mode, $options) - */ - public function setErrorHandling($mode = null, $options = null) - { - return $this->pear->setErrorHandling($mode, $options); - } - - /** - * @uses PEAR::staticPopErrorHandling() - */ - public function staticPopErrorHandling() - { - return $this->pear->staticPopErrorHandling(); - } - - // }}} - // {{{ function staticPushErrorHandling($mode, $options = null) - - /** - * @uses PEAR::staticPushErrorHandling($mode, $options) - */ - public function staticPushErrorHandling($mode, $options = null) - { - return $this->pear->staticPushErrorHandling($mode, $options); - } - - // }}} - // {{{ function &throwError($message = null, $code = null, $userinfo = null) - - /** - * Simpler form of raiseError with fewer options. In most cases - * message, code and userinfo are enough. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @return object a PEAR error object - * @see PEAR::raiseError - * @uses PEAR::&throwError() - */ - public function &throwError($message = null, $code = null, $userinfo = null) - { - $tmp = $this->pear->throwError($message, $code, $userinfo); - return $tmp; - } - - // }}} -} - -// }}} -// {{{ class MDB2_Result - -/** - * The dummy class that all user space result classes should extend from - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Result -{ -} - -// }}} -// {{{ class MDB2_Result_Common extends MDB2_Result - -/** - * The common result class for MDB2 result objects - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Result_Common extends MDB2_Result -{ - // {{{ Variables (Properties) - - public $db; - public $result; - public $rownum = -1; - public $types = array(); - public $types_assoc = array(); - public $values = array(); - public $offset; - public $offset_count = 0; - public $limit; - public $column_names; - - // }}} - // {{{ constructor: function __construct($db, &$result, $limit = 0, $offset = 0) - - /** - * Constructor - */ - function __construct($db, &$result, $limit = 0, $offset = 0) - { - $this->db = $db; - $this->result = $result; - $this->offset = $offset; - $this->limit = max(0, $limit - 1); - } - - // }}} - // {{{ function setResultTypes($types) - - /** - * Define the list of types to be associated with the columns of a given - * result set. - * - * This function may be called before invoking fetchRow(), fetchOne(), - * fetchCol() and fetchAll() so that the necessary data type - * conversions are performed on the data to be retrieved by them. If this - * function is not called, the type of all result set columns is assumed - * to be text, thus leading to not perform any conversions. - * - * @param array variable that lists the - * data types to be expected in the result set columns. If this array - * contains less types than the number of columns that are returned - * in the result set, the remaining columns are assumed to be of the - * type text. Currently, the types clob and blob are not fully - * supported. - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function setResultTypes($types) - { - $load = $this->db->loadModule('Datatype', null, true); - if (MDB2::isError($load)) { - return $load; - } - $types = $this->db->datatype->checkResultTypes($types); - if (MDB2::isError($types)) { - return $types; - } - foreach ($types as $key => $value) { - if (is_numeric($key)) { - $this->types[$key] = $value; - } else { - $this->types_assoc[$key] = $value; - } - } - return MDB2_OK; - } - - // }}} - // {{{ function seek($rownum = 0) - - /** - * Seek to a specific row in a result set - * - * @param int number of the row where the data can be found - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function seek($rownum = 0) - { - $target_rownum = $rownum - 1; - if ($this->rownum > $target_rownum) { - return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'seeking to previous rows not implemented', __FUNCTION__); - } - while ($this->rownum < $target_rownum) { - $this->fetchRow(); - } - return MDB2_OK; - } - - // }}} - // {{{ function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - - /** - * Fetch and return a row of data - * - * @param int how the array data should be indexed - * @param int number of the row where the data can be found - * - * @return int data array on success, a MDB2 error on failure - * - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - $err = MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $err; - } - - // }}} - // {{{ function fetchOne($colnum = 0) - - /** - * fetch single column from the next row from a result set - * - * @param int|string the column number (or name) to fetch - * @param int number of the row where the data can be found - * - * @return string data on success, a MDB2 error on failure - * @access public - */ - function fetchOne($colnum = 0, $rownum = null) - { - $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC; - $row = $this->fetchRow($fetchmode, $rownum); - if (!is_array($row) || MDB2::isError($row)) { - return $row; - } - if (!array_key_exists($colnum, $row)) { - return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null, - 'column is not defined in the result set: '.$colnum, __FUNCTION__); - } - return $row[$colnum]; - } - - // }}} - // {{{ function fetchCol($colnum = 0) - - /** - * Fetch and return a column from the current row pointer position - * - * @param int|string the column number (or name) to fetch - * - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function fetchCol($colnum = 0) - { - $column = array(); - $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC; - $row = $this->fetchRow($fetchmode); - if (is_array($row)) { - if (!array_key_exists($colnum, $row)) { - return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null, - 'column is not defined in the result set: '.$colnum, __FUNCTION__); - } - do { - $column[] = $row[$colnum]; - } while (is_array($row = $this->fetchRow($fetchmode))); - } - if (MDB2::isError($row)) { - return $row; - } - return $column; - } - - // }}} - // {{{ function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false) - - /** - * Fetch and return all rows from the current row pointer position - * - * @param int $fetchmode the fetch mode to use: - * + MDB2_FETCHMODE_ORDERED - * + MDB2_FETCHMODE_ASSOC - * + MDB2_FETCHMODE_ORDERED | MDB2_FETCHMODE_FLIPPED - * + MDB2_FETCHMODE_ASSOC | MDB2_FETCHMODE_FLIPPED - * @param bool if set to true, the $all will have the first - * column as its first dimension - * @param bool used only when the query returns exactly - * two columns. If true, the values of the returned array will be - * one-element arrays instead of scalars. - * @param bool if true, the values of the returned array is - * wrapped in another array. If the same key value (in the first - * column) repeats itself, the values will be appended to this array - * instead of overwriting the existing values. - * - * @return mixed data array on success, a MDB2 error on failure - * - * @access public - * @see getAssoc() - */ - function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, - $force_array = false, $group = false) - { - $all = array(); - $row = $this->fetchRow($fetchmode); - if (MDB2::isError($row)) { - return $row; - } elseif (!$row) { - return $all; - } - - $shift_array = $rekey ? false : null; - if (null !== $shift_array) { - if (is_object($row)) { - $colnum = count(get_object_vars($row)); - } else { - $colnum = count($row); - } - if ($colnum < 2) { - return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null, - 'rekey feature requires atleast 2 column', __FUNCTION__); - } - $shift_array = (!$force_array && $colnum == 2); - } - - if ($rekey) { - do { - if (is_object($row)) { - $arr = get_object_vars($row); - $key = reset($arr); - unset($row->{$key}); - } else { - if ( $fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT - ) { - $key = reset($row); - unset($row[key($row)]); - } else { - $key = array_shift($row); - } - if ($shift_array) { - $row = array_shift($row); - } - } - if ($group) { - $all[$key][] = $row; - } else { - $all[$key] = $row; - } - } while (($row = $this->fetchRow($fetchmode))); - } elseif ($fetchmode == MDB2_FETCHMODE_FLIPPED) { - do { - foreach ($row as $key => $val) { - $all[$key][] = $val; - } - } while (($row = $this->fetchRow($fetchmode))); - } else { - do { - $all[] = $row; - } while (($row = $this->fetchRow($fetchmode))); - } - - return $all; - } - - // }}} - // {{{ function rowCount() - /** - * Returns the actual row number that was last fetched (count from 0) - * @return int - * - * @access public - */ - function rowCount() - { - return $this->rownum + 1; - } - - // }}} - // {{{ function numRows() - - /** - * Returns the number of rows in a result object - * - * @return mixed MDB2 Error Object or the number of rows - * - * @access public - */ - function numRows() - { - return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function nextResult() - - /** - * Move the internal result pointer to the next available result - * - * @return true on success, false if there is no more result set or an error object on failure - * - * @access public - */ - function nextResult() - { - return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result or - * from the cache. - * - * @param bool If set to true the values are the column names, - * otherwise the names of the columns are the keys. - * @return mixed Array variable that holds the names of columns or an - * MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * - * @access public - */ - function getColumnNames($flip = false) - { - if (!isset($this->column_names)) { - $result = $this->_getColumnNames(); - if (MDB2::isError($result)) { - return $result; - } - $this->column_names = $result; - } - if ($flip) { - return array_flip($this->column_names); - } - return $this->column_names; - } - - // }}} - // {{{ function _getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result. - * - * @return mixed Array variable that holds the names of columns as keys - * or an MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * - * @access private - */ - function _getColumnNames() - { - return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function numCols() - - /** - * Count the number of columns returned by the DBMS in a query result. - * - * @return mixed integer value with the number of columns, a MDB2 error - * on failure - * - * @access public - */ - function numCols() - { - return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ function getResource() - - /** - * return the resource associated with the result object - * - * @return resource - * - * @access public - */ - function getResource() - { - return $this->result; - } - - // }}} - // {{{ function bindColumn($column, &$value, $type = null) - - /** - * Set bind variable to a column. - * - * @param int column number or name - * @param mixed variable reference - * @param string specifies the type of the field - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function bindColumn($column, &$value, $type = null) - { - if (!is_numeric($column)) { - $column_names = $this->getColumnNames(); - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($this->db->options['field_case'] == CASE_LOWER) { - $column = strtolower($column); - } else { - $column = strtoupper($column); - } - } - $column = $column_names[$column]; - } - $this->values[$column] =& $value; - if (null !== $type) { - $this->types[$column] = $type; - } - return MDB2_OK; - } - - // }}} - // {{{ function _assignBindColumns($row) - - /** - * Bind a variable to a value in the result row. - * - * @param array row data - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access private - */ - function _assignBindColumns($row) - { - $row = array_values($row); - foreach ($row as $column => $value) { - if (array_key_exists($column, $this->values)) { - $this->values[$column] = $value; - } - } - return MDB2_OK; - } - - // }}} - // {{{ function free() - - /** - * Free the internal resources associated with result. - * - * @return bool true on success, false if result is invalid - * - * @access public - */ - function free() - { - $this->result = false; - return MDB2_OK; - } - - // }}} -} - -// }}} -// {{{ class MDB2_Row - -/** - * The simple class that accepts row data as an array - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Row -{ - // {{{ constructor: function __construct(&$row) - - /** - * constructor - * - * @param resource row data as array - */ - function __construct(&$row) - { - foreach ($row as $key => $value) { - $this->$key = &$row[$key]; - } - } - - // }}} -} - -// }}} -// {{{ class MDB2_Statement_Common - -/** - * The common statement class for MDB2 statement objects - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Statement_Common -{ - // {{{ Variables (Properties) - - var $db; - var $statement; - var $query; - var $result_types; - var $types; - var $values = array(); - var $limit; - var $offset; - var $is_manip; - - // }}} - // {{{ constructor: function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null) - - /** - * Constructor - */ - function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null) - { - $this->db = $db; - $this->statement = $statement; - $this->positions = $positions; - $this->query = $query; - $this->types = (array)$types; - $this->result_types = (array)$result_types; - $this->limit = $limit; - $this->is_manip = $is_manip; - $this->offset = $offset; - } - - // }}} - // {{{ function bindValue($parameter, &$value, $type = null) - - /** - * Set the value of a parameter of a prepared query. - * - * @param int the order number of the parameter in the query - * statement. The order number of the first parameter is 1. - * @param mixed value that is meant to be assigned to specified - * parameter. The type of the value depends on the $type argument. - * @param string specifies the type of the field - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function bindValue($parameter, $value, $type = null) - { - if (!is_numeric($parameter)) { - if (strpos($parameter, ':') === 0) { - $parameter = substr($parameter, 1); - } - } - if (!in_array($parameter, $this->positions)) { - return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $this->values[$parameter] = $value; - if (null !== $type) { - $this->types[$parameter] = $type; - } - return MDB2_OK; - } - - // }}} - // {{{ function bindValueArray($values, $types = null) - - /** - * Set the values of multiple a parameter of a prepared query in bulk. - * - * @param array specifies all necessary information - * for bindValue() the array elements must use keys corresponding to - * the number of the position of the parameter. - * @param array specifies the types of the fields - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @see bindParam() - */ - function bindValueArray($values, $types = null) - { - $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null); - $parameters = array_keys($values); - $this->db->pushErrorHandling(PEAR_ERROR_RETURN); - $this->db->expectError(MDB2_ERROR_NOT_FOUND); - foreach ($parameters as $key => $parameter) { - $err = $this->bindValue($parameter, $values[$parameter], $types[$key]); - if (MDB2::isError($err)) { - if ($err->getCode() == MDB2_ERROR_NOT_FOUND) { - //ignore (extra value for missing placeholder) - continue; - } - $this->db->popExpect(); - $this->db->popErrorHandling(); - return $err; - } - } - $this->db->popExpect(); - $this->db->popErrorHandling(); - return MDB2_OK; - } - - // }}} - // {{{ function bindParam($parameter, &$value, $type = null) - - /** - * Bind a variable to a parameter of a prepared query. - * - * @param int the order number of the parameter in the query - * statement. The order number of the first parameter is 1. - * @param mixed variable that is meant to be bound to specified - * parameter. The type of the value depends on the $type argument. - * @param string specifies the type of the field - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function bindParam($parameter, &$value, $type = null) - { - if (!is_numeric($parameter)) { - if (strpos($parameter, ':') === 0) { - $parameter = substr($parameter, 1); - } - } - if (!in_array($parameter, $this->positions)) { - return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $this->values[$parameter] =& $value; - if (null !== $type) { - $this->types[$parameter] = $type; - } - return MDB2_OK; - } - - // }}} - // {{{ function bindParamArray(&$values, $types = null) - - /** - * Bind the variables of multiple a parameter of a prepared query in bulk. - * - * @param array specifies all necessary information - * for bindParam() the array elements must use keys corresponding to - * the number of the position of the parameter. - * @param array specifies the types of the fields - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @see bindParam() - */ - function bindParamArray(&$values, $types = null) - { - $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null); - $parameters = array_keys($values); - foreach ($parameters as $key => $parameter) { - $err = $this->bindParam($parameter, $values[$parameter], $types[$key]); - if (MDB2::isError($err)) { - return $err; - } - } - return MDB2_OK; - } - - // }}} - // {{{ function &execute($values = null, $result_class = true, $result_wrap_class = false) - - /** - * Execute a prepared query statement. - * - * @param array specifies all necessary information - * for bindParam() the array elements must use keys corresponding - * to the number of the position of the parameter. - * @param mixed specifies which result class to use - * @param mixed specifies which class to wrap results in - * - * @return mixed MDB2_Result or integer (affected rows) on success, - * a MDB2 error on failure - * @access public - */ - function execute($values = null, $result_class = true, $result_wrap_class = false) - { - if (null === $this->positions) { - return MDB2::raiseError(MDB2_ERROR, null, null, - 'Prepared statement has already been freed', __FUNCTION__); - } - - $values = (array)$values; - if (!empty($values)) { - $err = $this->bindValueArray($values); - if (MDB2::isError($err)) { - return MDB2::raiseError(MDB2_ERROR, null, null, - 'Binding Values failed with message: ' . $err->getMessage(), __FUNCTION__); - } - } - $result = $this->_execute($result_class, $result_wrap_class); - return $result; - } - - // }}} - // {{{ function _execute($result_class = true, $result_wrap_class = false) - - /** - * Execute a prepared query statement helper method. - * - * @param mixed specifies which result class to use - * @param mixed specifies which class to wrap results in - * - * @return mixed MDB2_Result or integer (affected rows) on success, - * a MDB2 error on failure - * @access private - */ - function _execute($result_class = true, $result_wrap_class = false) - { - $this->last_query = $this->query; - $query = ''; - $last_position = 0; - foreach ($this->positions as $current_position => $parameter) { - if (!array_key_exists($parameter, $this->values)) { - return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $value = $this->values[$parameter]; - $query.= substr($this->query, $last_position, $current_position - $last_position); - if (!isset($value)) { - $value_quoted = 'NULL'; - } else { - $type = !empty($this->types[$parameter]) ? $this->types[$parameter] : null; - $value_quoted = $this->db->quote($value, $type); - if (MDB2::isError($value_quoted)) { - return $value_quoted; - } - } - $query.= $value_quoted; - $last_position = $current_position + 1; - } - $query.= substr($this->query, $last_position); - - $this->db->offset = $this->offset; - $this->db->limit = $this->limit; - if ($this->is_manip) { - $result = $this->db->exec($query); - } else { - $result = $this->db->query($query, $this->result_types, $result_class, $result_wrap_class); - } - return $result; - } - - // }}} - // {{{ function free() - - /** - * Release resources allocated for the specified prepared query. - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function free() - { - if (null === $this->positions) { - return MDB2::raiseError(MDB2_ERROR, null, null, - 'Prepared statement has already been freed', __FUNCTION__); - } - - $this->statement = null; - $this->positions = null; - $this->query = null; - $this->types = null; - $this->result_types = null; - $this->limit = null; - $this->is_manip = null; - $this->offset = null; - $this->values = null; - - return MDB2_OK; - } - - // }}} -} - -// }}} -// {{{ class MDB2_Module_Common - -/** - * The common modules class for MDB2 module objects - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Module_Common -{ - // {{{ Variables (Properties) - - /** - * contains the key to the global MDB2 instance array of the associated - * MDB2 instance - * - * @var int - * @access protected - */ - protected $db_index; - - // }}} - // {{{ constructor: function __construct($db_index) - - /** - * Constructor - */ - function __construct($db_index) - { - $this->db_index = $db_index; - } - - // }}} - // {{{ function getDBInstance() - - /** - * Get the instance of MDB2 associated with the module instance - * - * @return object MDB2 instance or a MDB2 error on failure - * - * @access public - */ - function getDBInstance() - { - if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - $result = $GLOBALS['_MDB2_databases'][$this->db_index]; - } else { - $result = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'could not find MDB2 instance'); - } - return $result; - } - - // }}} -} - -// }}} -// {{{ function MDB2_closeOpenTransactions() - -/** - * Close any open transactions form persistent connections - * - * @return void - * - * @access public - */ - -function MDB2_closeOpenTransactions() -{ - reset($GLOBALS['_MDB2_databases']); - while (next($GLOBALS['_MDB2_databases'])) { - $key = key($GLOBALS['_MDB2_databases']); - if ($GLOBALS['_MDB2_databases'][$key]->opened_persistent - && $GLOBALS['_MDB2_databases'][$key]->in_transaction - ) { - $GLOBALS['_MDB2_databases'][$key]->rollback(); - } - } -} - -// }}} -// {{{ function MDB2_defaultDebugOutput(&$db, $scope, $message, $is_manip = null) - -/** - * default debug output handler - * - * @param object reference to an MDB2 database object - * @param string usually the method name that triggered the debug call: - * for example 'query', 'prepare', 'execute', 'parameters', - * 'beginTransaction', 'commit', 'rollback' - * @param string message that should be appended to the debug variable - * @param array contains context information about the debug() call - * common keys are: is_manip, time, result etc. - * - * @return void|string optionally return a modified message, this allows - * rewriting a query before being issued or prepared - * - * @access public - */ -function MDB2_defaultDebugOutput(&$db, $scope, $message, $context = array()) -{ - $db->debug_output.= $scope.'('.$db->db_index.'): '; - $db->debug_output.= $message.$db->getOption('log_line_break'); - return $message; -} - -// }}} -?> diff --git a/3rdparty/MDB2/Date.php b/3rdparty/MDB2/Date.php deleted file mode 100644 index ca88eaa347..0000000000 --- a/3rdparty/MDB2/Date.php +++ /dev/null @@ -1,183 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -/** - * Several methods to convert the MDB2 native timestamp format (ISO based) - * to and from data structures that are convenient to worth with in side of php. - * For more complex date arithmetic please take a look at the Date package in PEAR - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Date -{ - // {{{ mdbNow() - - /** - * return the current datetime - * - * @return string current datetime in the MDB2 format - * @access public - */ - function mdbNow() - { - return date('Y-m-d H:i:s'); - } - // }}} - - // {{{ mdbToday() - - /** - * return the current date - * - * @return string current date in the MDB2 format - * @access public - */ - function mdbToday() - { - return date('Y-m-d'); - } - // }}} - - // {{{ mdbTime() - - /** - * return the current time - * - * @return string current time in the MDB2 format - * @access public - */ - function mdbTime() - { - return date('H:i:s'); - } - // }}} - - // {{{ date2Mdbstamp() - - /** - * convert a date into a MDB2 timestamp - * - * @param int hour of the date - * @param int minute of the date - * @param int second of the date - * @param int month of the date - * @param int day of the date - * @param int year of the date - * - * @return string a valid MDB2 timestamp - * @access public - */ - function date2Mdbstamp($hour = null, $minute = null, $second = null, - $month = null, $day = null, $year = null) - { - return MDB2_Date::unix2Mdbstamp(mktime($hour, $minute, $second, $month, $day, $year, -1)); - } - // }}} - - // {{{ unix2Mdbstamp() - - /** - * convert a unix timestamp into a MDB2 timestamp - * - * @param int a valid unix timestamp - * - * @return string a valid MDB2 timestamp - * @access public - */ - function unix2Mdbstamp($unix_timestamp) - { - return date('Y-m-d H:i:s', $unix_timestamp); - } - // }}} - - // {{{ mdbstamp2Unix() - - /** - * convert a MDB2 timestamp into a unix timestamp - * - * @param int a valid MDB2 timestamp - * @return string unix timestamp with the time stored in the MDB2 format - * - * @access public - */ - function mdbstamp2Unix($mdb_timestamp) - { - $arr = MDB2_Date::mdbstamp2Date($mdb_timestamp); - - return mktime($arr['hour'], $arr['minute'], $arr['second'], $arr['month'], $arr['day'], $arr['year'], -1); - } - // }}} - - // {{{ mdbstamp2Date() - - /** - * convert a MDB2 timestamp into an array containing all - * values necessary to pass to php's date() function - * - * @param int a valid MDB2 timestamp - * - * @return array with the time split - * @access public - */ - function mdbstamp2Date($mdb_timestamp) - { - list($arr['year'], $arr['month'], $arr['day'], $arr['hour'], $arr['minute'], $arr['second']) = - sscanf($mdb_timestamp, "%04u-%02u-%02u %02u:%02u:%02u"); - return $arr; - } - // }}} -} - -?> diff --git a/3rdparty/MDB2/Driver/Datatype/Common.php b/3rdparty/MDB2/Driver/Datatype/Common.php deleted file mode 100644 index dd7f1c7e0a..0000000000 --- a/3rdparty/MDB2/Driver/Datatype/Common.php +++ /dev/null @@ -1,1842 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/LOB.php'; - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -/** - * MDB2_Driver_Common: Base class that is extended by each MDB2 driver - * - * To load this module in the MDB2 object: - * $mdb->loadModule('Datatype'); - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Datatype_Common extends MDB2_Module_Common -{ - var $valid_default_values = array( - 'text' => '', - 'boolean' => true, - 'integer' => 0, - 'decimal' => 0.0, - 'float' => 0.0, - 'timestamp' => '1970-01-01 00:00:00', - 'time' => '00:00:00', - 'date' => '1970-01-01', - 'clob' => '', - 'blob' => '', - ); - - /** - * contains all LOB objects created with this MDB2 instance - * @var array - * @access protected - */ - var $lobs = array(); - - // }}} - // {{{ getValidTypes() - - /** - * Get the list of valid types - * - * This function returns an array of valid types as keys with the values - * being possible default values for all native datatypes and mapped types - * for custom datatypes. - * - * @return mixed array on success, a MDB2 error on failure - * @access public - */ - function getValidTypes() - { - $types = $this->valid_default_values; - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (!empty($db->options['datatype_map'])) { - foreach ($db->options['datatype_map'] as $type => $mapped_type) { - if (array_key_exists($mapped_type, $types)) { - $types[$type] = $types[$mapped_type]; - } elseif (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type, 'mapped_type' => $mapped_type); - $default = call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - $types[$type] = $default; - } - } - } - return $types; - } - - // }}} - // {{{ checkResultTypes() - - /** - * Define the list of types to be associated with the columns of a given - * result set. - * - * This function may be called before invoking fetchRow(), fetchOne() - * fetchCole() and fetchAll() so that the necessary data type - * conversions are performed on the data to be retrieved by them. If this - * function is not called, the type of all result set columns is assumed - * to be text, thus leading to not perform any conversions. - * - * @param array $types array variable that lists the - * data types to be expected in the result set columns. If this array - * contains less types than the number of columns that are returned - * in the result set, the remaining columns are assumed to be of the - * type text. Currently, the types clob and blob are not fully - * supported. - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function checkResultTypes($types) - { - $types = is_array($types) ? $types : array($types); - foreach ($types as $key => $type) { - if (!isset($this->valid_default_values[$type])) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (empty($db->options['datatype_map'][$type])) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - $type.' for '.$key.' is not a supported column type', __FUNCTION__); - } - } - } - return $types; - } - - // }}} - // {{{ _baseConvertResult() - - /** - * General type conversion method - * - * @param mixed $value reference to a value to be converted - * @param string $type specifies which type to convert to - * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text - * @return object an MDB2 error on failure - * @access protected - */ - function _baseConvertResult($value, $type, $rtrim = true) - { - switch ($type) { - case 'text': - if ($rtrim) { - $value = rtrim($value); - } - return $value; - case 'integer': - return intval($value); - case 'boolean': - return !empty($value); - case 'decimal': - return $value; - case 'float': - return doubleval($value); - case 'date': - return $value; - case 'time': - return $value; - case 'timestamp': - return $value; - case 'clob': - case 'blob': - $this->lobs[] = array( - 'buffer' => null, - 'position' => 0, - 'lob_index' => null, - 'endOfLOB' => false, - 'resource' => $value, - 'value' => null, - 'loaded' => false, - ); - end($this->lobs); - $lob_index = key($this->lobs); - $this->lobs[$lob_index]['lob_index'] = $lob_index; - return fopen('MDB2LOB://'.$lob_index.'@'.$this->db_index, 'r+'); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_INVALID, null, null, - 'attempt to convert result value to an unknown type :' . $type, __FUNCTION__); - } - - // }}} - // {{{ convertResult() - - /** - * Convert a value to a RDBMS indipendent MDB2 type - * - * @param mixed $value value to be converted - * @param string $type specifies which type to convert to - * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text - * @return mixed converted value - * @access public - */ - function convertResult($value, $type, $rtrim = true) - { - if (null === $value) { - return null; - } - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (!empty($db->options['datatype_map'][$type])) { - $type = $db->options['datatype_map'][$type]; - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type, 'value' => $value, 'rtrim' => $rtrim); - return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - } - } - return $this->_baseConvertResult($value, $type, $rtrim); - } - - // }}} - // {{{ convertResultRow() - - /** - * Convert a result row - * - * @param array $types - * @param array $row specifies the types to convert to - * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text - * @return mixed MDB2_OK on success, an MDB2 error on failure - * @access public - */ - function convertResultRow($types, $row, $rtrim = true) - { - //$types = $this->_sortResultFieldTypes(array_keys($row), $types); - $keys = array_keys($row); - if (is_int($keys[0])) { - $types = $this->_sortResultFieldTypes($keys, $types); - } - foreach ($row as $key => $value) { - if (empty($types[$key])) { - continue; - } - $value = $this->convertResult($row[$key], $types[$key], $rtrim); - if (PEAR::isError($value)) { - return $value; - } - $row[$key] = $value; - } - return $row; - } - - // }}} - // {{{ _sortResultFieldTypes() - - /** - * convert a result row - * - * @param array $types - * @param array $row specifies the types to convert to - * @param bool $rtrim if to rtrim text values or not - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function _sortResultFieldTypes($columns, $types) - { - $n_cols = count($columns); - $n_types = count($types); - if ($n_cols > $n_types) { - for ($i= $n_cols - $n_types; $i >= 0; $i--) { - $types[] = null; - } - } - $sorted_types = array(); - foreach ($columns as $col) { - $sorted_types[$col] = null; - } - foreach ($types as $name => $type) { - if (array_key_exists($name, $sorted_types)) { - $sorted_types[$name] = $type; - unset($types[$name]); - } - } - // if there are left types in the array, fill the null values of the - // sorted array with them, in order. - if (count($types)) { - reset($types); - foreach (array_keys($sorted_types) as $k) { - if (null === $sorted_types[$k]) { - $sorted_types[$k] = current($types); - next($types); - } - } - } - return $sorted_types; - } - - // }}} - // {{{ getDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare - * of the given type - * - * @param string $type type to which the value should be converted to - * @param string $name name the field to be declared. - * @param string $field definition of the field - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getDeclaration($type, $name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($db->options['datatype_map'][$type])) { - $type = $db->options['datatype_map'][$type]; - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type, 'name' => $name, 'field' => $field); - return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - } - $field['type'] = $type; - } - - if (!method_exists($this, "_get{$type}Declaration")) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'type not defined: '.$type, __FUNCTION__); - } - return $this->{"_get{$type}Declaration"}($name, $field); - } - - // }}} - // {{{ getTypeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getTypeDeclaration($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - switch ($field['type']) { - case 'text': - $length = !empty($field['length']) ? $field['length'] : $db->options['default_text_field_length']; - $fixed = !empty($field['fixed']) ? $field['fixed'] : false; - return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')') - : ($length ? 'VARCHAR('.$length.')' : 'TEXT'); - case 'clob': - return 'TEXT'; - case 'blob': - return 'TEXT'; - case 'integer': - return 'INT'; - case 'boolean': - return 'INT'; - case 'date': - return 'CHAR ('.strlen('YYYY-MM-DD').')'; - case 'time': - return 'CHAR ('.strlen('HH:MM:SS').')'; - case 'timestamp': - return 'CHAR ('.strlen('YYYY-MM-DD HH:MM:SS').')'; - case 'float': - return 'TEXT'; - case 'decimal': - return 'TEXT'; - } - return ''; - } - - // }}} - // {{{ _getDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a generic type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * charset - * Text value with the default CHARACTER SET for this field. - * collation - * Text value with the default COLLATION for this field. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field, or a MDB2_Error on failure - * @access protected - */ - function _getDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $declaration_options = $db->datatype->_getDeclarationOptions($field); - if (PEAR::isError($declaration_options)) { - return $declaration_options; - } - return $name.' '.$this->getTypeDeclaration($field).$declaration_options; - } - - // }}} - // {{{ _getDeclarationOptions() - - /** - * Obtain DBMS specific SQL code portion needed to declare a generic type - * field to be used in statement like CREATE TABLE, without the field name - * and type values (ie. just the character set, default value, if the - * field is permitted to be NULL or not, and the collation options). - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Text value to be used as default for this field. - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * charset - * Text value with the default CHARACTER SET for this field. - * collation - * Text value with the default COLLATION for this field. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field's options. - * @access protected - */ - function _getDeclarationOptions($field) - { - $charset = empty($field['charset']) ? '' : - ' '.$this->_getCharsetFieldDeclaration($field['charset']); - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $default = ''; - if (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $valid_default_values = $this->getValidTypes(); - $field['default'] = $valid_default_values[$field['type']]; - if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) { - $field['default'] = ' '; - } - } - if (null !== $field['default']) { - $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']); - } - } - - $collation = empty($field['collation']) ? '' : - ' '.$this->_getCollationFieldDeclaration($field['collation']); - - return $charset.$default.$notnull.$collation; - } - - // }}} - // {{{ _getCharsetFieldDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $charset name of the charset - * @return string DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration. - */ - function _getCharsetFieldDeclaration($charset) - { - return ''; - } - - // }}} - // {{{ _getCollationFieldDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $collation name of the collation - * @return string DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration. - */ - function _getCollationFieldDeclaration($collation) - { - return ''; - } - - // }}} - // {{{ _getIntegerDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an integer type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field should be - * declared as unsigned integer if possible. - * - * default - * Integer value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getIntegerDeclaration($name, $field) - { - if (!empty($field['unsigned'])) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer"; - } - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getTextDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getTextDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getCLOBDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an character - * large object type field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the large - * object field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function _getCLOBDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$notnull; - } - - // }}} - // {{{ _getBLOBDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an binary large - * object type field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the large - * object field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getBLOBDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$notnull; - } - - // }}} - // {{{ _getBooleanDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a boolean type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Boolean value to be used as default for this field. - * - * notnullL - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getBooleanDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getDateDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a date type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Date value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getDateDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getTimestampDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a timestamp - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Timestamp value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getTimestampDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getTimeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a time - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Time value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getTimeDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getFloatDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a float type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Float value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getFloatDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ _getDecimalDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare a decimal type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Decimal value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getDecimalDeclaration($name, $field) - { - return $this->_getDeclaration($name, $field); - } - - // }}} - // {{{ compareDefinition() - - /** - * Obtain an array of changes that may need to applied - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access public - */ - function compareDefinition($current, $previous) - { - $type = !empty($current['type']) ? $current['type'] : null; - - if (!method_exists($this, "_compare{$type}Definition")) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('current' => $current, 'previous' => $previous); - $change = call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - return $change; - } - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'type "'.$current['type'].'" is not yet supported', __FUNCTION__); - } - - if (empty($previous['type']) || $previous['type'] != $type) { - return $current; - } - - $change = $this->{"_compare{$type}Definition"}($current, $previous); - - if ($previous['type'] != $type) { - $change['type'] = true; - } - - $previous_notnull = !empty($previous['notnull']) ? $previous['notnull'] : false; - $notnull = !empty($current['notnull']) ? $current['notnull'] : false; - if ($previous_notnull != $notnull) { - $change['notnull'] = true; - } - - $previous_default = array_key_exists('default', $previous) ? $previous['default'] : - ($previous_notnull ? '' : null); - $default = array_key_exists('default', $current) ? $current['default'] : - ($notnull ? '' : null); - if ($previous_default !== $default) { - $change['default'] = true; - } - - return $change; - } - - // }}} - // {{{ _compareIntegerDefinition() - - /** - * Obtain an array of changes that may need to applied to an integer field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareIntegerDefinition($current, $previous) - { - $change = array(); - $previous_unsigned = !empty($previous['unsigned']) ? $previous['unsigned'] : false; - $unsigned = !empty($current['unsigned']) ? $current['unsigned'] : false; - if ($previous_unsigned != $unsigned) { - $change['unsigned'] = true; - } - $previous_autoincrement = !empty($previous['autoincrement']) ? $previous['autoincrement'] : false; - $autoincrement = !empty($current['autoincrement']) ? $current['autoincrement'] : false; - if ($previous_autoincrement != $autoincrement) { - $change['autoincrement'] = true; - } - return $change; - } - - // }}} - // {{{ _compareTextDefinition() - - /** - * Obtain an array of changes that may need to applied to an text field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareTextDefinition($current, $previous) - { - $change = array(); - $previous_length = !empty($previous['length']) ? $previous['length'] : 0; - $length = !empty($current['length']) ? $current['length'] : 0; - if ($previous_length != $length) { - $change['length'] = true; - } - $previous_fixed = !empty($previous['fixed']) ? $previous['fixed'] : 0; - $fixed = !empty($current['fixed']) ? $current['fixed'] : 0; - if ($previous_fixed != $fixed) { - $change['fixed'] = true; - } - return $change; - } - - // }}} - // {{{ _compareCLOBDefinition() - - /** - * Obtain an array of changes that may need to applied to an CLOB field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareCLOBDefinition($current, $previous) - { - return $this->_compareTextDefinition($current, $previous); - } - - // }}} - // {{{ _compareBLOBDefinition() - - /** - * Obtain an array of changes that may need to applied to an BLOB field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareBLOBDefinition($current, $previous) - { - return $this->_compareTextDefinition($current, $previous); - } - - // }}} - // {{{ _compareDateDefinition() - - /** - * Obtain an array of changes that may need to applied to an date field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareDateDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ _compareTimeDefinition() - - /** - * Obtain an array of changes that may need to applied to an time field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareTimeDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ _compareTimestampDefinition() - - /** - * Obtain an array of changes that may need to applied to an timestamp field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareTimestampDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ _compareBooleanDefinition() - - /** - * Obtain an array of changes that may need to applied to an boolean field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareBooleanDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ _compareFloatDefinition() - - /** - * Obtain an array of changes that may need to applied to an float field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareFloatDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ _compareDecimalDefinition() - - /** - * Obtain an array of changes that may need to applied to an decimal field - * - * @param array $current new definition - * @param array $previous old definition - * @return array containing all changes that will need to be applied - * @access protected - */ - function _compareDecimalDefinition($current, $previous) - { - return array(); - } - - // }}} - // {{{ quote() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param string $type type to which the value should be converted to - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access public - */ - function quote($value, $type = null, $quote = true, $escape_wildcards = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ((null === $value) - || ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL) - ) { - if (!$quote) { - return null; - } - return 'NULL'; - } - - if (null === $type) { - switch (gettype($value)) { - case 'integer': - $type = 'integer'; - break; - case 'double': - // todo: default to decimal as float is quite unusual - // $type = 'float'; - $type = 'decimal'; - break; - case 'boolean': - $type = 'boolean'; - break; - case 'array': - $value = serialize($value); - case 'object': - $type = 'text'; - break; - default: - if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $value)) { - $type = 'timestamp'; - } elseif (preg_match('/^\d{2}:\d{2}$/', $value)) { - $type = 'time'; - } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { - $type = 'date'; - } else { - $type = 'text'; - } - break; - } - } elseif (!empty($db->options['datatype_map'][$type])) { - $type = $db->options['datatype_map'][$type]; - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type, 'value' => $value, 'quote' => $quote, 'escape_wildcards' => $escape_wildcards); - return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - } - } - - if (!method_exists($this, "_quote{$type}")) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'type not defined: '.$type, __FUNCTION__); - } - $value = $this->{"_quote{$type}"}($value, $quote, $escape_wildcards); - if ($quote && $escape_wildcards && $db->string_quoting['escape_pattern'] - && $db->string_quoting['escape'] !== $db->string_quoting['escape_pattern'] - ) { - $value.= $this->patternEscapeString(); - } - return $value; - } - - // }}} - // {{{ _quoteInteger() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteInteger($value, $quote, $escape_wildcards) - { - return (int)$value; - } - - // }}} - // {{{ _quoteText() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that already contains any DBMS specific - * escaped character sequences. - * @access protected - */ - function _quoteText($value, $quote, $escape_wildcards) - { - if (!$quote) { - return $value; - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $value = $db->escape($value, $escape_wildcards); - if (PEAR::isError($value)) { - return $value; - } - return "'".$value."'"; - } - - // }}} - // {{{ _readFile() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _readFile($value) - { - $close = false; - if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) { - $close = true; - if (strtolower($match[1]) == 'file://') { - $value = $match[2]; - } - $value = @fopen($value, 'r'); - } - - if (is_resource($value)) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $fp = $value; - $value = ''; - while (!@feof($fp)) { - $value.= @fread($fp, $db->options['lob_buffer_length']); - } - if ($close) { - @fclose($fp); - } - } - - return $value; - } - - // }}} - // {{{ _quoteLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteLOB($value, $quote, $escape_wildcards) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if ($db->options['lob_allow_url_include']) { - $value = $this->_readFile($value); - if (PEAR::isError($value)) { - return $value; - } - } - return $this->_quoteText($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteCLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteCLOB($value, $quote, $escape_wildcards) - { - return $this->_quoteLOB($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteBLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteBLOB($value, $quote, $escape_wildcards) - { - return $this->_quoteLOB($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteBoolean() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteBoolean($value, $quote, $escape_wildcards) - { - return ($value ? 1 : 0); - } - - // }}} - // {{{ _quoteDate() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteDate($value, $quote, $escape_wildcards) - { - if ($value === 'CURRENT_DATE') { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { - return $db->function->now('date'); - } - return 'CURRENT_DATE'; - } - return $this->_quoteText($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteTimestamp() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteTimestamp($value, $quote, $escape_wildcards) - { - if ($value === 'CURRENT_TIMESTAMP') { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (isset($db->function) && is_object($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { - return $db->function->now('timestamp'); - } - return 'CURRENT_TIMESTAMP'; - } - return $this->_quoteText($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteTime() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteTime($value, $quote, $escape_wildcards) - { - if ($value === 'CURRENT_TIME') { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { - return $db->function->now('time'); - } - return 'CURRENT_TIME'; - } - return $this->_quoteText($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteFloat() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteFloat($value, $quote, $escape_wildcards) - { - if (preg_match('/^(.*)e([-+])(\d+)$/i', $value, $matches)) { - $decimal = $this->_quoteDecimal($matches[1], $quote, $escape_wildcards); - $sign = $matches[2]; - $exponent = str_pad($matches[3], 2, '0', STR_PAD_LEFT); - $value = $decimal.'E'.$sign.$exponent; - } else { - $value = $this->_quoteDecimal($value, $quote, $escape_wildcards); - } - return $value; - } - - // }}} - // {{{ _quoteDecimal() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteDecimal($value, $quote, $escape_wildcards) - { - $value = (string)$value; - $value = preg_replace('/[^\d\.,\-+eE]/', '', $value); - if (preg_match('/[^\.\d]/', $value)) { - if (strpos($value, ',')) { - // 1000,00 - if (!strpos($value, '.')) { - // convert the last "," to a "." - $value = strrev(str_replace(',', '.', strrev($value))); - // 1.000,00 - } elseif (strpos($value, '.') && strpos($value, '.') < strpos($value, ',')) { - $value = str_replace('.', '', $value); - // convert the last "," to a "." - $value = strrev(str_replace(',', '.', strrev($value))); - // 1,000.00 - } else { - $value = str_replace(',', '', $value); - } - } - } - return $value; - } - - // }}} - // {{{ writeLOBToFile() - - /** - * retrieve LOB from the database - * - * @param resource $lob stream handle - * @param string $file name of the file into which the LOb should be fetched - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access protected - */ - function writeLOBToFile($lob, $file) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) { - if ($match[1] == 'file://') { - $file = $match[2]; - } - } - - $fp = @fopen($file, 'wb'); - while (!@feof($lob)) { - $result = @fread($lob, $db->options['lob_buffer_length']); - $read = strlen($result); - if (@fwrite($fp, $result, $read) != $read) { - @fclose($fp); - return $db->raiseError(MDB2_ERROR, null, null, - 'could not write to the output file', __FUNCTION__); - } - } - @fclose($fp); - return MDB2_OK; - } - - // }}} - // {{{ _retrieveLOB() - - /** - * retrieve LOB from the database - * - * @param array $lob array - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access protected - */ - function _retrieveLOB(&$lob) - { - if (null === $lob['value']) { - $lob['value'] = $lob['resource']; - } - $lob['loaded'] = true; - return MDB2_OK; - } - - // }}} - // {{{ readLOB() - - /** - * Read data from large object input stream. - * - * @param resource $lob stream handle - * @param string $data reference to a variable that will hold data - * to be read from the large object input stream - * @param integer $length value that indicates the largest ammount ofdata - * to be read from the large object input stream. - * @return mixed the effective number of bytes read from the large object - * input stream on sucess or an MDB2 error object. - * @access public - * @see endOfLOB() - */ - function _readLOB($lob, $length) - { - return substr($lob['value'], $lob['position'], $length); - } - - // }}} - // {{{ _endOfLOB() - - /** - * Determine whether it was reached the end of the large object and - * therefore there is no more data to be read for the its input stream. - * - * @param array $lob array - * @return mixed true or false on success, a MDB2 error on failure - * @access protected - */ - function _endOfLOB($lob) - { - return $lob['endOfLOB']; - } - - // }}} - // {{{ destroyLOB() - - /** - * Free any resources allocated during the lifetime of the large object - * handler object. - * - * @param resource $lob stream handle - * @access public - */ - function destroyLOB($lob) - { - $lob_data = stream_get_meta_data($lob); - $lob_index = $lob_data['wrapper_data']->lob_index; - fclose($lob); - if (isset($this->lobs[$lob_index])) { - $this->_destroyLOB($this->lobs[$lob_index]); - unset($this->lobs[$lob_index]); - } - return MDB2_OK; - } - - // }}} - // {{{ _destroyLOB() - - /** - * Free any resources allocated during the lifetime of the large object - * handler object. - * - * @param array $lob array - * @access private - */ - function _destroyLOB(&$lob) - { - return MDB2_OK; - } - - // }}} - // {{{ implodeArray() - - /** - * apply a type to all values of an array and return as a comma seperated string - * useful for generating IN statements - * - * @access public - * - * @param array $array data array - * @param string $type determines type of the field - * - * @return string comma seperated values - */ - function implodeArray($array, $type = false) - { - if (!is_array($array) || empty($array)) { - return 'NULL'; - } - if ($type) { - foreach ($array as $value) { - $return[] = $this->quote($value, $type); - } - } else { - $return = $array; - } - return implode(', ', $return); - } - - // }}} - // {{{ matchPattern() - - /** - * build a pattern matching string - * - * @access public - * - * @param array $pattern even keys are strings, odd are patterns (% and _) - * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future) - * @param string $field optional field name that is being matched against - * (might be required when emulating ILIKE) - * - * @return string SQL pattern - */ - function matchPattern($pattern, $operator = null, $field = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $match = ''; - if (null !== $operator) { - $operator = strtoupper($operator); - switch ($operator) { - // case insensitive - case 'ILIKE': - if (null === $field) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'case insensitive LIKE matching requires passing the field name', __FUNCTION__); - } - $db->loadModule('Function', null, true); - $match = $db->function->lower($field).' LIKE '; - break; - case 'NOT ILIKE': - if (null === $field) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'case insensitive NOT ILIKE matching requires passing the field name', __FUNCTION__); - } - $db->loadModule('Function', null, true); - $match = $db->function->lower($field).' NOT LIKE '; - break; - // case sensitive - case 'LIKE': - $match = (null === $field) ? 'LIKE ' : ($field.' LIKE '); - break; - case 'NOT LIKE': - $match = (null === $field) ? 'NOT LIKE ' : ($field.' NOT LIKE '); - break; - default: - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'not a supported operator type:'. $operator, __FUNCTION__); - } - } - $match.= "'"; - foreach ($pattern as $key => $value) { - if ($key % 2) { - $match.= $value; - } else { - $escaped = $db->escape($value); - if (PEAR::isError($escaped)) { - return $escaped; - } - $match.= $db->escapePattern($escaped); - } - } - $match.= "'"; - $match.= $this->patternEscapeString(); - return $match; - } - - // }}} - // {{{ patternEscapeString() - - /** - * build string to define pattern escape character - * - * @access public - * - * @return string define pattern escape character - */ - function patternEscapeString() - { - return ''; - } - - // }}} - // {{{ mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function mapNativeDatatype($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - // If the user has specified an option to map the native field - // type to a custom MDB2 datatype... - $db_type = strtok($field['type'], '(), '); - if (!empty($db->options['nativetype_map_callback'][$db_type])) { - return call_user_func_array($db->options['nativetype_map_callback'][$db_type], array($db, $field)); - } - - // Otherwise perform the built-in (i.e. normal) MDB2 native type to - // MDB2 datatype conversion - return $this->_mapNativeDatatype($field); - } - - // }}} - // {{{ _mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function _mapNativeDatatype($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ mapPrepareDatatype() - - /** - * Maps an mdb2 datatype to mysqli prepare type - * - * @param string $type - * @return string - * @access public - */ - function mapPrepareDatatype($type) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($db->options['datatype_map'][$type])) { - $type = $db->options['datatype_map'][$type]; - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type); - return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - } - } - - return $type; - } -} -?> diff --git a/3rdparty/MDB2/Driver/Datatype/mysql.php b/3rdparty/MDB2/Driver/Datatype/mysql.php deleted file mode 100644 index d23eed23ff..0000000000 --- a/3rdparty/MDB2/Driver/Datatype/mysql.php +++ /dev/null @@ -1,602 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Datatype/Common.php'; - -/** - * MDB2 MySQL driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common -{ - // {{{ _getCharsetFieldDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $charset name of the charset - * @return string DBMS specific SQL code portion needed to set the CHARACTER SET - * of a field declaration. - */ - function _getCharsetFieldDeclaration($charset) - { - return 'CHARACTER SET '.$charset; - } - - // }}} - // {{{ _getCollationFieldDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $collation name of the collation - * @return string DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration. - */ - function _getCollationFieldDeclaration($collation) - { - return 'COLLATE '.$collation; - } - - // }}} - // {{{ getDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare - * of the given type - * - * @param string $type type to which the value should be converted to - * @param string $name name the field to be declared. - * @param string $field definition of the field - * - * @return string DBMS-specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getDeclaration($type, $name, $field) - { - // MySQL DDL syntax forbids combining NOT NULL with DEFAULT NULL. - // To get a default of NULL for NOT NULL columns, omit it. - if ( isset($field['notnull']) - && !empty($field['notnull']) - && array_key_exists('default', $field) // do not use isset() here! - && null === $field['default'] - ) { - unset($field['default']); - } - return parent::getDeclaration($type, $name, $field); - } - - // }}} - // {{{ getTypeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getTypeDeclaration($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - switch ($field['type']) { - case 'text': - if (empty($field['length']) && array_key_exists('default', $field)) { - $field['length'] = $db->varchar_max_length; - } - $length = !empty($field['length']) ? $field['length'] : false; - $fixed = !empty($field['fixed']) ? $field['fixed'] : false; - return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR(255)') - : ($length ? 'VARCHAR('.$length.')' : 'TEXT'); - case 'clob': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYTEXT'; - } elseif ($length <= 65532) { - return 'TEXT'; - } elseif ($length <= 16777215) { - return 'MEDIUMTEXT'; - } - } - return 'LONGTEXT'; - case 'blob': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYBLOB'; - } elseif ($length <= 65532) { - return 'BLOB'; - } elseif ($length <= 16777215) { - return 'MEDIUMBLOB'; - } - } - return 'LONGBLOB'; - case 'integer': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 1) { - return 'TINYINT'; - } elseif ($length == 2) { - return 'SMALLINT'; - } elseif ($length == 3) { - return 'MEDIUMINT'; - } elseif ($length == 4) { - return 'INT'; - } elseif ($length > 4) { - return 'BIGINT'; - } - } - return 'INT'; - case 'boolean': - return 'TINYINT(1)'; - case 'date': - return 'DATE'; - case 'time': - return 'TIME'; - case 'timestamp': - return 'DATETIME'; - case 'float': - $l = ''; - if (!empty($field['length'])) { - $l = '(' . $field['length']; - if (!empty($field['scale'])) { - $l .= ',' . $field['scale']; - } - $l .= ')'; - } - return 'DOUBLE' . $l; - case 'decimal': - $length = !empty($field['length']) ? $field['length'] : 18; - $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; - return 'DECIMAL('.$length.','.$scale.')'; - } - return ''; - } - - // }}} - // {{{ _getIntegerDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an integer type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param string $field associative array with the name of the properties - * of the field being declared as array indexes. - * Currently, the types of supported field - * properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field - * should be declared as unsigned integer if - * possible. - * - * default - * Integer value to be used as default for this - * field. - * - * notnull - * Boolean flag that indicates whether this field is - * constrained to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getIntegerDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $default = $autoinc = ''; - if (!empty($field['autoincrement'])) { - $autoinc = ' AUTO_INCREMENT PRIMARY KEY'; - } elseif (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $field['default'] = empty($field['notnull']) ? null : 0; - } - $default = ' DEFAULT '.$this->quote($field['default'], 'integer'); - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; - if (empty($default) && empty($notnull)) { - $default = ' DEFAULT NULL'; - } - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc; - } - - // }}} - // {{{ _getFloatDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an float type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param string $field associative array with the name of the properties - * of the field being declared as array indexes. - * Currently, the types of supported field - * properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field - * should be declared as unsigned float if - * possible. - * - * default - * float value to be used as default for this - * field. - * - * notnull - * Boolean flag that indicates whether this field is - * constrained to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getFloatDeclaration($name, $field) - { - // Since AUTO_INCREMENT can be used for integer or floating-point types, - // reuse the INTEGER declaration - // @see http://bugs.mysql.com/bug.php?id=31032 - return $this->_getIntegerDeclaration($name, $field); - } - - // }}} - // {{{ _getDecimalDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an decimal type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param string $field associative array with the name of the properties - * of the field being declared as array indexes. - * Currently, the types of supported field - * properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field - * should be declared as unsigned integer if - * possible. - * - * default - * Decimal value to be used as default for this - * field. - * - * notnull - * Boolean flag that indicates whether this field is - * constrained to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getDecimalDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $default = ''; - if (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $field['default'] = empty($field['notnull']) ? null : 0; - } - $default = ' DEFAULT '.$this->quote($field['default'], 'integer'); - } elseif (empty($field['notnull'])) { - $default = ' DEFAULT NULL'; - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull; - } - - // }}} - // {{{ matchPattern() - - /** - * build a pattern matching string - * - * @access public - * - * @param array $pattern even keys are strings, odd are patterns (% and _) - * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future) - * @param string $field optional field name that is being matched against - * (might be required when emulating ILIKE) - * - * @return string SQL pattern - */ - function matchPattern($pattern, $operator = null, $field = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $match = ''; - if (null !== $operator) { - $field = (null === $field) ? '' : $field.' '; - $operator = strtoupper($operator); - switch ($operator) { - // case insensitive - case 'ILIKE': - $match = $field.'LIKE '; - break; - case 'NOT ILIKE': - $match = $field.'NOT LIKE '; - break; - // case sensitive - case 'LIKE': - $match = $field.'LIKE BINARY '; - break; - case 'NOT LIKE': - $match = $field.'NOT LIKE BINARY '; - break; - default: - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'not a supported operator type:'. $operator, __FUNCTION__); - } - } - $match.= "'"; - foreach ($pattern as $key => $value) { - if ($key % 2) { - $match.= $value; - } else { - $match.= $db->escapePattern($db->escape($value)); - } - } - $match.= "'"; - $match.= $this->patternEscapeString(); - return $match; - } - - // }}} - // {{{ _mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function _mapNativeDatatype($field) - { - $db_type = strtolower($field['type']); - $db_type = strtok($db_type, '(), '); - if ($db_type == 'national') { - $db_type = strtok('(), '); - } - if (!empty($field['length'])) { - $length = strtok($field['length'], ', '); - $decimal = strtok(', '); - } else { - $length = strtok('(), '); - $decimal = strtok('(), '); - } - $type = array(); - $unsigned = $fixed = null; - switch ($db_type) { - case 'tinyint': - $type[] = 'integer'; - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 1; - break; - case 'smallint': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 2; - break; - case 'mediumint': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 3; - break; - case 'int': - case 'integer': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 4; - break; - case 'bigint': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 8; - break; - case 'tinytext': - case 'mediumtext': - case 'longtext': - case 'text': - case 'varchar': - $fixed = false; - case 'string': - case 'char': - $type[] = 'text'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } elseif (strstr($db_type, 'text')) { - $type[] = 'clob'; - if ($decimal == 'binary') { - $type[] = 'blob'; - } - $type = array_reverse($type); - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'enum': - $type[] = 'text'; - preg_match_all('/\'.+\'/U', $field['type'], $matches); - $length = 0; - $fixed = false; - if (is_array($matches)) { - foreach ($matches[0] as $value) { - $length = max($length, strlen($value)-2); - } - if ($length == '1' && count($matches[0]) == 2) { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } - } - $type[] = 'integer'; - case 'set': - $fixed = false; - $type[] = 'text'; - $type[] = 'integer'; - break; - case 'date': - $type[] = 'date'; - $length = null; - break; - case 'datetime': - case 'timestamp': - $type[] = 'timestamp'; - $length = null; - break; - case 'time': - $type[] = 'time'; - $length = null; - break; - case 'float': - case 'double': - case 'real': - $type[] = 'float'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - if ($decimal !== false) { - $length = $length.','.$decimal; - } - break; - case 'unknown': - case 'decimal': - case 'numeric': - $type[] = 'decimal'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - if ($decimal !== false) { - $length = $length.','.$decimal; - } - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - $type[] = 'blob'; - $length = null; - break; - case 'binary': - case 'varbinary': - $type[] = 'blob'; - break; - case 'year': - $type[] = 'integer'; - $type[] = 'date'; - $length = null; - break; - default: - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unknown database attribute type: '.$db_type, __FUNCTION__); - } - - if ((int)$length <= 0) { - $length = null; - } - - return array($type, $length, $unsigned, $fixed); - } - - // }}} -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Datatype/oci8.php b/3rdparty/MDB2/Driver/Datatype/oci8.php deleted file mode 100644 index 4d2e792a80..0000000000 --- a/3rdparty/MDB2/Driver/Datatype/oci8.php +++ /dev/null @@ -1,499 +0,0 @@ - | -// +----------------------------------------------------------------------+ - -// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ - -require_once 'MDB2/Driver/Datatype/Common.php'; - -/** - * MDB2 OCI8 driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Datatype_oci8 extends MDB2_Driver_Datatype_Common -{ - // {{{ _baseConvertResult() - - /** - * general type conversion method - * - * @param mixed $value refernce to a value to be converted - * @param string $type specifies which type to convert to - * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text - * @return object a MDB2 error on failure - * @access protected - */ - function _baseConvertResult($value, $type, $rtrim = true) - { - if (null === $value) { - return null; - } - switch ($type) { - case 'text': - if (is_object($value) && is_a($value, 'OCI-Lob')) { - //LOB => fetch into variable - $clob = $this->_baseConvertResult($value, 'clob', $rtrim); - if (!PEAR::isError($clob) && is_resource($clob)) { - $clob_value = ''; - while (!feof($clob)) { - $clob_value .= fread($clob, 8192); - } - $this->destroyLOB($clob); - } - $value = $clob_value; - } - if ($rtrim) { - $value = rtrim($value); - } - return $value; - case 'date': - return substr($value, 0, strlen('YYYY-MM-DD')); - case 'time': - return substr($value, strlen('YYYY-MM-DD '), strlen('HH:MI:SS')); - } - return parent::_baseConvertResult($value, $type, $rtrim); - } - - // }}} - // {{{ getTypeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getTypeDeclaration($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - switch ($field['type']) { - case 'text': - $length = !empty($field['length']) - ? $field['length'] : $db->options['default_text_field_length']; - $fixed = !empty($field['fixed']) ? $field['fixed'] : false; - return $fixed ? 'CHAR('.$length.')' : 'VARCHAR2('.$length.')'; - case 'clob': - return 'CLOB'; - case 'blob': - return 'BLOB'; - case 'integer': - if (!empty($field['length'])) { - switch((int)$field['length']) { - case 1: $digit = 3; break; - case 2: $digit = 5; break; - case 3: $digit = 8; break; - case 4: $digit = 10; break; - case 5: $digit = 13; break; - case 6: $digit = 15; break; - case 7: $digit = 17; break; - case 8: $digit = 20; break; - default: $digit = 10; - } - return 'NUMBER('.$digit.')'; - } - return 'INT'; - case 'boolean': - return 'NUMBER(1)'; - case 'date': - case 'time': - case 'timestamp': - return 'DATE'; - case 'float': - return 'NUMBER'; - case 'decimal': - $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; - return 'NUMBER(*,'.$scale.')'; - } - } - - // }}} - // {{{ _quoteCLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteCLOB($value, $quote, $escape_wildcards) - { - return 'EMPTY_CLOB()'; - } - - // }}} - // {{{ _quoteBLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteBLOB($value, $quote, $escape_wildcards) - { - return 'EMPTY_BLOB()'; - } - - // }}} - // {{{ _quoteDate() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteDate($value, $quote, $escape_wildcards) - { - return $this->_quoteText("$value 00:00:00", $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteTimestamp() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - //function _quoteTimestamp($value, $quote, $escape_wildcards) - //{ - // return $this->_quoteText($value, $quote, $escape_wildcards); - //} - - // }}} - // {{{ _quoteTime() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteTime($value, $quote, $escape_wildcards) - { - return $this->_quoteText("0001-01-01 $value", $quote, $escape_wildcards); - } - - // }}} - // {{{ writeLOBToFile() - - /** - * retrieve LOB from the database - * - * @param array $lob array - * @param string $file name of the file into which the LOb should be fetched - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access protected - */ - function writeLOBToFile($lob, $file) - { - if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) { - if ($match[1] == 'file://') { - $file = $match[2]; - } - } - $lob_data = stream_get_meta_data($lob); - $lob_index = $lob_data['wrapper_data']->lob_index; - $result = $this->lobs[$lob_index]['resource']->writetofile($file); - $this->lobs[$lob_index]['resource']->seek(0); - if (!$result) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(null, null, null, - 'Unable to write LOB to file', __FUNCTION__); - } - return MDB2_OK; - } - - // }}} - // {{{ _retrieveLOB() - - /** - * retrieve LOB from the database - * - * @param array $lob array - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access protected - */ - function _retrieveLOB(&$lob) - { - if (!is_object($lob['resource'])) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); - } - - if (!$lob['loaded'] -# && !method_exists($lob['resource'], 'read') - ) { - $lob['value'] = $lob['resource']->load(); - $lob['resource']->seek(0); - } - $lob['loaded'] = true; - return MDB2_OK; - } - - // }}} - // {{{ _readLOB() - - /** - * Read data from large object input stream. - * - * @param array $lob array - * @param blob $data reference to a variable that will hold data to be - * read from the large object input stream - * @param int $length integer value that indicates the largest ammount of - * data to be read from the large object input stream. - * @return mixed length on success, a MDB2 error on failure - * @access protected - */ - function _readLOB($lob, $length) - { - if ($lob['loaded']) { - return parent::_readLOB($lob, $length); - } - - if (!is_object($lob['resource'])) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); - } - - $data = $lob['resource']->read($length); - if (!is_string($data)) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(null, null, null, - 'Unable to read LOB', __FUNCTION__); - } - return $data; - } - - // }}} - // {{{ patternEscapeString() - - /** - * build string to define escape pattern string - * - * @access public - * - * - * @return string define escape pattern - */ - function patternEscapeString() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - return " ESCAPE '". $db->string_quoting['escape_pattern'] ."'"; - } - - // }}} - // {{{ _mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function _mapNativeDatatype($field) - { - $db_type = strtolower($field['type']); - $type = array(); - $length = $unsigned = $fixed = null; - if (!empty($field['length'])) { - $length = $field['length']; - } - switch ($db_type) { - case 'integer': - case 'pls_integer': - case 'binary_integer': - $type[] = 'integer'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } - break; - case 'varchar': - case 'varchar2': - case 'nvarchar2': - $fixed = false; - case 'char': - case 'nchar': - $type[] = 'text'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - case 'timestamp': - $type[] = 'timestamp'; - $length = null; - break; - case 'float': - $type[] = 'float'; - break; - case 'number': - if (!empty($field['scale'])) { - $type[] = 'decimal'; - $length = $length.','.$field['scale']; - } else { - $type[] = 'integer'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } - } - break; - case 'long': - $type[] = 'text'; - case 'clob': - case 'nclob': - $type[] = 'clob'; - break; - case 'blob': - case 'raw': - case 'long raw': - case 'bfile': - $type[] = 'blob'; - $length = null; - break; - case 'rowid': - case 'urowid': - default: - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unknown database attribute type: '.$db_type, __FUNCTION__); - } - - if ((int)$length <= 0) { - $length = null; - } - - return array($type, $length, $unsigned, $fixed); - } -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Datatype/pgsql.php b/3rdparty/MDB2/Driver/Datatype/pgsql.php deleted file mode 100644 index db2fa27902..0000000000 --- a/3rdparty/MDB2/Driver/Datatype/pgsql.php +++ /dev/null @@ -1,579 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/Driver/Datatype/Common.php'; - -/** - * MDB2 PostGreSQL driver - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common -{ - // {{{ _baseConvertResult() - - /** - * General type conversion method - * - * @param mixed $value refernce to a value to be converted - * @param string $type specifies which type to convert to - * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text - * @return object a MDB2 error on failure - * @access protected - */ - function _baseConvertResult($value, $type, $rtrim = true) - { - if (null === $value) { - return null; - } - switch ($type) { - case 'boolean': - return $value == 't'; - case 'float': - return doubleval($value); - case 'date': - return $value; - case 'time': - return substr($value, 0, strlen('HH:MM:SS')); - case 'timestamp': - return substr($value, 0, strlen('YYYY-MM-DD HH:MM:SS')); - case 'blob': - $value = pg_unescape_bytea($value); - return parent::_baseConvertResult($value, $type, $rtrim); - } - return parent::_baseConvertResult($value, $type, $rtrim); - } - - // }}} - // {{{ getTypeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getTypeDeclaration($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - switch ($field['type']) { - case 'text': - $length = !empty($field['length']) ? $field['length'] : false; - $fixed = !empty($field['fixed']) ? $field['fixed'] : false; - return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')') - : ($length ? 'VARCHAR('.$length.')' : 'TEXT'); - case 'clob': - return 'TEXT'; - case 'blob': - return 'BYTEA'; - case 'integer': - if (!empty($field['autoincrement'])) { - if (!empty($field['length'])) { - $length = $field['length']; - if ($length > 4) { - return 'BIGSERIAL PRIMARY KEY'; - } - } - return 'SERIAL PRIMARY KEY'; - } - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 2) { - return 'SMALLINT'; - } elseif ($length == 3 || $length == 4) { - return 'INT'; - } elseif ($length > 4) { - return 'BIGINT'; - } - } - return 'INT'; - case 'boolean': - return 'BOOLEAN'; - case 'date': - return 'DATE'; - case 'time': - return 'TIME without time zone'; - case 'timestamp': - return 'TIMESTAMP without time zone'; - case 'float': - return 'FLOAT8'; - case 'decimal': - $length = !empty($field['length']) ? $field['length'] : 18; - $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; - return 'NUMERIC('.$length.','.$scale.')'; - } - } - - // }}} - // {{{ _getIntegerDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an integer type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field should be - * declared as unsigned integer if possible. - * - * default - * Integer value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getIntegerDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($field['unsigned'])) { - $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer"; - } - if (!empty($field['autoincrement'])) { - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field); - } - $default = ''; - if (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $field['default'] = empty($field['notnull']) ? null : 0; - } - $default = ' DEFAULT '.$this->quote($field['default'], 'integer'); - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - if (empty($default) && empty($notnull)) { - $default = ' DEFAULT NULL'; - } - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$default.$notnull; - } - - // }}} - // {{{ _quoteCLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteCLOB($value, $quote, $escape_wildcards) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if ($db->options['lob_allow_url_include']) { - $value = $this->_readFile($value); - if (PEAR::isError($value)) { - return $value; - } - } - return $this->_quoteText($value, $quote, $escape_wildcards); - } - - // }}} - // {{{ _quoteBLOB() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteBLOB($value, $quote, $escape_wildcards) - { - if (!$quote) { - return $value; - } - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if ($db->options['lob_allow_url_include']) { - $value = $this->_readFile($value); - if (PEAR::isError($value)) { - return $value; - } - } - if (version_compare(PHP_VERSION, '5.2.0RC6', '>=')) { - $connection = $db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $value = @pg_escape_bytea($connection, $value); - } else { - $value = @pg_escape_bytea($value); - } - return "'".$value."'"; - } - - // }}} - // {{{ _quoteBoolean() - - /** - * Convert a text value into a DBMS specific format that is suitable to - * compose query statements. - * - * @param string $value text string value that is intended to be converted. - * @param bool $quote determines if the value should be quoted and escaped - * @param bool $escape_wildcards if to escape escape wildcards - * @return string text string that represents the given argument value in - * a DBMS specific format. - * @access protected - */ - function _quoteBoolean($value, $quote, $escape_wildcards) - { - $value = $value ? 't' : 'f'; - if (!$quote) { - return $value; - } - return "'".$value."'"; - } - - // }}} - // {{{ matchPattern() - - /** - * build a pattern matching string - * - * @access public - * - * @param array $pattern even keys are strings, odd are patterns (% and _) - * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future) - * @param string $field optional field name that is being matched against - * (might be required when emulating ILIKE) - * - * @return string SQL pattern - */ - function matchPattern($pattern, $operator = null, $field = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $match = ''; - if (null !== $operator) { - $field = (null === $field) ? '' : $field.' '; - $operator = strtoupper($operator); - switch ($operator) { - // case insensitive - case 'ILIKE': - $match = $field.'ILIKE '; - break; - case 'NOT ILIKE': - $match = $field.'NOT ILIKE '; - break; - // case sensitive - case 'LIKE': - $match = $field.'LIKE '; - break; - case 'NOT LIKE': - $match = $field.'NOT LIKE '; - break; - default: - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'not a supported operator type:'. $operator, __FUNCTION__); - } - } - $match.= "'"; - foreach ($pattern as $key => $value) { - if ($key % 2) { - $match.= $value; - } else { - $match.= $db->escapePattern($db->escape($value)); - } - } - $match.= "'"; - $match.= $this->patternEscapeString(); - return $match; - } - - // }}} - // {{{ patternEscapeString() - - /** - * build string to define escape pattern string - * - * @access public - * - * - * @return string define escape pattern - */ - function patternEscapeString() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - return ' ESCAPE '.$this->quote($db->string_quoting['escape_pattern']); - } - - // }}} - // {{{ _mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function _mapNativeDatatype($field) - { - $db_type = strtolower($field['type']); - $length = $field['length']; - $type = array(); - $unsigned = $fixed = null; - switch ($db_type) { - case 'smallint': - case 'int2': - $type[] = 'integer'; - $unsigned = false; - $length = 2; - if ($length == '2') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } - break; - case 'int': - case 'int4': - case 'integer': - case 'serial': - case 'serial4': - $type[] = 'integer'; - $unsigned = false; - $length = 4; - break; - case 'bigint': - case 'int8': - case 'bigserial': - case 'serial8': - $type[] = 'integer'; - $unsigned = false; - $length = 8; - break; - case 'bool': - case 'boolean': - $type[] = 'boolean'; - $length = null; - break; - case 'text': - case 'varchar': - $fixed = false; - case 'unknown': - case 'char': - case 'bpchar': - $type[] = 'text'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } elseif (strstr($db_type, 'text')) { - $type[] = 'clob'; - $type = array_reverse($type); - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - $type[] = 'date'; - $length = null; - break; - case 'datetime': - case 'timestamp': - case 'timestamptz': - $type[] = 'timestamp'; - $length = null; - break; - case 'time': - $type[] = 'time'; - $length = null; - break; - case 'float': - case 'float4': - case 'float8': - case 'double': - case 'real': - $type[] = 'float'; - break; - case 'decimal': - case 'money': - case 'numeric': - $type[] = 'decimal'; - if (isset($field['scale'])) { - $length = $length.','.$field['scale']; - } - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - case 'bytea': - $type[] = 'blob'; - $length = null; - break; - case 'oid': - $type[] = 'blob'; - $type[] = 'clob'; - $length = null; - break; - case 'year': - $type[] = 'integer'; - $type[] = 'date'; - $length = null; - break; - default: - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unknown database attribute type: '.$db_type, __FUNCTION__); - } - - if ((int)$length <= 0) { - $length = null; - } - - return array($type, $length, $unsigned, $fixed); - } - - // }}} - // {{{ mapPrepareDatatype() - - /** - * Maps an mdb2 datatype to native prepare type - * - * @param string $type - * @return string - * @access public - */ - function mapPrepareDatatype($type) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($db->options['datatype_map'][$type])) { - $type = $db->options['datatype_map'][$type]; - if (!empty($db->options['datatype_map_callback'][$type])) { - $parameter = array('type' => $type); - return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter)); - } - } - - switch ($type) { - case 'integer': - return 'int'; - case 'boolean': - return 'bool'; - case 'decimal': - case 'float': - return 'numeric'; - case 'clob': - return 'text'; - case 'blob': - return 'bytea'; - default: - break; - } - return $type; - } - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Datatype/sqlite.php b/3rdparty/MDB2/Driver/Datatype/sqlite.php deleted file mode 100644 index 50475a3628..0000000000 --- a/3rdparty/MDB2/Driver/Datatype/sqlite.php +++ /dev/null @@ -1,418 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Datatype/Common.php'; - -/** - * MDB2 SQLite driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common -{ - // {{{ _getCollationFieldDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration to be used in statements like CREATE TABLE. - * - * @param string $collation name of the collation - * - * @return string DBMS specific SQL code portion needed to set the COLLATION - * of a field declaration. - */ - function _getCollationFieldDeclaration($collation) - { - return 'COLLATE '.$collation; - } - - // }}} - // {{{ getTypeDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an text type - * field to be used in statements like CREATE TABLE. - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * length - * Integer value that determines the maximum length of the text - * field. If this argument is missing the field should be - * declared to have the longest length allowed by the DBMS. - * - * default - * Text value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access public - */ - function getTypeDeclaration($field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - switch ($field['type']) { - case 'text': - $length = !empty($field['length']) - ? $field['length'] : false; - $fixed = !empty($field['fixed']) ? $field['fixed'] : false; - return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')') - : ($length ? 'VARCHAR('.$length.')' : 'TEXT'); - case 'clob': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYTEXT'; - } elseif ($length <= 65532) { - return 'TEXT'; - } elseif ($length <= 16777215) { - return 'MEDIUMTEXT'; - } - } - return 'LONGTEXT'; - case 'blob': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 255) { - return 'TINYBLOB'; - } elseif ($length <= 65532) { - return 'BLOB'; - } elseif ($length <= 16777215) { - return 'MEDIUMBLOB'; - } - } - return 'LONGBLOB'; - case 'integer': - if (!empty($field['length'])) { - $length = $field['length']; - if ($length <= 2) { - return 'SMALLINT'; - } elseif ($length == 3 || $length == 4) { - return 'INTEGER'; - } elseif ($length > 4) { - return 'BIGINT'; - } - } - return 'INTEGER'; - case 'boolean': - return 'BOOLEAN'; - case 'date': - return 'DATE'; - case 'time': - return 'TIME'; - case 'timestamp': - return 'DATETIME'; - case 'float': - return 'DOUBLE'.($db->options['fixed_float'] ? '('. - ($db->options['fixed_float']+2).','.$db->options['fixed_float'].')' : ''); - case 'decimal': - $length = !empty($field['length']) ? $field['length'] : 18; - $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; - return 'DECIMAL('.$length.','.$scale.')'; - } - return ''; - } - - // }}} - // {{{ _getIntegerDeclaration() - - /** - * Obtain DBMS specific SQL code portion needed to declare an integer type - * field to be used in statements like CREATE TABLE. - * - * @param string $name name the field to be declared. - * @param string $field associative array with the name of the properties - * of the field being declared as array indexes. - * Currently, the types of supported field - * properties are as follows: - * - * unsigned - * Boolean flag that indicates whether the field - * should be declared as unsigned integer if - * possible. - * - * default - * Integer value to be used as default for this - * field. - * - * notnull - * Boolean flag that indicates whether this field is - * constrained to not be set to null. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field. - * @access protected - */ - function _getIntegerDeclaration($name, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $default = $autoinc = ''; - if (!empty($field['autoincrement'])) { - $autoinc = ' PRIMARY KEY'; - } elseif (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $field['default'] = empty($field['notnull']) ? null : 0; - } - $default = ' DEFAULT '.$this->quote($field['default'], 'integer'); - } - - $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; - $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; - if (empty($default) && empty($notnull)) { - $default = ' DEFAULT NULL'; - } - $name = $db->quoteIdentifier($name, true); - return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc; - } - - // }}} - // {{{ matchPattern() - - /** - * build a pattern matching string - * - * @access public - * - * @param array $pattern even keys are strings, odd are patterns (% and _) - * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future) - * @param string $field optional field name that is being matched against - * (might be required when emulating ILIKE) - * - * @return string SQL pattern - */ - function matchPattern($pattern, $operator = null, $field = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $match = ''; - if (null !== $operator) { - $field = (null === $field) ? '' : $field.' '; - $operator = strtoupper($operator); - switch ($operator) { - // case insensitive - case 'ILIKE': - $match = $field.'LIKE '; - break; - case 'NOT ILIKE': - $match = $field.'NOT LIKE '; - break; - // case sensitive - case 'LIKE': - $match = $field.'LIKE '; - break; - case 'NOT LIKE': - $match = $field.'NOT LIKE '; - break; - default: - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'not a supported operator type:'. $operator, __FUNCTION__); - } - } - $match.= "'"; - foreach ($pattern as $key => $value) { - if ($key % 2) { - $match.= $value; - } else { - $match.= $db->escapePattern($db->escape($value)); - } - } - $match.= "'"; - $match.= $this->patternEscapeString(); - return $match; - } - - // }}} - // {{{ _mapNativeDatatype() - - /** - * Maps a native array description of a field to a MDB2 datatype and length - * - * @param array $field native field description - * @return array containing the various possible types, length, sign, fixed - * @access public - */ - function _mapNativeDatatype($field) - { - $db_type = strtolower($field['type']); - $length = !empty($field['length']) ? $field['length'] : null; - $unsigned = !empty($field['unsigned']) ? $field['unsigned'] : null; - $fixed = null; - $type = array(); - switch ($db_type) { - case 'boolean': - $type[] = 'boolean'; - break; - case 'tinyint': - $type[] = 'integer'; - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 1; - break; - case 'smallint': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 2; - break; - case 'mediumint': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 3; - break; - case 'int': - case 'integer': - case 'serial': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 4; - break; - case 'bigint': - case 'bigserial': - $type[] = 'integer'; - $unsigned = preg_match('/ unsigned/i', $field['type']); - $length = 8; - break; - case 'clob': - $type[] = 'clob'; - $fixed = false; - break; - case 'tinytext': - case 'mediumtext': - case 'longtext': - case 'text': - case 'varchar': - case 'varchar2': - $fixed = false; - case 'char': - $type[] = 'text'; - if ($length == '1') { - $type[] = 'boolean'; - if (preg_match('/^(is|has)/', $field['name'])) { - $type = array_reverse($type); - } - } elseif (strstr($db_type, 'text')) { - $type[] = 'clob'; - $type = array_reverse($type); - } - if ($fixed !== false) { - $fixed = true; - } - break; - case 'date': - $type[] = 'date'; - $length = null; - break; - case 'datetime': - case 'timestamp': - $type[] = 'timestamp'; - $length = null; - break; - case 'time': - $type[] = 'time'; - $length = null; - break; - case 'float': - case 'double': - case 'real': - $type[] = 'float'; - break; - case 'decimal': - case 'numeric': - $type[] = 'decimal'; - $length = $length.','.$field['decimal']; - break; - case 'tinyblob': - case 'mediumblob': - case 'longblob': - case 'blob': - $type[] = 'blob'; - $length = null; - break; - case 'year': - $type[] = 'integer'; - $type[] = 'date'; - $length = null; - break; - default: - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unknown database attribute type: '.$db_type, __FUNCTION__); - } - - if ((int)$length <= 0) { - $length = null; - } - - return array($type, $length, $unsigned, $fixed); - } - - // }}} -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/Common.php b/3rdparty/MDB2/Driver/Function/Common.php deleted file mode 100644 index 5a780fd48e..0000000000 --- a/3rdparty/MDB2/Driver/Function/Common.php +++ /dev/null @@ -1,293 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -/** - * Base class for the function modules that is extended by each MDB2 driver - * - * To load this module in the MDB2 object: - * $mdb->loadModule('Function'); - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Function_Common extends MDB2_Module_Common -{ - // {{{ executeStoredProc() - - /** - * Execute a stored procedure and return any results - * - * @param string $name string that identifies the function to execute - * @param mixed $params array that contains the paramaters to pass the stored proc - * @param mixed $types array that contains the types of the columns in - * the result set - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * - * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $error; - } - - // }}} - // {{{ functionTable() - - /** - * return string for internal table used when calling only a function - * - * @return string for internal table used when calling only a function - * @access public - */ - function functionTable() - { - return ''; - } - - // }}} - // {{{ now() - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time: - * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) - * - CURRENT_DATE (date, DATE type) - * - CURRENT_TIME (time, TIME type) - * - * @param string $type 'timestamp' | 'time' | 'date' - * - * @return string to call a variable with the current timestamp - * @access public - */ - function now($type = 'timestamp') - { - switch ($type) { - case 'time': - return 'CURRENT_TIME'; - case 'date': - return 'CURRENT_DATE'; - case 'timestamp': - default: - return 'CURRENT_TIMESTAMP'; - } - } - - // }}} - // {{{ unixtimestamp() - - /** - * return string to call a function to get the unix timestamp from a iso timestamp - * - * @param string $expression - * - * @return string to call a variable with the timestamp - * @access public - */ - function unixtimestamp($expression) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $error; - } - - // }}} - // {{{ substring() - - /** - * return string to call a function to get a substring inside an SQL statement - * - * @return string to call a function to get a substring - * @access public - */ - function substring($value, $position = 1, $length = null) - { - if (null !== $length) { - return "SUBSTRING($value FROM $position FOR $length)"; - } - return "SUBSTRING($value FROM $position)"; - } - - // }}} - // {{{ replace() - - /** - * return string to call a function to get replace inside an SQL statement. - * - * @return string to call a function to get a replace - * @access public - */ - function replace($str, $from_str, $to_str) - { - return "REPLACE($str, $from_str , $to_str)"; - } - - // }}} - // {{{ concat() - - /** - * Returns string to concatenate two or more string parameters - * - * @param string $value1 - * @param string $value2 - * @param string $values... - * - * @return string to concatenate two strings - * @access public - */ - function concat($value1, $value2) - { - $args = func_get_args(); - return "(".implode(' || ', $args).")"; - } - - // }}} - // {{{ random() - - /** - * return string to call a function to get random value inside an SQL statement - * - * @return return string to generate float between 0 and 1 - * @access public - */ - function random() - { - return 'RAND()'; - } - - // }}} - // {{{ lower() - - /** - * return string to call a function to lower the case of an expression - * - * @param string $expression - * - * @return return string to lower case of an expression - * @access public - */ - function lower($expression) - { - return "LOWER($expression)"; - } - - // }}} - // {{{ upper() - - /** - * return string to call a function to upper the case of an expression - * - * @param string $expression - * - * @return return string to upper case of an expression - * @access public - */ - function upper($expression) - { - return "UPPER($expression)"; - } - - // }}} - // {{{ length() - - /** - * return string to call a function to get the length of a string expression - * - * @param string $expression - * - * @return return string to get the string expression length - * @access public - */ - function length($expression) - { - return "LENGTH($expression)"; - } - - // }}} - // {{{ guid() - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @access public - */ - function guid() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $error; - } - - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/mysql.php b/3rdparty/MDB2/Driver/Function/mysql.php deleted file mode 100644 index 90fdafc973..0000000000 --- a/3rdparty/MDB2/Driver/Function/mysql.php +++ /dev/null @@ -1,136 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Function/Common.php'; - -/** - * MDB2 MySQL driver for the function modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Function_mysql extends MDB2_Driver_Function_Common -{ - // }}} - // {{{ executeStoredProc() - - /** - * Execute a stored procedure and return any results - * - * @param string $name string that identifies the function to execute - * @param mixed $params array that contains the paramaters to pass the stored proc - * @param mixed $types array that contains the types of the columns in - * the result set - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'CALL '.$name; - $query .= $params ? '('.implode(', ', $params).')' : '()'; - return $db->query($query, $types, $result_class, $result_wrap_class); - } - - // }}} - // {{{ unixtimestamp() - - /** - * return string to call a function to get the unix timestamp from a iso timestamp - * - * @param string $expression - * - * @return string to call a variable with the timestamp - * @access public - */ - function unixtimestamp($expression) - { - return 'UNIX_TIMESTAMP('. $expression.')'; - } - - // }}} - // {{{ concat() - - /** - * Returns string to concatenate two or more string parameters - * - * @param string $value1 - * @param string $value2 - * @param string $values... - * @return string to concatenate two strings - * @access public - **/ - function concat($value1, $value2) - { - $args = func_get_args(); - return "CONCAT(".implode(', ', $args).")"; - } - - // }}} - // {{{ guid() - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @access public - */ - function guid() - { - return 'UUID()'; - } - - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/oci8.php b/3rdparty/MDB2/Driver/Function/oci8.php deleted file mode 100644 index 757d17fcb8..0000000000 --- a/3rdparty/MDB2/Driver/Function/oci8.php +++ /dev/null @@ -1,187 +0,0 @@ - | -// +----------------------------------------------------------------------+ - -// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ - -require_once 'MDB2/Driver/Function/Common.php'; - -/** - * MDB2 oci8 driver for the function modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Function_oci8 extends MDB2_Driver_Function_Common -{ - // {{{ executeStoredProc() - - /** - * Execute a stored procedure and return any results - * - * @param string $name string that identifies the function to execute - * @param mixed $params array that contains the paramaters to pass the stored proc - * @param mixed $types array that contains the types of the columns in - * the result set - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'EXEC '.$name; - $query .= $params ? '('.implode(', ', $params).')' : '()'; - return $db->query($query, $types, $result_class, $result_wrap_class); - } - - // }}} - // {{{ functionTable() - - /** - * return string for internal table used when calling only a function - * - * @return string for internal table used when calling only a function - * @access public - */ - function functionTable() - { - return ' FROM dual'; - } - - // }}} - // {{{ now() - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time: - * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) - * - CURRENT_DATE (date, DATE type) - * - CURRENT_TIME (time, TIME type) - * - * @return string to call a variable with the current timestamp - * @access public - */ - function now($type = 'timestamp') - { - switch ($type) { - case 'date': - case 'time': - case 'timestamp': - default: - return 'TO_CHAR(CURRENT_TIMESTAMP, \'YYYY-MM-DD HH24:MI:SS\')'; - } - } - - // }}} - // {{{ unixtimestamp() - - /** - * return string to call a function to get the unix timestamp from a iso timestamp - * - * @param string $expression - * - * @return string to call a variable with the timestamp - * @access public - */ - function unixtimestamp($expression) - { - $utc_offset = 'CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP) AS DATE) - CAST(SYSTIMESTAMP AS DATE)'; - $epoch_date = 'to_date(\'19700101\', \'YYYYMMDD\')'; - return '(CAST('.$expression.' AS DATE) - '.$epoch_date.' + '.$utc_offset.') * 86400 seconds'; - } - - // }}} - // {{{ substring() - - /** - * return string to call a function to get a substring inside an SQL statement - * - * @return string to call a function to get a substring - * @access public - */ - function substring($value, $position = 1, $length = null) - { - if (null !== $length) { - return "SUBSTR($value, $position, $length)"; - } - return "SUBSTR($value, $position)"; - } - - // }}} - // {{{ random() - - /** - * return string to call a function to get random value inside an SQL statement - * - * @return return string to generate float between 0 and 1 - * @access public - */ - function random() - { - return 'dbms_random.value'; - } - - // }}}} - // {{{ guid() - - /** - * Returns global unique identifier - * - * @return string to get global unique identifier - * @access public - */ - function guid() - { - return 'SYS_GUID()'; - } - - // }}}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/pgsql.php b/3rdparty/MDB2/Driver/Function/pgsql.php deleted file mode 100644 index 7cc34a2d70..0000000000 --- a/3rdparty/MDB2/Driver/Function/pgsql.php +++ /dev/null @@ -1,132 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/Driver/Function/Common.php'; - -/** - * MDB2 MySQL driver for the function modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Function_pgsql extends MDB2_Driver_Function_Common -{ - // {{{ executeStoredProc() - - /** - * Execute a stored procedure and return any results - * - * @param string $name string that identifies the function to execute - * @param mixed $params array that contains the paramaters to pass the stored proc - * @param mixed $types array that contains the types of the columns in - * the result set - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT * FROM '.$name; - $query .= $params ? '('.implode(', ', $params).')' : '()'; - return $db->query($query, $types, $result_class, $result_wrap_class); - } - // }}} - // {{{ unixtimestamp() - - /** - * return string to call a function to get the unix timestamp from a iso timestamp - * - * @param string $expression - * - * @return string to call a variable with the timestamp - * @access public - */ - function unixtimestamp($expression) - { - return 'EXTRACT(EPOCH FROM DATE_TRUNC(\'seconds\', CAST ((' . $expression . ') AS TIMESTAMP)))'; - } - - // }}} - // {{{ substring() - - /** - * return string to call a function to get a substring inside an SQL statement - * - * @return string to call a function to get a substring - * @access public - */ - function substring($value, $position = 1, $length = null) - { - if (null !== $length) { - return "SUBSTRING(CAST($value AS VARCHAR) FROM $position FOR $length)"; - } - return "SUBSTRING(CAST($value AS VARCHAR) FROM $position)"; - } - - // }}} - // {{{ random() - - /** - * return string to call a function to get random value inside an SQL statement - * - * @return return string to generate float between 0 and 1 - * @access public - */ - function random() - { - return 'RANDOM()'; - } - - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/sqlite.php b/3rdparty/MDB2/Driver/Function/sqlite.php deleted file mode 100644 index 65ade4fec0..0000000000 --- a/3rdparty/MDB2/Driver/Function/sqlite.php +++ /dev/null @@ -1,162 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Function/Common.php'; - -/** - * MDB2 SQLite driver for the function modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Function_sqlite extends MDB2_Driver_Function_Common -{ - // {{{ constructor - - /** - * Constructor - */ - function __construct($db_index) - { - parent::__construct($db_index); - // create all sorts of UDFs - } - - // {{{ now() - - /** - * Return string to call a variable with the current timestamp inside an SQL statement - * There are three special variables for current date and time. - * - * @return string to call a variable with the current timestamp - * @access public - */ - function now($type = 'timestamp') - { - switch ($type) { - case 'time': - return 'time(\'now\')'; - case 'date': - return 'date(\'now\')'; - case 'timestamp': - default: - return 'datetime(\'now\')'; - } - } - - // }}} - // {{{ unixtimestamp() - - /** - * return string to call a function to get the unix timestamp from a iso timestamp - * - * @param string $expression - * - * @return string to call a variable with the timestamp - * @access public - */ - function unixtimestamp($expression) - { - return 'strftime("%s",'. $expression.', "utc")'; - } - - // }}} - // {{{ substring() - - /** - * return string to call a function to get a substring inside an SQL statement - * - * @return string to call a function to get a substring - * @access public - */ - function substring($value, $position = 1, $length = null) - { - if (null !== $length) { - return "substr($value, $position, $length)"; - } - return "substr($value, $position, length($value))"; - } - - // }}} - // {{{ random() - - /** - * return string to call a function to get random value inside an SQL statement - * - * @return return string to generate float between 0 and 1 - * @access public - */ - function random() - { - return '((RANDOM()+2147483648)/4294967296)'; - } - - // }}} - // {{{ replace() - - /** - * return string to call a function to get a replacement inside an SQL statement. - * - * @return string to call a function to get a replace - * @access public - */ - function replace($str, $from_str, $to_str) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - return $error; - } - - // }}} -} -?> diff --git a/3rdparty/MDB2/Driver/Manager/Common.php b/3rdparty/MDB2/Driver/Manager/Common.php deleted file mode 100644 index 2e99c332a2..0000000000 --- a/3rdparty/MDB2/Driver/Manager/Common.php +++ /dev/null @@ -1,1038 +0,0 @@ - | -// | Lorenzo Alberton | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - * @author Lorenzo Alberton - */ - -/** - * Base class for the management modules that is extended by each MDB2 driver - * - * To load this module in the MDB2 object: - * $mdb->loadModule('Manager'); - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Manager_Common extends MDB2_Module_Common -{ - // {{{ splitTableSchema() - - /** - * Split the "[owner|schema].table" notation into an array - * - * @param string $table [schema and] table name - * - * @return array array(schema, table) - * @access private - */ - function splitTableSchema($table) - { - $ret = array(); - if (strpos($table, '.') !== false) { - return explode('.', $table); - } - return array(null, $table); - } - - // }}} - // {{{ getFieldDeclarationList() - - /** - * Get declaration of a number of field in bulk - * - * @param array $fields a multidimensional associative array. - * The first dimension determines the field name, while the second - * dimension is keyed with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Boolean value to be used as default for this field. - * - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * - * @return mixed string on success, a MDB2 error on failure - * @access public - */ - function getFieldDeclarationList($fields) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!is_array($fields) || empty($fields)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'missing any fields', __FUNCTION__); - } - foreach ($fields as $field_name => $field) { - $query = $db->getDeclaration($field['type'], $field_name, $field); - if (PEAR::isError($query)) { - return $query; - } - $query_fields[] = $query; - } - return implode(', ', $query_fields); - } - - // }}} - // {{{ _fixSequenceName() - - /** - * Removes any formatting in an sequence name using the 'seqname_format' option - * - * @param string $sqn string that containts name of a potential sequence - * @param bool $check if only formatted sequences should be returned - * @return string name of the sequence with possible formatting removed - * @access protected - */ - function _fixSequenceName($sqn, $check = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $seq_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['seqname_format']).'$/i'; - $seq_name = preg_replace($seq_pattern, '\\1', $sqn); - if ($seq_name && !strcasecmp($sqn, $db->getSequenceName($seq_name))) { - return $seq_name; - } - if ($check) { - return false; - } - return $sqn; - } - - // }}} - // {{{ _fixIndexName() - - /** - * Removes any formatting in an index name using the 'idxname_format' option - * - * @param string $idx string that containts name of anl index - * @return string name of the index with eventual formatting removed - * @access protected - */ - function _fixIndexName($idx) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $idx_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['idxname_format']).'$/i'; - $idx_name = preg_replace($idx_pattern, '\\1', $idx); - if ($idx_name && !strcasecmp($idx, $db->getIndexName($idx_name))) { - return $idx_name; - } - return $idx; - } - - // }}} - // {{{ createDatabase() - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @param array $options array with charset, collation info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createDatabase($database, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ alterDatabase() - - /** - * alter an existing database - * - * @param string $name name of the database that should be created - * @param array $options array with charset, collation info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function alterDatabase($database, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ dropDatabase() - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropDatabase($database) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ _getCreateTableQuery() - - /** - * Create a basic SQL query for a new table creation - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * @param array $options An associative array of table options - * - * @return mixed string (the SQL query) on success, a MDB2 error on failure - * @see createTable() - */ - function _getCreateTableQuery($name, $fields, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!$name) { - return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, - 'no valid table name specified', __FUNCTION__); - } - if (empty($fields)) { - return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, - 'no fields specified for table "'.$name.'"', __FUNCTION__); - } - $query_fields = $this->getFieldDeclarationList($fields); - if (PEAR::isError($query_fields)) { - return $query_fields; - } - if (!empty($options['primary'])) { - $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')'; - } - - $name = $db->quoteIdentifier($name, true); - $result = 'CREATE '; - if (!empty($options['temporary'])) { - $result .= $this->_getTemporaryTableQuery(); - } - $result .= " TABLE $name ($query_fields)"; - return $result; - } - - // }}} - // {{{ _getTemporaryTableQuery() - - /** - * A method to return the required SQL string that fits between CREATE ... TABLE - * to create the table as a temporary table. - * - * Should be overridden in driver classes to return the correct string for the - * specific database type. - * - * The default is to return the string "TEMPORARY" - this will result in a - * SQL error for any database that does not support temporary tables, or that - * requires a different SQL command from "CREATE TEMPORARY TABLE". - * - * @return string The string required to be placed between "CREATE" and "TABLE" - * to generate a temporary table, if possible. - */ - function _getTemporaryTableQuery() - { - return 'TEMPORARY'; - } - - // }}} - // {{{ createTable() - - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * array( - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'temporary' => true|false, - * ); - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createTable($name, $fields, $options = array()) - { - $query = $this->_getCreateTableQuery($name, $fields, $options); - if (PEAR::isError($query)) { - return $query; - } - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $result = $db->exec($query); - if (PEAR::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropTable() - - /** - * drop an existing table - * - * @param string $name name of the table that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("DROP TABLE $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ truncateTable() - - /** - * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, - * it falls back to a DELETE FROM TABLE query) - * - * @param string $name name of the table that should be truncated - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function truncateTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("DELETE FROM $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ vacuum() - - /** - * Optimize (vacuum) all the tables in the db (or only the specified table) - * and optionally run ANALYZE. - * - * @param string $table table name (all the tables if empty) - * @param array $options an array with driver-specific options: - * - timeout [int] (in seconds) [mssql-only] - * - analyze [boolean] [pgsql and mysql] - * - full [boolean] [pgsql-only] - * - freeze [boolean] [pgsql-only] - * - * @return mixed MDB2_OK success, a MDB2 error on failure - * @access public - */ - function vacuum($table = null, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ alterTable() - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the MDB2 parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the MDB2 parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @access public - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function alterTable($name, $changes, $check) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listDatabases() - - /** - * list all databases - * - * @return mixed array of database names on success, a MDB2 error on failure - * @access public - */ - function listDatabases() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implementedd', __FUNCTION__); - } - - // }}} - // {{{ listUsers() - - /** - * list all users - * - * @return mixed array of user names on success, a MDB2 error on failure - * @access public - */ - function listUsers() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listViews() - - /** - * list all views in the current database - * - * @param string database, the current is default - * NB: not all the drivers can get the view names from - * a database other than the current one - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listViews($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listTableViews() - - /** - * list the views in the database that reference a given table - * - * @param string table for which all referenced views should be found - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listTableViews($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listTableTriggers() - - /** - * list all triggers in the database that reference a given table - * - * @param string table for which all referenced triggers should be found - * @return mixed array of trigger names on success, a MDB2 error on failure - * @access public - */ - function listTableTriggers($table = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listFunctions() - - /** - * list all functions in the current database - * - * @return mixed array of function names on success, a MDB2 error on failure - * @access public - */ - function listFunctions() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listTables() - - /** - * list all tables in the current database - * - * @param string database, the current is default. - * NB: not all the drivers can get the table names from - * a database other than the current one - * @return mixed array of table names on success, a MDB2 error on failure - * @access public - */ - function listTables($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listTableFields() - - /** - * list all fields in a table in the current database - * - * @param string $table name of table that should be used in method - * @return mixed array of field names on success, a MDB2 error on failure - * @access public - */ - function listTableFields($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ createIndex() - - /** - * Get the stucture of a field into an array - * - * @param string $table name of the table on which the index is to be created - * @param string $name name of the index to be created - * @param array $definition associative array that defines properties of the index to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the index fields as array - * indexes. Each entry of this array is set to another type of associative - * array that specifies properties of the index that are specific to - * each field. - * - * Currently, only the sorting property is supported. It should be used - * to define the sorting direction of the index. It may be set to either - * ascending or descending. - * - * Not all DBMS support index sorting direction configuration. The DBMS - * drivers of those that do not support it ignore this property. Use the - * function supports() to determine whether the DBMS driver can manage indexes. - * - * Example - * array( - * 'fields' => array( - * 'user_name' => array( - * 'sorting' => 'ascending' - * ), - * 'last_login' => array() - * ) - * ) - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createIndex($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "CREATE INDEX $name ON $table"; - $fields = array(); - foreach (array_keys($definition['fields']) as $field) { - $fields[] = $db->quoteIdentifier($field, true); - } - $query .= ' ('. implode(', ', $fields) . ')'; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropIndex() - - /** - * drop existing index - * - * @param string $table name of table that should be used in method - * @param string $name name of the index to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropIndex($table, $name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $result = $db->exec("DROP INDEX $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listTableIndexes() - - /** - * list all indexes in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of index names on success, a MDB2 error on failure - * @access public - */ - function listTableIndexes($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ _getAdvancedFKOptions() - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param array $definition - * @return string - * @access protected - */ - function _getAdvancedFKOptions($definition) - { - return ''; - } - - // }}} - // {{{ createConstraint() - - /** - * create a constraint on a table - * - * @param string $table name of the table on which the constraint is to be created - * @param string $name name of the constraint to be created - * @param array $definition associative array that defines properties of the constraint to be created. - * The full structure of the array looks like this: - *
    -     *          array (
    -     *              [primary] => 0
    -     *              [unique]  => 0
    -     *              [foreign] => 1
    -     *              [check]   => 0
    -     *              [fields] => array (
    -     *                  [field1name] => array() // one entry per each field covered
    -     *                  [field2name] => array() // by the index
    -     *                  [field3name] => array(
    -     *                      [sorting]  => ascending
    -     *                      [position] => 3
    -     *                  )
    -     *              )
    -     *              [references] => array(
    -     *                  [table] => name
    -     *                  [fields] => array(
    -     *                      [field1name] => array(  //one entry per each referenced field
    -     *                           [position] => 1
    -     *                      )
    -     *                  )
    -     *              )
    -     *              [deferrable] => 0
    -     *              [initiallydeferred] => 0
    -     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
    -     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
    -     *              [match] => SIMPLE|PARTIAL|FULL
    -     *          );
    -     *          
    - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createConstraint($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "ALTER TABLE $table ADD CONSTRAINT $name"; - if (!empty($definition['primary'])) { - $query.= ' PRIMARY KEY'; - } elseif (!empty($definition['unique'])) { - $query.= ' UNIQUE'; - } elseif (!empty($definition['foreign'])) { - $query.= ' FOREIGN KEY'; - } - $fields = array(); - foreach (array_keys($definition['fields']) as $field) { - $fields[] = $db->quoteIdentifier($field, true); - } - $query .= ' ('. implode(', ', $fields) . ')'; - if (!empty($definition['foreign'])) { - $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true); - $referenced_fields = array(); - foreach (array_keys($definition['references']['fields']) as $field) { - $referenced_fields[] = $db->quoteIdentifier($field, true); - } - $query .= ' ('. implode(', ', $referenced_fields) . ')'; - $query .= $this->_getAdvancedFKOptions($definition); - } - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropConstraint() - - /** - * drop existing constraint - * - * @param string $table name of table that should be used in method - * @param string $name name of the constraint to be dropped - * @param string $primary hint if the constraint is primary - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropConstraint($table, $name, $primary = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $result = $db->exec("ALTER TABLE $table DROP CONSTRAINT $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listTableConstraints() - - /** - * list all constraints in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of constraint names on success, a MDB2 error on failure - * @access public - */ - function listTableConstraints($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ createSequence() - - /** - * create sequence - * - * @param string $seq_name name of the sequence to be created - * @param string $start start value of the sequence; default is 1 - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createSequence($seq_name, $start = 1) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ dropSequence() - - /** - * drop existing sequence - * - * @param string $seq_name name of the sequence to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropSequence($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ listSequences() - - /** - * list all sequences in the current database - * - * @param string database, the current is default - * NB: not all the drivers can get the sequence names from - * a database other than the current one - * @return mixed array of sequence names on success, a MDB2 error on failure - * @access public - */ - function listSequences($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} -} -?> diff --git a/3rdparty/MDB2/Driver/Manager/mysql.php b/3rdparty/MDB2/Driver/Manager/mysql.php deleted file mode 100644 index c663c0c5d2..0000000000 --- a/3rdparty/MDB2/Driver/Manager/mysql.php +++ /dev/null @@ -1,1471 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Manager/Common.php'; - -/** - * MDB2 MySQL driver for the management modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common -{ - - // }}} - // {{{ createDatabase() - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @param array $options array with charset, collation info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $query = 'CREATE DATABASE ' . $name; - if (!empty($options['charset'])) { - $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text'); - } - if (!empty($options['collation'])) { - $query .= ' COLLATE ' . $db->quote($options['collation'], 'text'); - } - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ alterDatabase() - - /** - * alter an existing database - * - * @param string $name name of the database that is intended to be changed - * @param array $options array with charset, collation info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function alterDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true); - if (!empty($options['charset'])) { - $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text'); - } - if (!empty($options['collation'])) { - $query .= ' COLLATE ' . $db->quote($options['collation'], 'text'); - } - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ dropDatabase() - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropDatabase($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $query = "DROP DATABASE $name"; - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ _getAdvancedFKOptions() - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param array $definition - * @return string - * @access protected - */ - function _getAdvancedFKOptions($definition) - { - $query = ''; - if (!empty($definition['match'])) { - $query .= ' MATCH '.$definition['match']; - } - if (!empty($definition['onupdate'])) { - $query .= ' ON UPDATE '.$definition['onupdate']; - } - if (!empty($definition['ondelete'])) { - $query .= ' ON DELETE '.$definition['ondelete']; - } - return $query; - } - - // }}} - // {{{ createTable() - - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * array( - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'charset' => 'utf8', - * 'collate' => 'utf8_unicode_ci', - * 'type' => 'innodb', - * ); - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createTable($name, $fields, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - // if we have an AUTO_INCREMENT column and a PK on more than one field, - // we have to handle it differently... - $autoincrement = null; - if (empty($options['primary'])) { - $pk_fields = array(); - foreach ($fields as $fieldname => $def) { - if (!empty($def['primary'])) { - $pk_fields[$fieldname] = true; - } - if (!empty($def['autoincrement'])) { - $autoincrement = $fieldname; - } - } - if ((null !== $autoincrement) && count($pk_fields) > 1) { - $options['primary'] = $pk_fields; - } else { - // the PK constraint is on max one field => OK - $autoincrement = null; - } - } - - $query = $this->_getCreateTableQuery($name, $fields, $options); - if (PEAR::isError($query)) { - return $query; - } - - if (null !== $autoincrement) { - // we have to remove the PK clause added by _getIntegerDeclaration() - $query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query); - } - - $options_strings = array(); - - if (!empty($options['comment'])) { - $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text'); - } - - if (!empty($options['charset'])) { - $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset']; - if (!empty($options['collate'])) { - $options_strings['charset'].= ' COLLATE '.$options['collate']; - } - } - - $type = false; - if (!empty($options['type'])) { - $type = $options['type']; - } elseif ($db->options['default_table_type']) { - $type = $db->options['default_table_type']; - } - if ($type) { - $options_strings[] = "ENGINE = $type"; - } - - if (!empty($options_strings)) { - $query .= ' '.implode(' ', $options_strings); - } - $result = $db->exec($query); - if (PEAR::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropTable() - - /** - * drop an existing table - * - * @param string $name name of the table that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - //delete the triggers associated to existing FK constraints - $constraints = $this->listTableConstraints($name); - if (!PEAR::isError($constraints) && !empty($constraints)) { - $db->loadModule('Reverse', null, true); - foreach ($constraints as $constraint) { - $definition = $db->reverse->getTableConstraintDefinition($name, $constraint); - if (!PEAR::isError($definition) && !empty($definition['foreign'])) { - $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - - return parent::dropTable($name); - } - - // }}} - // {{{ truncateTable() - - /** - * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, - * it falls back to a DELETE FROM TABLE query) - * - * @param string $name name of the table that should be truncated - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function truncateTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("TRUNCATE TABLE $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ vacuum() - - /** - * Optimize (vacuum) all the tables in the db (or only the specified table) - * and optionally run ANALYZE. - * - * @param string $table table name (all the tables if empty) - * @param array $options an array with driver-specific options: - * - timeout [int] (in seconds) [mssql-only] - * - analyze [boolean] [pgsql and mysql] - * - full [boolean] [pgsql-only] - * - freeze [boolean] [pgsql-only] - * - * @return mixed MDB2_OK success, a MDB2 error on failure - * @access public - */ - function vacuum($table = null, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($table)) { - $table = $this->listTables(); - if (PEAR::isError($table)) { - return $table; - } - } - if (is_array($table)) { - foreach (array_keys($table) as $k) { - $table[$k] = $db->quoteIdentifier($table[$k], true); - } - $table = implode(', ', $table); - } else { - $table = $db->quoteIdentifier($table, true); - } - - $result = $db->exec('OPTIMIZE TABLE '.$table); - if (PEAR::isError($result)) { - return $result; - } - if (!empty($options['analyze'])) { - $result = $db->exec('ANALYZE TABLE '.$table); - if (MDB2::isError($result)) { - return $result; - } - } - return MDB2_OK; - } - - // }}} - // {{{ alterTable() - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the MDB2 parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the MDB2 parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @access public - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function alterTable($name, $changes, $check) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - foreach ($changes as $change_name => $change) { - switch ($change_name) { - case 'add': - case 'remove': - case 'change': - case 'rename': - case 'name': - break; - default: - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'change type "'.$change_name.'" not yet supported', __FUNCTION__); - } - } - - if ($check) { - return MDB2_OK; - } - - $query = ''; - if (!empty($changes['name'])) { - $change_name = $db->quoteIdentifier($changes['name'], true); - $query .= 'RENAME TO ' . $change_name; - } - - if (!empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $field_name => $field) { - if ($query) { - $query.= ', '; - } - $query.= 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field); - } - } - - if (!empty($changes['remove']) && is_array($changes['remove'])) { - foreach ($changes['remove'] as $field_name => $field) { - if ($query) { - $query.= ', '; - } - $field_name = $db->quoteIdentifier($field_name, true); - $query.= 'DROP ' . $field_name; - } - } - - $rename = array(); - if (!empty($changes['rename']) && is_array($changes['rename'])) { - foreach ($changes['rename'] as $field_name => $field) { - $rename[$field['name']] = $field_name; - } - } - - if (!empty($changes['change']) && is_array($changes['change'])) { - foreach ($changes['change'] as $field_name => $field) { - if ($query) { - $query.= ', '; - } - if (isset($rename[$field_name])) { - $old_field_name = $rename[$field_name]; - unset($rename[$field_name]); - } else { - $old_field_name = $field_name; - } - $old_field_name = $db->quoteIdentifier($old_field_name, true); - $query.= "CHANGE $old_field_name " . $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']); - } - } - - if (!empty($rename) && is_array($rename)) { - foreach ($rename as $rename_name => $renamed_field) { - if ($query) { - $query.= ', '; - } - $field = $changes['rename'][$renamed_field]; - $renamed_field = $db->quoteIdentifier($renamed_field, true); - $query.= 'CHANGE ' . $renamed_field . ' ' . $db->getDeclaration($field['definition']['type'], $field['name'], $field['definition']); - } - } - - if (!$query) { - return MDB2_OK; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("ALTER TABLE $name $query"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listDatabases() - - /** - * list all databases - * - * @return mixed array of database names on success, a MDB2 error on failure - * @access public - */ - function listDatabases() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->queryCol('SHOW DATABASES'); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listUsers() - - /** - * list all users - * - * @return mixed array of user names on success, a MDB2 error on failure - * @access public - */ - function listUsers() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->queryCol('SELECT DISTINCT USER FROM mysql.USER'); - } - - // }}} - // {{{ listFunctions() - - /** - * list all functions in the current database - * - * @return mixed array of function names on success, a MDB2 error on failure - * @access public - */ - function listFunctions() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name FROM mysql.proc"; - /* - SELECT ROUTINE_NAME - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE = 'FUNCTION' - */ - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableTriggers() - - /** - * list all triggers in the database that reference a given table - * - * @param string table for which all referenced triggers should be found - * @return mixed array of trigger names on success, a MDB2 error on failure - * @access public - */ - function listTableTriggers($table = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SHOW TRIGGERS'; - if (null !== $table) { - $table = $db->quote($table, 'text'); - $query .= " LIKE $table"; - } - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTables() - - /** - * list all tables in the current database - * - * @param string database, the current is default - * @return mixed array of table names on success, a MDB2 error on failure - * @access public - */ - function listTables($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SHOW /*!50002 FULL*/ TABLES"; - if (null !== $database) { - $query .= " FROM $database"; - } - $query.= "/*!50002 WHERE Table_type = 'BASE TABLE'*/"; - - $table_names = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED); - if (PEAR::isError($table_names)) { - return $table_names; - } - - $result = array(); - foreach ($table_names as $table) { - if (!$this->_fixSequenceName($table[0], true)) { - $result[] = $table[0]; - } - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listViews() - - /** - * list all views in the current database - * - * @param string database, the current is default - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listViews($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SHOW FULL TABLES'; - if (null !== $database) { - $query.= " FROM $database"; - } - $query.= " WHERE Table_type = 'VIEW'"; - - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableFields() - - /** - * list all fields in a table in the current database - * - * @param string $table name of table that should be used in method - * @return mixed array of field names on success, a MDB2 error on failure - * @access public - */ - function listTableFields($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $result = $db->queryCol("SHOW COLUMNS FROM $table"); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ createIndex() - - /** - * Get the stucture of a field into an array - * - * @author Leoncx - * @param string $table name of the table on which the index is to be created - * @param string $name name of the index to be created - * @param array $definition associative array that defines properties of the index to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the index fields as array - * indexes. Each entry of this array is set to another type of associative - * array that specifies properties of the index that are specific to - * each field. - * - * Currently, only the sorting property is supported. It should be used - * to define the sorting direction of the index. It may be set to either - * ascending or descending. - * - * Not all DBMS support index sorting direction configuration. The DBMS - * drivers of those that do not support it ignore this property. Use the - * function supports() to determine whether the DBMS driver can manage indexes. - * - * Example - * array( - * 'fields' => array( - * 'user_name' => array( - * 'sorting' => 'ascending' - * 'length' => 10 - * ), - * 'last_login' => array() - * ) - * ) - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createIndex($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "CREATE INDEX $name ON $table"; - $fields = array(); - foreach ($definition['fields'] as $field => $fieldinfo) { - if (!empty($fieldinfo['length'])) { - $fields[] = $db->quoteIdentifier($field, true) . '(' . $fieldinfo['length'] . ')'; - } else { - $fields[] = $db->quoteIdentifier($field, true); - } - } - $query .= ' ('. implode(', ', $fields) . ')'; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropIndex() - - /** - * drop existing index - * - * @param string $table name of table that should be used in method - * @param string $name name of the index to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropIndex($table, $name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $result = $db->exec("DROP INDEX $name ON $table"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listTableIndexes() - - /** - * list all indexes in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of index names on success, a MDB2 error on failure - * @access public - */ - function listTableIndexes($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $key_name = 'Key_name'; - $non_unique = 'Non_unique'; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $key_name = strtolower($key_name); - $non_unique = strtolower($non_unique); - } else { - $key_name = strtoupper($key_name); - $non_unique = strtoupper($non_unique); - } - } - - $table = $db->quoteIdentifier($table, true); - $query = "SHOW INDEX FROM $table"; - $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $result = array(); - foreach ($indexes as $index_data) { - if ($index_data[$non_unique] && ($index = $this->_fixIndexName($index_data[$key_name]))) { - $result[$index] = true; - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ createConstraint() - - /** - * create a constraint on a table - * - * @param string $table name of the table on which the constraint is to be created - * @param string $name name of the constraint to be created - * @param array $definition associative array that defines properties of the constraint to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the constraint fields as array - * constraints. Each entry of this array is set to another type of associative - * array that specifies properties of the constraint that are specific to - * each field. - * - * Example - * array( - * 'fields' => array( - * 'user_name' => array(), - * 'last_login' => array() - * ) - * ) - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createConstraint($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $type = ''; - $idx_name = $db->quoteIdentifier($db->getIndexName($name), true); - if (!empty($definition['primary'])) { - $type = 'PRIMARY'; - $idx_name = 'KEY'; - } elseif (!empty($definition['unique'])) { - $type = 'UNIQUE'; - } elseif (!empty($definition['foreign'])) { - $type = 'CONSTRAINT'; - } - if (empty($type)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'invalid definition, could not create constraint', __FUNCTION__); - } - - $table_quoted = $db->quoteIdentifier($table, true); - $query = "ALTER TABLE $table_quoted ADD $type $idx_name"; - if (!empty($definition['foreign'])) { - $query .= ' FOREIGN KEY'; - } - $fields = array(); - foreach ($definition['fields'] as $field => $fieldinfo) { - $quoted = $db->quoteIdentifier($field, true); - if (!empty($fieldinfo['length'])) { - $quoted .= '(' . $fieldinfo['length'] . ')'; - } - $fields[] = $quoted; - } - $query .= ' ('. implode(', ', $fields) . ')'; - if (!empty($definition['foreign'])) { - $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true); - $referenced_fields = array(); - foreach (array_keys($definition['references']['fields']) as $field) { - $referenced_fields[] = $db->quoteIdentifier($field, true); - } - $query .= ' ('. implode(', ', $referenced_fields) . ')'; - $query .= $this->_getAdvancedFKOptions($definition); - - // add index on FK column(s) or we can't add a FK constraint - // @see http://forums.mysql.com/read.php?22,19755,226009 - $result = $this->createIndex($table, $name.'_fkidx', $definition); - if (PEAR::isError($result)) { - return $result; - } - } - $res = $db->exec($query); - if (PEAR::isError($res)) { - return $res; - } - if (!empty($definition['foreign'])) { - return $this->_createFKTriggers($table, array($name => $definition)); - } - return MDB2_OK; - } - - // }}} - // {{{ dropConstraint() - - /** - * drop existing constraint - * - * @param string $table name of table that should be used in method - * @param string $name name of the constraint to be dropped - * @param string $primary hint if the constraint is primary - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropConstraint($table, $name, $primary = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($primary || strtolower($name) == 'primary') { - $query = 'ALTER TABLE '. $db->quoteIdentifier($table, true) .' DROP PRIMARY KEY'; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - //is it a FK constraint? If so, also delete the associated triggers - $db->loadModule('Reverse', null, true); - $definition = $db->reverse->getTableConstraintDefinition($table, $name); - if (!PEAR::isError($definition) && !empty($definition['foreign'])) { - //first drop the FK enforcing triggers - $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); - if (PEAR::isError($result)) { - return $result; - } - //then drop the constraint itself - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "ALTER TABLE $table DROP FOREIGN KEY $name"; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "ALTER TABLE $table DROP INDEX $name"; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ _createFKTriggers() - - /** - * Create triggers to enforce the FOREIGN KEY constraint on the table - * - * NB: since there's no RAISE_APPLICATION_ERROR facility in mysql, - * we call a non-existent procedure to raise the FK violation message. - * @see http://forums.mysql.com/read.php?99,55108,71877#msg-71877 - * - * @param string $table table name - * @param array $foreign_keys FOREIGN KEY definitions - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _createFKTriggers($table, $foreign_keys) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - // create triggers to enforce FOREIGN KEY constraints - if ($db->supports('triggers') && !empty($foreign_keys)) { - $table_quoted = $db->quoteIdentifier($table, true); - foreach ($foreign_keys as $fkname => $fkdef) { - if (empty($fkdef)) { - continue; - } - //set actions to default if not set - $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); - $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']); - - $trigger_names = array( - 'insert' => $fkname.'_insert_trg', - 'update' => $fkname.'_update_trg', - 'pk_update' => $fkname.'_pk_update_trg', - 'pk_delete' => $fkname.'_pk_delete_trg', - ); - $table_fields = array_keys($fkdef['fields']); - $referenced_fields = array_keys($fkdef['references']['fields']); - - //create the ON [UPDATE|DELETE] triggers on the primary table - $restrict_action = ' IF (SELECT '; - $aliased_fields = array(); - foreach ($table_fields as $field) { - $aliased_fields[] = $table_quoted .'.'.$field .' AS '.$field; - } - $restrict_action .= implode(',', $aliased_fields) - .' FROM '.$table_quoted - .' WHERE '; - $conditions = array(); - $new_values = array(); - $null_values = array(); - for ($i=0; $i OLD.'.$referenced_fields[$i]; - } - - $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'; - $restrict_action2 = empty($conditions2) ? '' : ' AND (' .implode(' OR ', $conditions2) .')'; - $restrict_action3 = ' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();' - .' END IF;'; - - $restrict_action_update = $restrict_action . $restrict_action2 . $restrict_action3; - $restrict_action_delete = $restrict_action . $restrict_action3; // There is no NEW row in on DELETE trigger - - $cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';'; - $cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';'; - $setnull_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions). ';'; - - if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) { - $db->loadModule('Reverse', null, true); - $default_values = array(); - foreach ($table_fields as $table_field) { - $field_definition = $db->reverse->getTableFieldDefinition($table, $field); - if (PEAR::isError($field_definition)) { - return $field_definition; - } - $default_values[] = $table_field .' = '. $field_definition[0]['default']; - } - $setdefault_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; - } - - $query = 'CREATE TRIGGER %s' - .' %s ON '.$fkdef['references']['table'] - .' FOR EACH ROW BEGIN ' - .' SET FOREIGN_KEY_CHECKS = 0; '; //only really needed for ON UPDATE CASCADE - - if ('CASCADE' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $cascade_action_update; - } elseif ('SET NULL' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action; - } elseif ('SET DEFAULT' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action; - } elseif ('NO ACTION' == $fkdef['onupdate']) { - $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'AFTER UPDATE', 'update'); - } elseif ('RESTRICT' == $fkdef['onupdate']) { - $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update'); - } - if ('CASCADE' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $cascade_action_delete; - } elseif ('SET NULL' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action; - } elseif ('SET DEFAULT' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action; - } elseif ('NO ACTION' == $fkdef['ondelete']) { - $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete'); - } elseif ('RESTRICT' == $fkdef['ondelete']) { - $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete'); - } - $sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;'; - $sql_delete .= ' SET FOREIGN_KEY_CHECKS = 1; END;'; - - $db->pushErrorHandling(PEAR_ERROR_RETURN); - $db->expectError(MDB2_ERROR_CANNOT_CREATE); - $result = $db->exec($sql_delete); - $expected_errmsg = 'This MySQL version doesn\'t support multiple triggers with the same action time and event for one table'; - $db->popExpect(); - $db->popErrorHandling(); - if (PEAR::isError($result)) { - if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) { - return $result; - } - $db->warnings[] = $expected_errmsg; - } - $db->pushErrorHandling(PEAR_ERROR_RETURN); - $db->expectError(MDB2_ERROR_CANNOT_CREATE); - $result = $db->exec($sql_update); - $db->popExpect(); - $db->popErrorHandling(); - if (PEAR::isError($result) && $result->getCode() != MDB2_ERROR_CANNOT_CREATE) { - if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) { - return $result; - } - $db->warnings[] = $expected_errmsg; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ _dropFKTriggers() - - /** - * Drop the triggers created to enforce the FOREIGN KEY constraint on the table - * - * @param string $table table name - * @param string $fkname FOREIGN KEY constraint name - * @param string $referenced_table referenced table name - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _dropFKTriggers($table, $fkname, $referenced_table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $triggers = $this->listTableTriggers($table); - $triggers2 = $this->listTableTriggers($referenced_table); - if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { - $triggers = array_merge($triggers, $triggers2); - $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i'; - foreach ($triggers as $trigger) { - if (preg_match($pattern, $trigger)) { - $result = $db->exec('DROP TRIGGER '.$trigger); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ listTableConstraints() - - /** - * list all constraints in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of constraint names on success, a MDB2 error on failure - * @access public - */ - function listTableConstraints($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $key_name = 'Key_name'; - $non_unique = 'Non_unique'; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $key_name = strtolower($key_name); - $non_unique = strtolower($non_unique); - } else { - $key_name = strtoupper($key_name); - $non_unique = strtoupper($non_unique); - } - } - - $query = 'SHOW INDEX FROM ' . $db->quoteIdentifier($table, true); - $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $result = array(); - foreach ($indexes as $index_data) { - if (!$index_data[$non_unique]) { - if ($index_data[$key_name] !== 'PRIMARY') { - $index = $this->_fixIndexName($index_data[$key_name]); - } else { - $index = 'PRIMARY'; - } - if (!empty($index)) { - $result[$index] = true; - } - } - } - - //list FOREIGN KEY constraints... - $query = 'SHOW CREATE TABLE '. $db->escape($table); - $definition = $db->queryOne($query, 'text', 1); - if (!PEAR::isError($definition) && !empty($definition)) { - $pattern = '/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN KEY\b/Uims'; - if (preg_match_all($pattern, str_replace('`', '', $definition), $matches) > 0) { - foreach ($matches[1] as $constraint) { - $result[$constraint] = true; - } - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ createSequence() - - /** - * create sequence - * - * @param string $seq_name name of the sequence to be created - * @param string $start start value of the sequence; default is 1 - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'charset' => 'utf8', - * 'collate' => 'utf8_unicode_ci', - * 'type' => 'innodb', - * ); - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createSequence($seq_name, $start = 1, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true); - - $options_strings = array(); - - if (!empty($options['comment'])) { - $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text'); - } - - if (!empty($options['charset'])) { - $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset']; - if (!empty($options['collate'])) { - $options_strings['charset'].= ' COLLATE '.$options['collate']; - } - } - - $type = false; - if (!empty($options['type'])) { - $type = $options['type']; - } elseif ($db->options['default_table_type']) { - $type = $db->options['default_table_type']; - } - if ($type) { - $options_strings[] = "ENGINE = $type"; - } - - $query = "CREATE TABLE $sequence_name ($seqcol_name INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ($seqcol_name))"; - if (!empty($options_strings)) { - $query .= ' '.implode(' ', $options_strings); - } - $res = $db->exec($query); - if (PEAR::isError($res)) { - return $res; - } - - if ($start == 1) { - return MDB2_OK; - } - - $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')'; - $res = $db->exec($query); - if (!PEAR::isError($res)) { - return MDB2_OK; - } - - // Handle error - $result = $db->exec("DROP TABLE $sequence_name"); - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'could not drop inconsistent sequence table', __FUNCTION__); - } - - return $db->raiseError($res, null, null, - 'could not create sequence table', __FUNCTION__); - } - - // }}} - // {{{ dropSequence() - - /** - * drop existing sequence - * - * @param string $seq_name name of the sequence to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropSequence($seq_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $result = $db->exec("DROP TABLE $sequence_name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listSequences() - - /** - * list all sequences in the current database - * - * @param string database, the current is default - * @return mixed array of sequence names on success, a MDB2 error on failure - * @access public - */ - function listSequences($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SHOW TABLES"; - if (null !== $database) { - $query .= " FROM $database"; - } - $table_names = $db->queryCol($query); - if (PEAR::isError($table_names)) { - return $table_names; - } - - $result = array(); - foreach ($table_names as $table_name) { - if ($sqn = $this->_fixSequenceName($table_name, true)) { - $result[] = $sqn; - } - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} -} -?> diff --git a/3rdparty/MDB2/Driver/Manager/oci8.php b/3rdparty/MDB2/Driver/Manager/oci8.php deleted file mode 100644 index 90ae8eb230..0000000000 --- a/3rdparty/MDB2/Driver/Manager/oci8.php +++ /dev/null @@ -1,1340 +0,0 @@ - | -// +----------------------------------------------------------------------+ - -// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ - -require_once 'MDB2/Driver/Manager/Common.php'; - -/** - * MDB2 oci8 driver for the management modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Manager_oci8 extends MDB2_Driver_Manager_Common -{ - // {{{ createDatabase() - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @param array $options array with charset, collation info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $username = $db->options['database_name_prefix'].$name; - $password = $db->dsn['password'] ? $db->dsn['password'] : $name; - $tablespace = $db->options['default_tablespace'] - ? ' DEFAULT TABLESPACE '.$db->options['default_tablespace'] : ''; - - $query = 'CREATE USER '.$username.' IDENTIFIED BY '.$password.$tablespace; - $result = $db->standaloneQuery($query, null, true); - if (PEAR::isError($result)) { - return $result; - } - $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '.$username; - $result = $db->standaloneQuery($query, null, true); - if (PEAR::isError($result)) { - $query = 'DROP USER '.$username.' CASCADE'; - $result2 = $db->standaloneQuery($query, null, true); - if (PEAR::isError($result2)) { - return $db->raiseError($result2, null, null, - 'could not setup the database user', __FUNCTION__); - } - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ alterDatabase() - - /** - * alter an existing database - * - * IMPORTANT: the safe way to change the db charset is to do a full import/export! - * If - and only if - the new character set is a strict superset of the current - * character set, it is possible to use the ALTER DATABASE CHARACTER SET to - * expedite the change in the database character set. - * - * @param string $name name of the database that is intended to be changed - * @param array $options array with name, charset info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function alterDatabase($name, $options = array()) - { - //disabled - //return parent::alterDatabase($name, $options); - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($options['name'])) { - $query = 'ALTER DATABASE ' . $db->quoteIdentifier($name, true) - .' RENAME GLOBAL_NAME TO ' . $db->quoteIdentifier($options['name'], true); - $result = $db->standaloneQuery($query); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($options['charset'])) { - $queries = array(); - $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL - $queries[] = 'STARTUP MOUNT'; - $queries[] = 'ALTER SYSTEM ENABLE RESTRICTED SESSION'; - $queries[] = 'ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0'; - $queries[] = 'ALTER DATABASE OPEN'; - $queries[] = 'ALTER DATABASE CHARACTER SET ' . $options['charset']; - $queries[] = 'ALTER DATABASE NATIONAL CHARACTER SET ' . $options['charset']; - $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL - $queries[] = 'STARTUP'; - - foreach ($queries as $query) { - $result = $db->standaloneQuery($query); - if (PEAR::isError($result)) { - return $result; - } - } - } - - return MDB2_OK; - } - - // }}} - // {{{ dropDatabase() - - /** - * drop an existing database - * - * @param object $db database object that is extended by this class - * @param string $name name of the database that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropDatabase($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $username = $db->options['database_name_prefix'].$name; - return $db->standaloneQuery('DROP USER '.$username.' CASCADE', null, true); - } - - - // }}} - // {{{ _makeAutoincrement() - - /** - * add an autoincrement sequence + trigger - * - * @param string $name name of the PK field - * @param string $table name of the table - * @param string $start start value for the sequence - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _makeAutoincrement($name, $table, $start = 1) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table_uppercase = strtoupper($table); - $index_name = $table_uppercase . '_AI_PK'; - $definition = array( - 'primary' => true, - 'fields' => array($name => true), - ); - $idxname_format = $db->getOption('idxname_format'); - $db->setOption('idxname_format', '%s'); - $result = $this->createConstraint($table, $index_name, $definition); - $db->setOption('idxname_format', $idxname_format); - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'primary key for autoincrement PK could not be created', __FUNCTION__); - } - - if (null === $start) { - $db->beginTransaction(); - $query = 'SELECT MAX(' . $db->quoteIdentifier($name, true) . ') FROM ' . $db->quoteIdentifier($table, true); - $start = $this->db->queryOne($query, 'integer'); - if (PEAR::isError($start)) { - return $start; - } - ++$start; - $result = $this->createSequence($table, $start); - $db->commit(); - } else { - $result = $this->createSequence($table, $start); - } - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'sequence for autoincrement PK could not be created', __FUNCTION__); - } - $seq_name = $db->getSequenceName($table); - $trigger_name = $db->quoteIdentifier($table_uppercase . '_AI_PK', true); - $seq_name_quoted = $db->quoteIdentifier($seq_name, true); - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($name, true); - $trigger_sql = ' -CREATE TRIGGER '.$trigger_name.' - BEFORE INSERT - ON '.$table.' - FOR EACH ROW -DECLARE - last_Sequence NUMBER; - last_InsertID NUMBER; -BEGIN - SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; - IF (:NEW.'.$name.' IS NULL OR :NEW.'.$name.' = 0) THEN - SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; - ELSE - SELECT NVL(Last_Number, 0) INTO last_Sequence - FROM User_Sequences - WHERE UPPER(Sequence_Name) = UPPER(\''.$seq_name.'\'); - SELECT :NEW.'.$name.' INTO last_InsertID FROM DUAL; - WHILE (last_InsertID > last_Sequence) LOOP - SELECT '.$seq_name_quoted.'.NEXTVAL INTO last_Sequence FROM DUAL; - END LOOP; - END IF; -END; -'; - $result = $db->exec($trigger_sql); - if (PEAR::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ _dropAutoincrement() - - /** - * drop an existing autoincrement sequence + trigger - * - * @param string $table name of the table - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _dropAutoincrement($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = strtoupper($table); - $trigger_name = $table . '_AI_PK'; - $trigger_name_quoted = $db->quote($trigger_name, 'text'); - $query = 'SELECT trigger_name FROM user_triggers'; - $query.= ' WHERE trigger_name='.$trigger_name_quoted.' OR trigger_name='.strtoupper($trigger_name_quoted); - $trigger = $db->queryOne($query); - if (PEAR::isError($trigger)) { - return $trigger; - } - - if ($trigger) { - $trigger_name = $db->quoteIdentifier($table . '_AI_PK', true); - $trigger_sql = 'DROP TRIGGER ' . $trigger_name; - $result = $db->exec($trigger_sql); - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'trigger for autoincrement PK could not be dropped', __FUNCTION__); - } - - $result = $this->dropSequence($table); - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'sequence for autoincrement PK could not be dropped', __FUNCTION__); - } - - $index_name = $table . '_AI_PK'; - $idxname_format = $db->getOption('idxname_format'); - $db->setOption('idxname_format', '%s'); - $result1 = $this->dropConstraint($table, $index_name); - $db->setOption('idxname_format', $idxname_format); - $result2 = $this->dropConstraint($table, $index_name); - if (PEAR::isError($result1) && PEAR::isError($result2)) { - return $db->raiseError($result1, null, null, - 'primary key for autoincrement PK could not be dropped', __FUNCTION__); - } - } - - return MDB2_OK; - } - - // }}} - // {{{ _getTemporaryTableQuery() - - /** - * A method to return the required SQL string that fits between CREATE ... TABLE - * to create the table as a temporary table. - * - * @return string The string required to be placed between "CREATE" and "TABLE" - * to generate a temporary table, if possible. - */ - function _getTemporaryTableQuery() - { - return 'GLOBAL TEMPORARY'; - } - - // }}} - // {{{ _getAdvancedFKOptions() - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param array $definition - * @return string - * @access protected - */ - function _getAdvancedFKOptions($definition) - { - $query = ''; - if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) { - $query .= ' ON DELETE '.$definition['ondelete']; - } - if (!empty($definition['deferrable'])) { - $query .= ' DEFERRABLE'; - } else { - $query .= ' NOT DEFERRABLE'; - } - if (!empty($definition['initiallydeferred'])) { - $query .= ' INITIALLY DEFERRED'; - } else { - $query .= ' INITIALLY IMMEDIATE'; - } - return $query; - } - - // }}} - // {{{ createTable() - - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * - * Example - * array( - * - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'temporary' => true|false, - * ); - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createTable($name, $fields, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $db->beginNestedTransaction(); - $result = parent::createTable($name, $fields, $options); - if (!PEAR::isError($result)) { - foreach ($fields as $field_name => $field) { - if (!empty($field['autoincrement'])) { - $result = $this->_makeAutoincrement($field_name, $name); - } - } - } - $db->completeNestedTransaction(); - return $result; - } - - // }}} - // {{{ dropTable() - - /** - * drop an existing table - * - * @param string $name name of the table that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $db->beginNestedTransaction(); - $result = $this->_dropAutoincrement($name); - if (!PEAR::isError($result)) { - $result = parent::dropTable($name); - } - $db->completeNestedTransaction(); - return $result; - } - - // }}} - // {{{ truncateTable() - - /** - * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, - * it falls back to a DELETE FROM TABLE query) - * - * @param string $name name of the table that should be truncated - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function truncateTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - return $db->exec("TRUNCATE TABLE $name"); - } - - // }}} - // {{{ vacuum() - - /** - * Optimize (vacuum) all the tables in the db (or only the specified table) - * and optionally run ANALYZE. - * - * @param string $table table name (all the tables if empty) - * @param array $options an array with driver-specific options: - * - timeout [int] (in seconds) [mssql-only] - * - analyze [boolean] [pgsql and mysql] - * - full [boolean] [pgsql-only] - * - freeze [boolean] [pgsql-only] - * - * @return mixed MDB2_OK success, a MDB2 error on failure - * @access public - */ - function vacuum($table = null, $options = array()) - { - // not needed in Oracle - return MDB2_OK; - } - - // }}} - // {{{ alterTable() - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the MDB2 parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the MDB2 parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @access public - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function alterTable($name, $changes, $check) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - foreach ($changes as $change_name => $change) { - switch ($change_name) { - case 'add': - case 'remove': - case 'change': - case 'name': - case 'rename': - break; - default: - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'change type "'.$change_name.'" not yet supported', __FUNCTION__); - } - } - - if ($check) { - return MDB2_OK; - } - - $name = $db->quoteIdentifier($name, true); - - if (!empty($changes['add']) && is_array($changes['add'])) { - $fields = array(); - foreach ($changes['add'] as $field_name => $field) { - $fields[] = $db->getDeclaration($field['type'], $field_name, $field); - } - $result = $db->exec("ALTER TABLE $name ADD (". implode(', ', $fields).')'); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($changes['change']) && is_array($changes['change'])) { - $fields = array(); - foreach ($changes['change'] as $field_name => $field) { - //fix error "column to be modified to NOT NULL is already NOT NULL" - if (!array_key_exists('notnull', $field)) { - unset($field['definition']['notnull']); - } - $fields[] = $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']); - } - $result = $db->exec("ALTER TABLE $name MODIFY (". implode(', ', $fields).')'); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($changes['rename']) && is_array($changes['rename'])) { - foreach ($changes['rename'] as $field_name => $field) { - $field_name = $db->quoteIdentifier($field_name, true); - $query = "ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name']); - $result = $db->exec($query); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!empty($changes['remove']) && is_array($changes['remove'])) { - $fields = array(); - foreach ($changes['remove'] as $field_name => $field) { - $fields[] = $db->quoteIdentifier($field_name, true); - } - $result = $db->exec("ALTER TABLE $name DROP COLUMN ". implode(', ', $fields)); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($changes['name'])) { - $change_name = $db->quoteIdentifier($changes['name'], true); - $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name); - if (PEAR::isError($result)) { - return $result; - } - } - - return MDB2_OK; - } - - // }}} - // {{{ _fetchCol() - - /** - * Utility method to fetch and format a column from a resultset - * - * @param resource $result - * @param boolean $fixname (used when listing indices or constraints) - * @return mixed array of names on success, a MDB2 error on failure - * @access private - */ - function _fetchCol($result, $fixname = false) - { - if (PEAR::isError($result)) { - return $result; - } - $col = $result->fetchCol(); - if (PEAR::isError($col)) { - return $col; - } - $result->free(); - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($fixname) { - foreach ($col as $k => $v) { - $col[$k] = $this->_fixIndexName($v); - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - && $db->options['field_case'] == CASE_LOWER - ) { - $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); - } - return $col; - } - - // }}} - // {{{ listDatabases() - - /** - * list all databases - * - * @return mixed array of database names on success, a MDB2 error on failure - * @access public - */ - function listDatabases() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!$db->options['emulate_database']) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'database listing is only supported if the "emulate_database" option is enabled', __FUNCTION__); - } - - if ($db->options['database_name_prefix']) { - $query = 'SELECT SUBSTR(username, '; - $query.= (strlen($db->options['database_name_prefix'])+1); - $query.= ") FROM sys.dba_users WHERE username LIKE '"; - $query.= $db->options['database_name_prefix']."%'"; - } else { - $query = 'SELECT username FROM sys.dba_users'; - } - $result = $db->standaloneQuery($query, array('text'), false); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listUsers() - - /** - * list all users - * - * @return mixed array of user names on success, a MDB2 error on failure - * @access public - */ - function listUsers() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($db->options['emulate_database'] && $db->options['database_name_prefix']) { - $query = 'SELECT SUBSTR(username, '; - $query.= (strlen($db->options['database_name_prefix'])+1); - $query.= ") FROM sys.dba_users WHERE username NOT LIKE '"; - $query.= $db->options['database_name_prefix']."%'"; - } else { - $query = 'SELECT username FROM sys.dba_users'; - } - return $db->queryCol($query); - } - - // }}} - // {{{ listViews() - - /** - * list all views in the current database - * - * @param string owner, the current is default - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listViews($owner = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT view_name - FROM sys.all_views - WHERE owner=? OR owner=?'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute(array($owner, strtoupper($owner))); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listFunctions() - - /** - * list all functions in the current database - * - * @param string owner, the current is default - * @return mixed array of function names on success, a MDB2 error on failure - * @access public - */ - function listFunctions($owner = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = "SELECT name - FROM sys.all_source - WHERE line = 1 - AND type = 'FUNCTION' - AND (owner=? OR owner=?)"; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute(array($owner, strtoupper($owner))); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listTableTriggers() - - /** - * list all triggers in the database that reference a given table - * - * @param string table for which all referenced triggers should be found - * @return mixed array of trigger names on success, a MDB2 error on failure - * @access public - */ - function listTableTriggers($table = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = "SELECT trigger_name - FROM sys.all_triggers - WHERE (table_name=? OR table_name=?) - AND (owner=? OR owner=?)"; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $args = array( - $table, - strtoupper($table), - $owner, - strtoupper($owner), - ); - $result = $stmt->execute($args); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listTables() - - /** - * list all tables in the database - * - * @param string owner, the current is default - * @return mixed array of table names on success, a MDB2 error on failure - * @access public - */ - function listTables($owner = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT table_name - FROM sys.all_tables - WHERE owner=? OR owner=?'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute(array($owner, strtoupper($owner))); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listTableFields() - - /** - * list all fields in a table in the current database - * - * @param string $table name of table that should be used in method - * @return mixed array of field names on success, a MDB2 error on failure - * @access public - */ - function listTableFields($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($owner, $table) = $this->splitTableSchema($table); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT column_name - FROM all_tab_columns - WHERE (table_name=? OR table_name=?) - AND (owner=? OR owner=?) - ORDER BY column_id'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $args = array( - $table, - strtoupper($table), - $owner, - strtoupper($owner), - ); - $result = $stmt->execute($args); - return $this->_fetchCol($result); - } - - // }}} - // {{{ listTableIndexes() - - /** - * list all indexes in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of index names on success, a MDB2 error on failure - * @access public - */ - function listTableIndexes($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($owner, $table) = $this->splitTableSchema($table); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT i.index_name name - FROM all_indexes i - LEFT JOIN all_constraints c - ON c.index_name = i.index_name - AND c.owner = i.owner - AND c.table_name = i.table_name - WHERE (i.table_name=? OR i.table_name=?) - AND (i.owner=? OR i.owner=?) - AND c.index_name IS NULL - AND i.generated=' .$db->quote('N', 'text'); - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $args = array( - $table, - strtoupper($table), - $owner, - strtoupper($owner), - ); - $result = $stmt->execute($args); - return $this->_fetchCol($result, true); - } - - // }}} - // {{{ createConstraint() - - /** - * create a constraint on a table - * - * @param string $table name of the table on which the constraint is to be created - * @param string $name name of the constraint to be created - * @param array $definition associative array that defines properties of the constraint to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the constraint fields as array - * constraints. Each entry of this array is set to another type of associative - * array that specifies properties of the constraint that are specific to - * each field. - * - * Example - * array( - * 'fields' => array( - * 'user_name' => array(), - * 'last_login' => array() - * ) - * ) - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createConstraint($table, $name, $definition) - { - $result = parent::createConstraint($table, $name, $definition); - if (PEAR::isError($result)) { - return $result; - } - if (!empty($definition['foreign'])) { - return $this->_createFKTriggers($table, array($name => $definition)); - } - return MDB2_OK; - } - - // }}} - // {{{ dropConstraint() - - /** - * drop existing constraint - * - * @param string $table name of table that should be used in method - * @param string $name name of the constraint to be dropped - * @param string $primary hint if the constraint is primary - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropConstraint($table, $name, $primary = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - //is it a FK constraint? If so, also delete the associated triggers - $db->loadModule('Reverse', null, true); - $definition = $db->reverse->getTableConstraintDefinition($table, $name); - if (!PEAR::isError($definition) && !empty($definition['foreign'])) { - //first drop the FK enforcing triggers - $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); - if (PEAR::isError($result)) { - return $result; - } - } - - return parent::dropConstraint($table, $name, $primary); - } - - // }}} - // {{{ _createFKTriggers() - - /** - * Create triggers to enforce the FOREIGN KEY constraint on the table - * - * @param string $table table name - * @param array $foreign_keys FOREIGN KEY definitions - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _createFKTriggers($table, $foreign_keys) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - // create triggers to enforce FOREIGN KEY constraints - if ($db->supports('triggers') && !empty($foreign_keys)) { - $table = $db->quoteIdentifier($table, true); - foreach ($foreign_keys as $fkname => $fkdef) { - if (empty($fkdef)) { - continue; - } - $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); - if ('RESTRICT' == $fkdef['onupdate'] || 'NO ACTION' == $fkdef['onupdate']) { - // already handled by default - continue; - } - - $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); - $table_fields = array_keys($fkdef['fields']); - $referenced_fields = array_keys($fkdef['references']['fields']); - - //create the ON UPDATE trigger on the primary table - $restrict_action = ' IF (SELECT '; - $aliased_fields = array(); - foreach ($table_fields as $field) { - $aliased_fields[] = $table .'.'.$field .' AS '.$field; - } - $restrict_action .= implode(',', $aliased_fields) - .' FROM '.$table - .' WHERE '; - $conditions = array(); - $new_values = array(); - $null_values = array(); - for ($i=0; $iloadModule('Reverse', null, true); - $default_values = array(); - foreach ($table_fields as $table_field) { - $field_definition = $db->reverse->getTableFieldDefinition($table, $field); - if (PEAR::isError($field_definition)) { - return $field_definition; - } - $default_values[] = $table_field .' = '. $field_definition[0]['default']; - } - $setdefault_action = 'UPDATE '.$table.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; - } - - $query = 'CREATE TRIGGER %s' - .' %s ON '.$fkdef['references']['table'] - .' FOR EACH ROW ' - .' BEGIN '; - - if ('CASCADE' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $cascade_action; - } elseif ('SET NULL' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setnull_action; - } elseif ('SET DEFAULT' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setdefault_action; - } - $sql_update .= ' END;'; - $result = $db->exec($sql_update); - if (PEAR::isError($result)) { - if ($result->getCode() === MDB2_ERROR_ALREADY_EXISTS) { - return MDB2_OK; - } - return $result; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ _dropFKTriggers() - - /** - * Drop the triggers created to enforce the FOREIGN KEY constraint on the table - * - * @param string $table table name - * @param string $fkname FOREIGN KEY constraint name - * @param string $referenced_table referenced table name - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _dropFKTriggers($table, $fkname, $referenced_table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $triggers = $this->listTableTriggers($table); - $triggers2 = $this->listTableTriggers($referenced_table); - if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { - $triggers = array_merge($triggers, $triggers2); - $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); - $pattern = '/^'.$trigger_name.'$/i'; - foreach ($triggers as $trigger) { - if (preg_match($pattern, $trigger)) { - $result = $db->exec('DROP TRIGGER '.$trigger); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ listTableConstraints() - - /** - * list all constraints in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of constraint names on success, a MDB2 error on failure - * @access public - */ - function listTableConstraints($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($owner, $table) = $this->splitTableSchema($table); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT constraint_name - FROM all_constraints - WHERE (table_name=? OR table_name=?) - AND (owner=? OR owner=?)'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $args = array( - $table, - strtoupper($table), - $owner, - strtoupper($owner), - ); - $result = $stmt->execute($args); - return $this->_fetchCol($result, true); - } - - // }}} - // {{{ createSequence() - - /** - * create sequence - * - * @param object $db database object that is extended by this class - * @param string $seq_name name of the sequence to be created - * @param string $start start value of the sequence; default is 1 - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createSequence($seq_name, $start = 1) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $query = "CREATE SEQUENCE $sequence_name START WITH $start INCREMENT BY 1 NOCACHE"; - $query.= ($start < 1 ? " MINVALUE $start" : ''); - return $db->exec($query); - } - - // }}} - // {{{ dropSequence() - - /** - * drop existing sequence - * - * @param object $db database object that is extended by this class - * @param string $seq_name name of the sequence to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropSequence($seq_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - return $db->exec("DROP SEQUENCE $sequence_name"); - } - - // }}} - // {{{ listSequences() - - /** - * list all sequences in the current database - * - * @param string owner, the current is default - * @return mixed array of sequence names on success, a MDB2 error on failure - * @access public - */ - function listSequences($owner = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT sequence_name - FROM sys.all_sequences - WHERE (sequence_owner=? OR sequence_owner=?)'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute(array($owner, strtoupper($owner))); - if (PEAR::isError($result)) { - return $result; - } - $col = $result->fetchCol(); - if (PEAR::isError($col)) { - return $col; - } - $result->free(); - - foreach ($col as $k => $v) { - $col[$k] = $this->_fixSequenceName($v); - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - && $db->options['field_case'] == CASE_LOWER - ) { - $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); - } - return $col; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Manager/pgsql.php b/3rdparty/MDB2/Driver/Manager/pgsql.php deleted file mode 100644 index 3e70f3a3b2..0000000000 --- a/3rdparty/MDB2/Driver/Manager/pgsql.php +++ /dev/null @@ -1,990 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/Driver/Manager/Common.php'; - -/** - * MDB2 MySQL driver for the management modules - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common -{ - // {{{ createDatabase() - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @param array $options array with charset info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $query = 'CREATE DATABASE ' . $name; - if (!empty($options['charset'])) { - $query .= ' WITH ENCODING ' . $db->quote($options['charset'], 'text'); - } - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ alterDatabase() - - /** - * alter an existing database - * - * @param string $name name of the database that is intended to be changed - * @param array $options array with name, owner info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function alterDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = ''; - if (!empty($options['name'])) { - $query .= ' RENAME TO ' . $options['name']; - } - if (!empty($options['owner'])) { - $query .= ' OWNER TO ' . $options['owner']; - } - - if (empty($query)) { - return MDB2_OK; - } - - $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true) . $query; - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ dropDatabase() - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropDatabase($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $query = "DROP DATABASE $name"; - return $db->standaloneQuery($query, null, true); - } - - // }}} - // {{{ _getAdvancedFKOptions() - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param array $definition - * @return string - * @access protected - */ - function _getAdvancedFKOptions($definition) - { - $query = ''; - if (!empty($definition['match'])) { - $query .= ' MATCH '.$definition['match']; - } - if (!empty($definition['onupdate'])) { - $query .= ' ON UPDATE '.$definition['onupdate']; - } - if (!empty($definition['ondelete'])) { - $query .= ' ON DELETE '.$definition['ondelete']; - } - if (!empty($definition['deferrable'])) { - $query .= ' DEFERRABLE'; - } else { - $query .= ' NOT DEFERRABLE'; - } - if (!empty($definition['initiallydeferred'])) { - $query .= ' INITIALLY DEFERRED'; - } else { - $query .= ' INITIALLY IMMEDIATE'; - } - return $query; - } - - // }}} - // {{{ truncateTable() - - /** - * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, - * it falls back to a DELETE FROM TABLE query) - * - * @param string $name name of the table that should be truncated - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function truncateTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("TRUNCATE TABLE $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ vacuum() - - /** - * Optimize (vacuum) all the tables in the db (or only the specified table) - * and optionally run ANALYZE. - * - * @param string $table table name (all the tables if empty) - * @param array $options an array with driver-specific options: - * - timeout [int] (in seconds) [mssql-only] - * - analyze [boolean] [pgsql and mysql] - * - full [boolean] [pgsql-only] - * - freeze [boolean] [pgsql-only] - * - * @return mixed MDB2_OK success, a MDB2 error on failure - * @access public - */ - function vacuum($table = null, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $query = 'VACUUM'; - - if (!empty($options['full'])) { - $query .= ' FULL'; - } - if (!empty($options['freeze'])) { - $query .= ' FREEZE'; - } - if (!empty($options['analyze'])) { - $query .= ' ANALYZE'; - } - - if (!empty($table)) { - $query .= ' '.$db->quoteIdentifier($table, true); - } - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ alterTable() - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the MDB2 parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the MDB2 parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @access public - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function alterTable($name, $changes, $check) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - foreach ($changes as $change_name => $change) { - switch ($change_name) { - case 'add': - case 'remove': - case 'change': - case 'name': - case 'rename': - break; - default: - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'change type "'.$change_name.'\" not yet supported', __FUNCTION__); - } - } - - if ($check) { - return MDB2_OK; - } - - $unquoted_name = $name; - $name = $db->quoteIdentifier($name, true); - - if (!empty($changes['remove']) && is_array($changes['remove'])) { - foreach ($changes['remove'] as $field_name => $field) { - $field_name = $db->quoteIdentifier($field_name, true); - $query = 'DROP ' . $field_name; - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!empty($changes['rename']) && is_array($changes['rename'])) { - foreach ($changes['rename'] as $field_name => $field) { - $field_name = $db->quoteIdentifier($field_name, true); - $result = $db->exec("ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name'], true)); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $field_name => $field) { - $query = 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field); - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!empty($changes['change']) && is_array($changes['change'])) { - foreach ($changes['change'] as $field_name => $field) { - $unquoted_field_name = $field_name; - $field_name = $db->quoteIdentifier($field_name, true); - if (!empty($field['definition']['type'])) { - $server_info = $db->getServerVersion(); - if (PEAR::isError($server_info)) { - return $server_info; - } - if (is_array($server_info) && $server_info['major'] < 8) { - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'changing column type for "'.$change_name.'\" requires PostgreSQL 8.0 or above', __FUNCTION__); - } - $db->loadModule('Datatype', null, true); - $type = $db->datatype->getTypeDeclaration($field['definition']); - if($type=='SERIAL PRIMARY KEY'){//not correct when altering a table, since serials arent a real type - $type='INTEGER';//use integer instead - } - $query = "ALTER $field_name TYPE $type USING CAST($field_name AS $type)"; - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - if (array_key_exists('autoincrement', $field['definition'])) { - $query = "ALTER $field_name SET DEFAULT nextval(".$db->quote($unquoted_name.'_'.$unquoted_field_name.'_seq', 'text').")"; - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - elseif (array_key_exists('default', $field['definition'])) { - $query = "ALTER $field_name SET DEFAULT ".$db->quote($field['definition']['default'], $field['definition']['type']); - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - if (array_key_exists('notnull', $field['definition'])) { - $query = "ALTER $field_name ".($field['definition']['notnull'] ? 'SET' : 'DROP').' NOT NULL'; - $result = $db->exec("ALTER TABLE $name $query"); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - - if (!empty($changes['name'])) { - $change_name = $db->quoteIdentifier($changes['name'], true); - $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name); - if (PEAR::isError($result)) { - return $result; - } - } - - return MDB2_OK; - } - - // }}} - // {{{ listDatabases() - - /** - * list all databases - * - * @return mixed array of database names on success, a MDB2 error on failure - * @access public - */ - function listDatabases() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT datname FROM pg_database'; - $result2 = $db->standaloneQuery($query, array('text'), false); - if (!MDB2::isResultCommon($result2)) { - return $result2; - } - - $result = $result2->fetchCol(); - $result2->free(); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listUsers() - - /** - * list all users - * - * @return mixed array of user names on success, a MDB2 error on failure - * @access public - */ - function listUsers() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT usename FROM pg_user'; - $result2 = $db->standaloneQuery($query, array('text'), false); - if (!MDB2::isResultCommon($result2)) { - return $result2; - } - - $result = $result2->fetchCol(); - $result2->free(); - return $result; - } - - // }}} - // {{{ listViews() - - /** - * list all views in the current database - * - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listViews($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT viewname - FROM pg_views - WHERE schemaname NOT IN ('pg_catalog', 'information_schema') - AND viewname !~ '^pg_'"; - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableViews() - - /** - * list the views in the database that reference a given table - * - * @param string table for which all referenced views should be found - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listTableViews($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT viewname FROM pg_views NATURAL JOIN pg_tables'; - $query.= ' WHERE tablename ='.$db->quote($table, 'text'); - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listFunctions() - - /** - * list all functions in the current database - * - * @return mixed array of function names on success, a MDB2 error on failure - * @access public - */ - function listFunctions() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = " - SELECT - proname - FROM - pg_proc pr, - pg_type tp - WHERE - tp.oid = pr.prorettype - AND pr.proisagg = FALSE - AND tp.typname <> 'trigger' - AND pr.pronamespace IN - (SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')"; - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableTriggers() - - /** - * list all triggers in the database that reference a given table - * - * @param string table for which all referenced triggers should be found - * @return mixed array of trigger names on success, a MDB2 error on failure - * @access public - */ - function listTableTriggers($table = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT trg.tgname AS trigger_name - FROM pg_trigger trg, - pg_class tbl - WHERE trg.tgrelid = tbl.oid'; - if (null !== $table) { - $table = $db->quote(strtoupper($table), 'text'); - $query .= " AND UPPER(tbl.relname) = $table"; - } - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTables() - - /** - * list all tables in the current database - * - * @return mixed array of table names on success, a MDB2 error on failure - * @access public - */ - function listTables($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - // gratuitously stolen from PEAR DB _getSpecialQuery in pgsql.php - $query = 'SELECT c.relname AS "Name"' - . ' FROM pg_class c, pg_user u' - . ' WHERE c.relowner = u.usesysid' - . " AND c.relkind = 'r'" - . ' AND NOT EXISTS' - . ' (SELECT 1 FROM pg_views' - . ' WHERE viewname = c.relname)' - . " AND c.relname !~ '^(pg_|sql_)'" - . ' UNION' - . ' SELECT c.relname AS "Name"' - . ' FROM pg_class c' - . " WHERE c.relkind = 'r'" - . ' AND NOT EXISTS' - . ' (SELECT 1 FROM pg_views' - . ' WHERE viewname = c.relname)' - . ' AND NOT EXISTS' - . ' (SELECT 1 FROM pg_user' - . ' WHERE usesysid = c.relowner)' - . " AND c.relname !~ '^pg_'"; - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableFields() - - /** - * list all fields in a table in the current database - * - * @param string $table name of table that should be used in method - * @return mixed array of field names on success, a MDB2 error on failure - * @access public - */ - function listTableFields($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table); - - $table = $db->quoteIdentifier($table, true); - if (!empty($schema)) { - $table = $db->quoteIdentifier($schema, true) . '.' .$table; - } - $db->setLimit(1); - $result2 = $db->query("SELECT * FROM $table"); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $result2->getColumnNames(); - $result2->free(); - if (PEAR::isError($result)) { - return $result; - } - return array_flip($result); - } - - // }}} - // {{{ listTableIndexes() - - /** - * list all indexes in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of index names on success, a MDB2 error on failure - * @access public - */ - function listTableIndexes($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table); - - $table = $db->quote($table, 'text'); - $subquery = "SELECT indexrelid - FROM pg_index - LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid - LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid - WHERE pg_class.relname = $table - AND indisunique != 't' - AND indisprimary != 't'"; - if (!empty($schema)) { - $subquery .= ' AND pg_namespace.nspname = '.$db->quote($schema, 'text'); - } - $query = "SELECT relname FROM pg_class WHERE oid IN ($subquery)"; - $indexes = $db->queryCol($query, 'text'); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $result = array(); - foreach ($indexes as $index) { - $index = $this->_fixIndexName($index); - if (!empty($index)) { - $result[$index] = true; - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ dropConstraint() - - /** - * drop existing constraint - * - * @param string $table name of table that should be used in method - * @param string $name name of the constraint to be dropped - * @param string $primary hint if the constraint is primary - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropConstraint($table, $name, $primary = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - // is it an UNIQUE index? - $query = 'SELECT relname - FROM pg_class - WHERE oid IN ( - SELECT indexrelid - FROM pg_index, pg_class - WHERE pg_class.relname = '.$db->quote($table, 'text').' - AND pg_class.oid = pg_index.indrelid - AND indisunique = \'t\') - EXCEPT - SELECT conname - FROM pg_constraint, pg_class - WHERE pg_constraint.conrelid = pg_class.oid - AND relname = '. $db->quote($table, 'text'); - $unique = $db->queryCol($query, 'text'); - if (PEAR::isError($unique) || empty($unique)) { - // not an UNIQUE index, maybe a CONSTRAINT - return parent::dropConstraint($table, $name, $primary); - } - - if (in_array($name, $unique)) { - $result = $db->exec('DROP INDEX '.$db->quoteIdentifier($name, true)); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - $idxname = $db->getIndexName($name); - if (in_array($idxname, $unique)) { - $result = $db->exec('DROP INDEX '.$db->quoteIdentifier($idxname, true)); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $name . ' is not an existing constraint for table ' . $table, __FUNCTION__); - } - - // }}} - // {{{ listTableConstraints() - - /** - * list all constraints in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of constraint names on success, a MDB2 error on failure - * @access public - */ - function listTableConstraints($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table); - - $table = $db->quote($table, 'text'); - $query = 'SELECT conname - FROM pg_constraint - LEFT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid - LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid - WHERE relname = ' .$table; - if (!empty($schema)) { - $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text'); - } - $query .= ' - UNION DISTINCT - SELECT relname - FROM pg_class - WHERE oid IN ( - SELECT indexrelid - FROM pg_index - LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid - LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid - WHERE pg_class.relname = '.$table.' - AND indisunique = \'t\''; - if (!empty($schema)) { - $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text'); - } - $query .= ')'; - $constraints = $db->queryCol($query); - if (PEAR::isError($constraints)) { - return $constraints; - } - - $result = array(); - foreach ($constraints as $constraint) { - $constraint = $this->_fixIndexName($constraint); - if (!empty($constraint)) { - $result[$constraint] = true; - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - && $db->options['field_case'] == CASE_LOWER - ) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ createSequence() - - /** - * create sequence - * - * @param string $seq_name name of the sequence to be created - * @param string $start start value of the sequence; default is 1 - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createSequence($seq_name, $start = 1) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $result = $db->exec("CREATE SEQUENCE $sequence_name INCREMENT 1". - ($start < 1 ? " MINVALUE $start" : '')." START $start"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropSequence() - - /** - * drop existing sequence - * - * @param string $seq_name name of the sequence to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropSequence($seq_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $result = $db->exec("DROP SEQUENCE $sequence_name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listSequences() - - /** - * list all sequences in the current database - * - * @return mixed array of sequence names on success, a MDB2 error on failure - * @access public - */ - function listSequences($database = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT relname FROM pg_class WHERE relkind = 'S' AND relnamespace IN"; - $query.= "(SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')"; - $table_names = $db->queryCol($query); - if (PEAR::isError($table_names)) { - return $table_names; - } - $result = array(); - foreach ($table_names as $table_name) { - $result[] = $this->_fixSequenceName($table_name); - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } -} -?> diff --git a/3rdparty/MDB2/Driver/Manager/sqlite.php b/3rdparty/MDB2/Driver/Manager/sqlite.php deleted file mode 100644 index 1e7efe3e74..0000000000 --- a/3rdparty/MDB2/Driver/Manager/sqlite.php +++ /dev/null @@ -1,1390 +0,0 @@ - | -// | Lorenzo Alberton | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Manager/Common.php'; - -/** - * MDB2 SQLite driver for the management modules - * - * @package MDB2 - * @category Database - * @author Lukas Smith - * @author Lorenzo Alberton - */ -class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common -{ - // {{{ createDatabase() - - /** - * create a new database - * - * @param string $name name of the database that should be created - * @param array $options array with charset info - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createDatabase($name, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $database_file = $db->_getDatabaseFile($name); - if (file_exists($database_file)) { - return $db->raiseError(MDB2_ERROR_ALREADY_EXISTS, null, null, - 'database already exists', __FUNCTION__); - } - $php_errormsg = ''; - $handle = @sqlite_open($database_file, $db->dsn['mode'], $php_errormsg); - if (!$handle) { - return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, - (isset($php_errormsg) ? $php_errormsg : 'could not create the database file'), __FUNCTION__); - } - if (!empty($options['charset'])) { - $query = 'PRAGMA encoding = ' . $db->quote($options['charset'], 'text'); - @sqlite_query($query, $handle); - } - @sqlite_close($handle); - return MDB2_OK; - } - - // }}} - // {{{ dropDatabase() - - /** - * drop an existing database - * - * @param string $name name of the database that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropDatabase($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $database_file = $db->_getDatabaseFile($name); - if (!@file_exists($database_file)) { - return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null, - 'database does not exist', __FUNCTION__); - } - $result = @unlink($database_file); - if (!$result) { - return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null, - (isset($php_errormsg) ? $php_errormsg : 'could not remove the database file'), __FUNCTION__); - } - return MDB2_OK; - } - - // }}} - // {{{ _getAdvancedFKOptions() - - /** - * Return the FOREIGN KEY query section dealing with non-standard options - * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... - * - * @param array $definition - * @return string - * @access protected - */ - function _getAdvancedFKOptions($definition) - { - $query = ''; - if (!empty($definition['match'])) { - $query .= ' MATCH '.$definition['match']; - } - if (!empty($definition['onupdate']) && (strtoupper($definition['onupdate']) != 'NO ACTION')) { - $query .= ' ON UPDATE '.$definition['onupdate']; - } - if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) { - $query .= ' ON DELETE '.$definition['ondelete']; - } - if (!empty($definition['deferrable'])) { - $query .= ' DEFERRABLE'; - } else { - $query .= ' NOT DEFERRABLE'; - } - if (!empty($definition['initiallydeferred'])) { - $query .= ' INITIALLY DEFERRED'; - } else { - $query .= ' INITIALLY IMMEDIATE'; - } - return $query; - } - - // }}} - // {{{ _getCreateTableQuery() - - /** - * Create a basic SQL query for a new table creation - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * @param array $options An associative array of table options - * @return mixed string (the SQL query) on success, a MDB2 error on failure - * @see createTable() - */ - function _getCreateTableQuery($name, $fields, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!$name) { - return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, - 'no valid table name specified', __FUNCTION__); - } - if (empty($fields)) { - return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, - 'no fields specified for table "'.$name.'"', __FUNCTION__); - } - $query_fields = $this->getFieldDeclarationList($fields); - if (PEAR::isError($query_fields)) { - return $query_fields; - } - if (!empty($options['primary'])) { - $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')'; - } - if (!empty($options['foreign_keys'])) { - foreach ($options['foreign_keys'] as $fkname => $fkdef) { - if (empty($fkdef)) { - continue; - } - $query_fields.= ', CONSTRAINT '.$fkname.' FOREIGN KEY ('.implode(', ', array_keys($fkdef['fields'])).')'; - $query_fields.= ' REFERENCES '.$fkdef['references']['table'].' ('.implode(', ', array_keys($fkdef['references']['fields'])).')'; - $query_fields.= $this->_getAdvancedFKOptions($fkdef); - } - } - - $name = $db->quoteIdentifier($name, true); - $result = 'CREATE '; - if (!empty($options['temporary'])) { - $result .= $this->_getTemporaryTableQuery(); - } - $result .= " TABLE $name ($query_fields)"; - return $result; - } - - // }}} - // {{{ createTable() - - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition - * of each field of the new table - * @param array $options An associative array of table options - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createTable($name, $fields, $options = array()) - { - $result = parent::createTable($name, $fields, $options); - if (PEAR::isError($result)) { - return $result; - } - // create triggers to enforce FOREIGN KEY constraints - if (!empty($options['foreign_keys'])) { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - foreach ($options['foreign_keys'] as $fkname => $fkdef) { - if (empty($fkdef)) { - continue; - } - //set actions to default if not set - $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); - $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']); - - $trigger_names = array( - 'insert' => $fkname.'_insert_trg', - 'update' => $fkname.'_update_trg', - 'pk_update' => $fkname.'_pk_update_trg', - 'pk_delete' => $fkname.'_pk_delete_trg', - ); - - //create the [insert|update] triggers on the FK table - $table_fields = array_keys($fkdef['fields']); - $referenced_fields = array_keys($fkdef['references']['fields']); - $query = 'CREATE TRIGGER %s BEFORE %s ON '.$name - .' FOR EACH ROW BEGIN' - .' SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')' - .' WHERE (SELECT '; - $aliased_fields = array(); - foreach ($referenced_fields as $field) { - $aliased_fields[] = $fkdef['references']['table'] .'.'.$field .' AS '.$field; - } - $query .= implode(',', $aliased_fields) - .' FROM '.$fkdef['references']['table'] - .' WHERE '; - $conditions = array(); - for ($i=0; $iexec(sprintf($query, $trigger_names['insert'], 'INSERT', 'insert')); - if (PEAR::isError($result)) { - return $result; - } - - $result = $db->exec(sprintf($query, $trigger_names['update'], 'UPDATE', 'update')); - if (PEAR::isError($result)) { - return $result; - } - - //create the ON [UPDATE|DELETE] triggers on the primary table - $restrict_action = 'SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')' - .' WHERE (SELECT '; - $aliased_fields = array(); - foreach ($table_fields as $field) { - $aliased_fields[] = $name .'.'.$field .' AS '.$field; - } - $restrict_action .= implode(',', $aliased_fields) - .' FROM '.$name - .' WHERE '; - $conditions = array(); - $new_values = array(); - $null_values = array(); - for ($i=0; $i OLD.'.$referenced_fields[$i]; - } - $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL' - .' AND (' .implode(' OR ', $conditions2) .')'; - - $cascade_action_update = 'UPDATE '.$name.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions); - $cascade_action_delete = 'DELETE FROM '.$name.' WHERE '.implode(' AND ', $conditions); - $setnull_action = 'UPDATE '.$name.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions); - - if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) { - $db->loadModule('Reverse', null, true); - $default_values = array(); - foreach ($table_fields as $table_field) { - $field_definition = $db->reverse->getTableFieldDefinition($name, $field); - if (PEAR::isError($field_definition)) { - return $field_definition; - } - $default_values[] = $table_field .' = '. $field_definition[0]['default']; - } - $setdefault_action = 'UPDATE '.$name.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions); - } - - $query = 'CREATE TRIGGER %s' - .' %s ON '.$fkdef['references']['table'] - .' FOR EACH ROW BEGIN '; - - if ('CASCADE' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'AFTER UPDATE', 'update') . $cascade_action_update. '; END;'; - } elseif ('SET NULL' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action. '; END;'; - } elseif ('SET DEFAULT' == $fkdef['onupdate']) { - $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action. '; END;'; - } elseif ('NO ACTION' == $fkdef['onupdate']) { - $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'AFTER UPDATE', 'update') . '; END;'; - } elseif ('RESTRICT' == $fkdef['onupdate']) { - $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . '; END;'; - } - if ('CASCADE' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete') . $cascade_action_delete. '; END;'; - } elseif ('SET NULL' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action. '; END;'; - } elseif ('SET DEFAULT' == $fkdef['ondelete']) { - $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action. '; END;'; - } elseif ('NO ACTION' == $fkdef['ondelete']) { - $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete') . '; END;'; - } elseif ('RESTRICT' == $fkdef['ondelete']) { - $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . '; END;'; - } - - if (PEAR::isError($result)) { - return $result; - } - $result = $db->exec($sql_delete); - if (PEAR::isError($result)) { - return $result; - } - $result = $db->exec($sql_update); - if (PEAR::isError($result)) { - return $result; - } - } - } - if (PEAR::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropTable() - - /** - * drop an existing table - * - * @param string $name name of the table that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - //delete the triggers associated to existing FK constraints - $constraints = $this->listTableConstraints($name); - if (!PEAR::isError($constraints) && !empty($constraints)) { - $db->loadModule('Reverse', null, true); - foreach ($constraints as $constraint) { - $definition = $db->reverse->getTableConstraintDefinition($name, $constraint); - if (!PEAR::isError($definition) && !empty($definition['foreign'])) { - $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("DROP TABLE $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ vacuum() - - /** - * Optimize (vacuum) all the tables in the db (or only the specified table) - * and optionally run ANALYZE. - * - * @param string $table table name (all the tables if empty) - * @param array $options an array with driver-specific options: - * - timeout [int] (in seconds) [mssql-only] - * - analyze [boolean] [pgsql and mysql] - * - full [boolean] [pgsql-only] - * - freeze [boolean] [pgsql-only] - * - * @return mixed MDB2_OK success, a MDB2 error on failure - * @access public - */ - function vacuum($table = null, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'VACUUM'; - if (!empty($table)) { - $query .= ' '.$db->quoteIdentifier($table, true); - } - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ alterTable() - - /** - * alter an existing table - * - * @param string $name name of the table that is intended to be changed. - * @param array $changes associative array that contains the details of each type - * of change that is intended to be performed. The types of - * changes that are currently supported are defined as follows: - * - * name - * - * New name for the table. - * - * add - * - * Associative array with the names of fields to be added as - * indexes of the array. The value of each entry of the array - * should be set to another associative array with the properties - * of the fields to be added. The properties of the fields should - * be the same as defined by the MDB2 parser. - * - * - * remove - * - * Associative array with the names of fields to be removed as indexes - * of the array. Currently the values assigned to each entry are ignored. - * An empty array should be used for future compatibility. - * - * rename - * - * Associative array with the names of fields to be renamed as indexes - * of the array. The value of each entry of the array should be set to - * another associative array with the entry named name with the new - * field name and the entry named Declaration that is expected to contain - * the portion of the field declaration already in DBMS specific SQL code - * as it is used in the CREATE TABLE statement. - * - * change - * - * Associative array with the names of the fields to be changed as indexes - * of the array. Keep in mind that if it is intended to change either the - * name of a field and any other properties, the change array entries - * should have the new names of the fields as array indexes. - * - * The value of each entry of the array should be set to another associative - * array with the properties of the fields to that are meant to be changed as - * array entries. These entries should be assigned to the new values of the - * respective properties. The properties of the fields should be the same - * as defined by the MDB2 parser. - * - * Example - * array( - * 'name' => 'userlist', - * 'add' => array( - * 'quota' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * ) - * ), - * 'remove' => array( - * 'file_limit' => array(), - * 'time_limit' => array() - * ), - * 'change' => array( - * 'name' => array( - * 'length' => '20', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 20, - * ), - * ) - * ), - * 'rename' => array( - * 'sex' => array( - * 'name' => 'gender', - * 'definition' => array( - * 'type' => 'text', - * 'length' => 1, - * 'default' => 'M', - * ), - * ) - * ) - * ) - * - * @param boolean $check indicates whether the function should just check if the DBMS driver - * can perform the requested table alterations if the value is true or - * actually perform them otherwise. - * @access public - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function alterTable($name, $changes, $check, $options = array()) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - foreach ($changes as $change_name => $change) { - switch ($change_name) { - case 'add': - case 'remove': - case 'change': - case 'name': - case 'rename': - break; - default: - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'change type "'.$change_name.'" not yet supported', __FUNCTION__); - } - } - - if ($check) { - return MDB2_OK; - } - - $db->loadModule('Reverse', null, true); - - // actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it - $fields = $db->manager->listTableFields($name); - if (PEAR::isError($fields)) { - return $fields; - } - - $fields = array_flip($fields); - foreach ($fields as $field => $value) { - $definition = $db->reverse->getTableFieldDefinition($name, $field); - if (PEAR::isError($definition)) { - return $definition; - } - $fields[$field] = $definition[0]; - } - - $indexes = $db->manager->listTableIndexes($name); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $indexes = array_flip($indexes); - foreach ($indexes as $index => $value) { - $definition = $db->reverse->getTableIndexDefinition($name, $index); - if (PEAR::isError($definition)) { - return $definition; - } - $indexes[$index] = $definition; - } - - $constraints = $db->manager->listTableConstraints($name); - if (PEAR::isError($constraints)) { - return $constraints; - } - - if (!array_key_exists('foreign_keys', $options)) { - $options['foreign_keys'] = array(); - } - $constraints = array_flip($constraints); - foreach ($constraints as $constraint => $value) { - if (!empty($definition['primary'])) { - if (!array_key_exists('primary', $options)) { - $options['primary'] = $definition['fields']; - //remove from the $constraint array, it's already handled by createTable() - unset($constraints[$constraint]); - } - } else { - $c_definition = $db->reverse->getTableConstraintDefinition($name, $constraint); - if (PEAR::isError($c_definition)) { - return $c_definition; - } - if (!empty($c_definition['foreign'])) { - if (!array_key_exists($constraint, $options['foreign_keys'])) { - $options['foreign_keys'][$constraint] = $c_definition; - } - //remove from the $constraint array, it's already handled by createTable() - unset($constraints[$constraint]); - } else { - $constraints[$constraint] = $c_definition; - } - } - } - - $name_new = $name; - $create_order = $select_fields = array_keys($fields); - foreach ($changes as $change_name => $change) { - switch ($change_name) { - case 'add': - foreach ($change as $field_name => $field) { - $fields[$field_name] = $field; - $create_order[] = $field_name; - } - break; - case 'remove': - foreach ($change as $field_name => $field) { - unset($fields[$field_name]); - $select_fields = array_diff($select_fields, array($field_name)); - $create_order = array_diff($create_order, array($field_name)); - } - break; - case 'change': - foreach ($change as $field_name => $field) { - $fields[$field_name] = $field['definition']; - } - break; - case 'name': - $name_new = $change; - break; - case 'rename': - foreach ($change as $field_name => $field) { - unset($fields[$field_name]); - $fields[$field['name']] = $field['definition']; - $create_order[array_search($field_name, $create_order)] = $field['name']; - } - break; - default: - return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, - 'change type "'.$change_name.'" not yet supported', __FUNCTION__); - } - } - - $data = null; - if (!empty($select_fields)) { - $query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true); - $data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED); - } - - $result = $this->dropTable($name); - if (PEAR::isError($result)) { - return $result; - } - - $result = $this->createTable($name_new, $fields, $options); - if (PEAR::isError($result)) { - return $result; - } - - foreach ($indexes as $index => $definition) { - $this->createIndex($name_new, $index, $definition); - } - - foreach ($constraints as $constraint => $definition) { - $this->createConstraint($name_new, $constraint, $definition); - } - - if (!empty($select_fields) && !empty($data)) { - $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); - $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; - $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; - $stmt = $db->prepare($query, null, MDB2_PREPARE_MANIP); - if (PEAR::isError($stmt)) { - return $stmt; - } - foreach ($data as $row) { - $result = $stmt->execute($row); - if (PEAR::isError($result)) { - return $result; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ listDatabases() - - /** - * list all databases - * - * @return mixed array of database names on success, a MDB2 error on failure - * @access public - */ - function listDatabases() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'list databases is not supported', __FUNCTION__); - } - - // }}} - // {{{ listUsers() - - /** - * list all users - * - * @return mixed array of user names on success, a MDB2 error on failure - * @access public - */ - function listUsers() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'list databases is not supported', __FUNCTION__); - } - - // }}} - // {{{ listViews() - - /** - * list all views in the current database - * - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listViews() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name FROM sqlite_master WHERE type='view' AND sql NOT NULL"; - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableViews() - - /** - * list the views in the database that reference a given table - * - * @param string table for which all referenced views should be found - * @return mixed array of view names on success, a MDB2 error on failure - * @access public - */ - function listTableViews($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name, sql FROM sqlite_master WHERE type='view' AND sql NOT NULL"; - $views = $db->queryAll($query, array('text', 'text'), MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($views)) { - return $views; - } - $result = array(); - foreach ($views as $row) { - if (preg_match("/^create view .* \bfrom\b\s+\b{$table}\b /i", $row['sql'])) { - if (!empty($row['name'])) { - $result[$row['name']] = true; - } - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ listTables() - - /** - * list all tables in the current database - * - * @return mixed array of table names on success, a MDB2 error on failure - * @access public - */ - function listTables() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name"; - $table_names = $db->queryCol($query); - if (PEAR::isError($table_names)) { - return $table_names; - } - $result = array(); - foreach ($table_names as $table_name) { - if (!$this->_fixSequenceName($table_name, true)) { - $result[] = $table_name; - } - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ listTableFields() - - /** - * list all fields in a table in the current database - * - * @param string $table name of table that should be used in method - * @return mixed array of field names on success, a MDB2 error on failure - * @access public - */ - function listTableFields($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->loadModule('Reverse', null, true); - if (PEAR::isError($result)) { - return $result; - } - $query = "SELECT sql FROM sqlite_master WHERE type='table' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text'); - } else { - $query.= 'name='.$db->quote($table, 'text'); - } - $sql = $db->queryOne($query); - if (PEAR::isError($sql)) { - return $sql; - } - $columns = $db->reverse->_getTableColumns($sql); - $fields = array(); - foreach ($columns as $column) { - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column['name'] = strtolower($column['name']); - } else { - $column['name'] = strtoupper($column['name']); - } - } else { - $column = array_change_key_case($column, $db->options['field_case']); - } - $fields[] = $column['name']; - } - return $fields; - } - - // }}} - // {{{ listTableTriggers() - - /** - * list all triggers in the database that reference a given table - * - * @param string table for which all referenced triggers should be found - * @return mixed array of trigger names on success, a MDB2 error on failure - * @access public - */ - function listTableTriggers($table = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name FROM sqlite_master WHERE type='trigger' AND sql NOT NULL"; - if (null !== $table) { - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= ' AND LOWER(tbl_name)='.$db->quote(strtolower($table), 'text'); - } else { - $query.= ' AND tbl_name='.$db->quote($table, 'text'); - } - } - $result = $db->queryCol($query); - if (PEAR::isError($result)) { - return $result; - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} - // {{{ createIndex() - - /** - * Get the stucture of a field into an array - * - * @param string $table name of the table on which the index is to be created - * @param string $name name of the index to be created - * @param array $definition associative array that defines properties of the index to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the index fields as array - * indexes. Each entry of this array is set to another type of associative - * array that specifies properties of the index that are specific to - * each field. - * - * Currently, only the sorting property is supported. It should be used - * to define the sorting direction of the index. It may be set to either - * ascending or descending. - * - * Not all DBMS support index sorting direction configuration. The DBMS - * drivers of those that do not support it ignore this property. Use the - * function support() to determine whether the DBMS driver can manage indexes. - - * Example - * array( - * 'fields' => array( - * 'user_name' => array( - * 'sorting' => 'ascending' - * ), - * 'last_login' => array() - * ) - * ) - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createIndex($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->quoteIdentifier($db->getIndexName($name), true); - $query = "CREATE INDEX $name ON $table"; - $fields = array(); - foreach ($definition['fields'] as $field_name => $field) { - $field_string = $db->quoteIdentifier($field_name, true); - if (!empty($field['sorting'])) { - switch ($field['sorting']) { - case 'ascending': - $field_string.= ' ASC'; - break; - case 'descending': - $field_string.= ' DESC'; - break; - } - } - $fields[] = $field_string; - } - $query .= ' ('.implode(', ', $fields) . ')'; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropIndex() - - /** - * drop existing index - * - * @param string $table name of table that should be used in method - * @param string $name name of the index to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropIndex($table, $name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->getIndexName($name); - $result = $db->exec("DROP INDEX $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listTableIndexes() - - /** - * list all indexes in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of index names on success, a MDB2 error on failure - * @access public - */ - function listTableIndexes($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quote($table, 'text'); - $query = "SELECT sql FROM sqlite_master WHERE type='index' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(tbl_name)='.strtolower($table); - } else { - $query.= "tbl_name=$table"; - } - $query.= " AND sql NOT NULL ORDER BY name"; - $indexes = $db->queryCol($query, 'text'); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $result = array(); - foreach ($indexes as $sql) { - if (preg_match("/^create index ([^ ]+) on /i", $sql, $tmp)) { - $index = $this->_fixIndexName($tmp[1]); - if (!empty($index)) { - $result[$index] = true; - } - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ createConstraint() - - /** - * create a constraint on a table - * - * @param string $table name of the table on which the constraint is to be created - * @param string $name name of the constraint to be created - * @param array $definition associative array that defines properties of the constraint to be created. - * Currently, only one property named FIELDS is supported. This property - * is also an associative with the names of the constraint fields as array - * constraints. Each entry of this array is set to another type of associative - * array that specifies properties of the constraint that are specific to - * each field. - * - * Example - * array( - * 'fields' => array( - * 'user_name' => array(), - * 'last_login' => array() - * ) - * ) - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createConstraint($table, $name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!empty($definition['primary'])) { - return $db->manager->alterTable($table, array(), false, array('primary' => $definition['fields'])); - } - - if (!empty($definition['foreign'])) { - return $db->manager->alterTable($table, array(), false, array('foreign_keys' => array($name => $definition))); - } - - $table = $db->quoteIdentifier($table, true); - $name = $db->getIndexName($name); - $query = "CREATE UNIQUE INDEX $name ON $table"; - $fields = array(); - foreach ($definition['fields'] as $field_name => $field) { - $field_string = $field_name; - if (!empty($field['sorting'])) { - switch ($field['sorting']) { - case 'ascending': - $field_string.= ' ASC'; - break; - case 'descending': - $field_string.= ' DESC'; - break; - } - } - $fields[] = $field_string; - } - $query .= ' ('.implode(', ', $fields) . ')'; - $result = $db->exec($query); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ dropConstraint() - - /** - * drop existing constraint - * - * @param string $table name of table that should be used in method - * @param string $name name of the constraint to be dropped - * @param string $primary hint if the constraint is primary - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropConstraint($table, $name, $primary = false) - { - if ($primary || $name == 'PRIMARY') { - return $this->alterTable($table, array(), false, array('primary' => null)); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - //is it a FK constraint? If so, also delete the associated triggers - $db->loadModule('Reverse', null, true); - $definition = $db->reverse->getTableConstraintDefinition($table, $name); - if (!PEAR::isError($definition) && !empty($definition['foreign'])) { - //first drop the FK enforcing triggers - $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); - if (PEAR::isError($result)) { - return $result; - } - //then drop the constraint itself - return $this->alterTable($table, array(), false, array('foreign_keys' => array($name => null))); - } - - $name = $db->getIndexName($name); - $result = $db->exec("DROP INDEX $name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ _dropFKTriggers() - - /** - * Drop the triggers created to enforce the FOREIGN KEY constraint on the table - * - * @param string $table table name - * @param string $fkname FOREIGN KEY constraint name - * @param string $referenced_table referenced table name - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access private - */ - function _dropFKTriggers($table, $fkname, $referenced_table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $triggers = $this->listTableTriggers($table); - $triggers2 = $this->listTableTriggers($referenced_table); - if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { - $triggers = array_merge($triggers, $triggers2); - $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i'; - foreach ($triggers as $trigger) { - if (preg_match($pattern, $trigger)) { - $result = $db->exec('DROP TRIGGER '.$trigger); - if (PEAR::isError($result)) { - return $result; - } - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ listTableConstraints() - - /** - * list all constraints in a table - * - * @param string $table name of table that should be used in method - * @return mixed array of constraint names on success, a MDB2 error on failure - * @access public - */ - function listTableConstraints($table) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $table = $db->quote($table, 'text'); - $query = "SELECT sql FROM sqlite_master WHERE type='index' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(tbl_name)='.strtolower($table); - } else { - $query.= "tbl_name=$table"; - } - $query.= " AND sql NOT NULL ORDER BY name"; - $indexes = $db->queryCol($query, 'text'); - if (PEAR::isError($indexes)) { - return $indexes; - } - - $result = array(); - foreach ($indexes as $sql) { - if (preg_match("/^create unique index ([^ ]+) on /i", $sql, $tmp)) { - $index = $this->_fixIndexName($tmp[1]); - if (!empty($index)) { - $result[$index] = true; - } - } - } - - // also search in table definition for PRIMARY KEYs... - $query = "SELECT sql FROM sqlite_master WHERE type='table' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)='.strtolower($table); - } else { - $query.= "name=$table"; - } - $query.= " AND sql NOT NULL ORDER BY name"; - $table_def = $db->queryOne($query, 'text'); - if (PEAR::isError($table_def)) { - return $table_def; - } - if (preg_match("/\bPRIMARY\s+KEY\b/i", $table_def, $tmp)) { - $result['primary'] = true; - } - - // ...and for FOREIGN KEYs - if (preg_match_all("/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN\s+KEY/imsx", $table_def, $tmp)) { - foreach ($tmp[1] as $fk) { - $result[$fk] = true; - } - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_change_key_case($result, $db->options['field_case']); - } - return array_keys($result); - } - - // }}} - // {{{ createSequence() - - /** - * create sequence - * - * @param string $seq_name name of the sequence to be created - * @param string $start start value of the sequence; default is 1 - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function createSequence($seq_name, $start = 1) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true); - $query = "CREATE TABLE $sequence_name ($seqcol_name INTEGER PRIMARY KEY DEFAULT 0 NOT NULL)"; - $res = $db->exec($query); - if (PEAR::isError($res)) { - return $res; - } - if ($start == 1) { - return MDB2_OK; - } - $res = $db->exec("INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')'); - if (!PEAR::isError($res)) { - return MDB2_OK; - } - // Handle error - $result = $db->exec("DROP TABLE $sequence_name"); - if (PEAR::isError($result)) { - return $db->raiseError($result, null, null, - 'could not drop inconsistent sequence table', __FUNCTION__); - } - return $db->raiseError($res, null, null, - 'could not create sequence table', __FUNCTION__); - } - - // }}} - // {{{ dropSequence() - - /** - * drop existing sequence - * - * @param string $seq_name name of the sequence to be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropSequence($seq_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); - $result = $db->exec("DROP TABLE $sequence_name"); - if (MDB2::isError($result)) { - return $result; - } - return MDB2_OK; - } - - // }}} - // {{{ listSequences() - - /** - * list all sequences in the current database - * - * @return mixed array of sequence names on success, a MDB2 error on failure - * @access public - */ - function listSequences() - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name"; - $table_names = $db->queryCol($query); - if (PEAR::isError($table_names)) { - return $table_names; - } - $result = array(); - foreach ($table_names as $table_name) { - if ($sqn = $this->_fixSequenceName($table_name, true)) { - $result[] = $sqn; - } - } - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result); - } - return $result; - } - - // }}} -} -?> diff --git a/3rdparty/MDB2/Driver/Native/Common.php b/3rdparty/MDB2/Driver/Native/Common.php deleted file mode 100644 index 67dc1bddd0..0000000000 --- a/3rdparty/MDB2/Driver/Native/Common.php +++ /dev/null @@ -1,61 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * Base class for the natuve modules that is extended by each MDB2 driver - * - * To load this module in the MDB2 object: - * $mdb->loadModule('Native'); - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Native_Common extends MDB2_Module_Common -{ -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/mysql.php b/3rdparty/MDB2/Driver/Native/mysql.php deleted file mode 100644 index 48e65a05fd..0000000000 --- a/3rdparty/MDB2/Driver/Native/mysql.php +++ /dev/null @@ -1,60 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Native/Common.php'; - -/** - * MDB2 MySQL driver for the native module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Native_mysql extends MDB2_Driver_Native_Common -{ -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/oci8.php b/3rdparty/MDB2/Driver/Native/oci8.php deleted file mode 100644 index d198f9687a..0000000000 --- a/3rdparty/MDB2/Driver/Native/oci8.php +++ /dev/null @@ -1,60 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: oci8.php 215004 2006-06-18 21:59:05Z lsmith $ -// - -require_once 'MDB2/Driver/Native/Common.php'; - -/** - * MDB2 Oracle driver for the native module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Native_oci8 extends MDB2_Driver_Native_Common -{ -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/pgsql.php b/3rdparty/MDB2/Driver/Native/pgsql.php deleted file mode 100644 index f4db5eae52..0000000000 --- a/3rdparty/MDB2/Driver/Native/pgsql.php +++ /dev/null @@ -1,88 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/Driver/Native/Common.php'; - -/** - * MDB2 PostGreSQL driver for the native module - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Driver_Native_pgsql extends MDB2_Driver_Native_Common -{ - // }}} - // {{{ deleteOID() - - /** - * delete an OID - * - * @param integer $OID - * @return mixed MDB2_OK on success or MDB2 Error Object on failure - * @access public - */ - function deleteOID($OID) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $connection = $db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - if (!@pg_lo_unlink($connection, $OID)) { - return $db->raiseError(null, null, null, - 'Unable to unlink OID: '.$OID, __FUNCTION__); - } - return MDB2_OK; - } - -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/sqlite.php b/3rdparty/MDB2/Driver/Native/sqlite.php deleted file mode 100644 index 4eb796dce7..0000000000 --- a/3rdparty/MDB2/Driver/Native/sqlite.php +++ /dev/null @@ -1,60 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Native/Common.php'; - -/** - * MDB2 SQLite driver for the native module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Native_sqlite extends MDB2_Driver_Native_Common -{ -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/Common.php b/3rdparty/MDB2/Driver/Reverse/Common.php deleted file mode 100644 index 2260520835..0000000000 --- a/3rdparty/MDB2/Driver/Reverse/Common.php +++ /dev/null @@ -1,517 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * @package MDB2 - * @category Database - */ - -/** - * These are constants for the tableInfo-function - * they are bitwised or'ed. so if there are more constants to be defined - * in the future, adjust MDB2_TABLEINFO_FULL accordingly - */ - -define('MDB2_TABLEINFO_ORDER', 1); -define('MDB2_TABLEINFO_ORDERTABLE', 2); -define('MDB2_TABLEINFO_FULL', 3); - -/** - * Base class for the schema reverse engineering module that is extended by each MDB2 driver - * - * To load this module in the MDB2 object: - * $mdb->loadModule('Reverse'); - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Reverse_Common extends MDB2_Module_Common -{ - // {{{ splitTableSchema() - - /** - * Split the "[owner|schema].table" notation into an array - * - * @param string $table [schema and] table name - * - * @return array array(schema, table) - * @access private - */ - function splitTableSchema($table) - { - $ret = array(); - if (strpos($table, '.') !== false) { - return explode('.', $table); - } - return array(null, $table); - } - - // }}} - // {{{ getTableFieldDefinition() - - /** - * Get the structure of a field into an array - * - * @param string $table name of table that should be used in method - * @param string $field name of field that should be used in method - * @return mixed data array on success, a MDB2 error on failure. - * The returned array contains an array for each field definition, - * with all or some of these indices, depending on the field data type: - * [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type] - * @access public - */ - function getTableFieldDefinition($table, $field) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ getTableIndexDefinition() - - /** - * Get the structure of an index into an array - * - * @param string $table name of table that should be used in method - * @param string $index name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * The returned array has this structure: - * - * array ( - * [fields] => array ( - * [field1name] => array() // one entry per each field covered - * [field2name] => array() // by the index - * [field3name] => array( - * [sorting] => ascending - * ) - * ) - * ); - * - * @access public - */ - function getTableIndexDefinition($table, $index) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ getTableConstraintDefinition() - - /** - * Get the structure of an constraints into an array - * - * @param string $table name of table that should be used in method - * @param string $index name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * The returned array has this structure: - *
    -     *          array (
    -     *              [primary] => 0
    -     *              [unique]  => 0
    -     *              [foreign] => 1
    -     *              [check]   => 0
    -     *              [fields] => array (
    -     *                  [field1name] => array() // one entry per each field covered
    -     *                  [field2name] => array() // by the index
    -     *                  [field3name] => array(
    -     *                      [sorting]  => ascending
    -     *                      [position] => 3
    -     *                  )
    -     *              )
    -     *              [references] => array(
    -     *                  [table] => name
    -     *                  [fields] => array(
    -     *                      [field1name] => array(  //one entry per each referenced field
    -     *                           [position] => 1
    -     *                      )
    -     *                  )
    -     *              )
    -     *              [deferrable] => 0
    -     *              [initiallydeferred] => 0
    -     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
    -     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
    -     *              [match] => SIMPLE|PARTIAL|FULL
    -     *          );
    -     *          
    - * @access public - */ - function getTableConstraintDefinition($table, $index) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ getSequenceDefinition() - - /** - * Get the structure of a sequence into an array - * - * @param string $sequence name of sequence that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * The returned array has this structure: - *
    -     *          array (
    -     *              [start] => n
    -     *          );
    -     *          
    - * @access public - */ - function getSequenceDefinition($sequence) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $start = $db->currId($sequence); - if (PEAR::isError($start)) { - return $start; - } - if ($db->supports('current_id')) { - $start++; - } else { - $db->warnings[] = 'database does not support getting current - sequence value, the sequence value was incremented'; - } - $definition = array(); - if ($start != 1) { - $definition = array('start' => $start); - } - return $definition; - } - - // }}} - // {{{ getTriggerDefinition() - - /** - * Get the structure of a trigger into an array - * - * EXPERIMENTAL - * - * WARNING: this function is experimental and may change the returned value - * at any time until labelled as non-experimental - * - * @param string $trigger name of trigger that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * The returned array has this structure: - *
    -     *          array (
    -     *              [trigger_name]    => 'trigger name',
    -     *              [table_name]      => 'table name',
    -     *              [trigger_body]    => 'trigger body definition',
    -     *              [trigger_type]    => 'BEFORE' | 'AFTER',
    -     *              [trigger_event]   => 'INSERT' | 'UPDATE' | 'DELETE'
    -     *                  //or comma separated list of multiple events, when supported
    -     *              [trigger_enabled] => true|false
    -     *              [trigger_comment] => 'trigger comment',
    -     *          );
    -     *          
    - * The oci8 driver also returns a [when_clause] index. - * @access public - */ - function getTriggerDefinition($trigger) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - // }}} - // {{{ tableInfo() - - /** - * Returns information about a table or a result set - * - * The format of the resulting array depends on which $mode - * you select. The sample output below is based on this query: - *
    -     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
    -     *    FROM tblFoo
    -     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
    -     * 
    - * - *
      - *
    • - * - * null (default) - *
      -     *   [0] => Array (
      -     *       [table] => tblFoo
      -     *       [name] => fldId
      -     *       [type] => int
      -     *       [len] => 11
      -     *       [flags] => primary_key not_null
      -     *   )
      -     *   [1] => Array (
      -     *       [table] => tblFoo
      -     *       [name] => fldPhone
      -     *       [type] => string
      -     *       [len] => 20
      -     *       [flags] =>
      -     *   )
      -     *   [2] => Array (
      -     *       [table] => tblBar
      -     *       [name] => fldId
      -     *       [type] => int
      -     *       [len] => 11
      -     *       [flags] => primary_key not_null
      -     *   )
      -     *   
      - * - *
    • - * - * MDB2_TABLEINFO_ORDER - * - *

      In addition to the information found in the default output, - * a notation of the number of columns is provided by the - * num_fields element while the order - * element provides an array with the column names as the keys and - * their location index number (corresponding to the keys in the - * the default output) as the values.

      - * - *

      If a result set has identical field names, the last one is - * used.

      - * - *
      -     *   [num_fields] => 3
      -     *   [order] => Array (
      -     *       [fldId] => 2
      -     *       [fldTrans] => 1
      -     *   )
      -     *   
      - * - *
    • - * - * MDB2_TABLEINFO_ORDERTABLE - * - *

      Similar to MDB2_TABLEINFO_ORDER but adds more - * dimensions to the array in which the table names are keys and - * the field names are sub-keys. This is helpful for queries that - * join tables which have identical field names.

      - * - *
      -     *   [num_fields] => 3
      -     *   [ordertable] => Array (
      -     *       [tblFoo] => Array (
      -     *           [fldId] => 0
      -     *           [fldPhone] => 1
      -     *       )
      -     *       [tblBar] => Array (
      -     *           [fldId] => 2
      -     *       )
      -     *   )
      -     *   
      - * - *
    • - *
    - * - * The flags element contains a space separated list - * of extra information about the field. This data is inconsistent - * between DBMS's due to the way each DBMS works. - * + primary_key - * + unique_key - * + multiple_key - * + not_null - * - * Most DBMS's only provide the table and flags - * elements if $result is a table name. The following DBMS's - * provide full information from queries: - * + fbsql - * + mysql - * - * If the 'portability' option has MDB2_PORTABILITY_FIX_CASE - * turned on, the names of tables and fields will be lower or upper cased. - * - * @param object|string $result MDB2_result object from a query or a - * string containing the name of a table. - * While this also accepts a query result - * resource identifier, this behavior is - * deprecated. - * @param int $mode either unused or one of the tableInfo modes: - * MDB2_TABLEINFO_ORDERTABLE, - * MDB2_TABLEINFO_ORDER or - * MDB2_TABLEINFO_FULL (which does both). - * These are bitwise, so the first two can be - * combined using |. - * - * @return array an associative array with the information requested. - * A MDB2_Error object on failure. - * - * @see MDB2_Driver_Common::setOption() - */ - function tableInfo($result, $mode = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if (!is_string($result)) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'method not implemented', __FUNCTION__); - } - - $db->loadModule('Manager', null, true); - $fields = $db->manager->listTableFields($result); - if (PEAR::isError($fields)) { - return $fields; - } - - $flags = array(); - - $idxname_format = $db->getOption('idxname_format'); - $db->setOption('idxname_format', '%s'); - - $indexes = $db->manager->listTableIndexes($result); - if (PEAR::isError($indexes)) { - $db->setOption('idxname_format', $idxname_format); - return $indexes; - } - - foreach ($indexes as $index) { - $definition = $this->getTableIndexDefinition($result, $index); - if (PEAR::isError($definition)) { - $db->setOption('idxname_format', $idxname_format); - return $definition; - } - if (count($definition['fields']) > 1) { - foreach ($definition['fields'] as $field => $sort) { - $flags[$field] = 'multiple_key'; - } - } - } - - $constraints = $db->manager->listTableConstraints($result); - if (PEAR::isError($constraints)) { - return $constraints; - } - - foreach ($constraints as $constraint) { - $definition = $this->getTableConstraintDefinition($result, $constraint); - if (PEAR::isError($definition)) { - $db->setOption('idxname_format', $idxname_format); - return $definition; - } - $flag = !empty($definition['primary']) - ? 'primary_key' : (!empty($definition['unique']) - ? 'unique_key' : false); - if ($flag) { - foreach ($definition['fields'] as $field => $sort) { - if (empty($flags[$field]) || $flags[$field] != 'primary_key') { - $flags[$field] = $flag; - } - } - } - } - - $res = array(); - - if ($mode) { - $res['num_fields'] = count($fields); - } - - foreach ($fields as $i => $field) { - $definition = $this->getTableFieldDefinition($result, $field); - if (PEAR::isError($definition)) { - $db->setOption('idxname_format', $idxname_format); - return $definition; - } - $res[$i] = $definition[0]; - $res[$i]['name'] = $field; - $res[$i]['table'] = $result; - $res[$i]['type'] = preg_replace('/^([a-z]+).*$/i', '\\1', trim($definition[0]['nativetype'])); - // 'primary_key', 'unique_key', 'multiple_key' - $res[$i]['flags'] = empty($flags[$field]) ? '' : $flags[$field]; - // not_null', 'unsigned', 'auto_increment', 'default_[rawencodedvalue]' - if (!empty($res[$i]['notnull'])) { - $res[$i]['flags'].= ' not_null'; - } - if (!empty($res[$i]['unsigned'])) { - $res[$i]['flags'].= ' unsigned'; - } - if (!empty($res[$i]['auto_increment'])) { - $res[$i]['flags'].= ' autoincrement'; - } - if (!empty($res[$i]['default'])) { - $res[$i]['flags'].= ' default_'.rawurlencode($res[$i]['default']); - } - - if ($mode & MDB2_TABLEINFO_ORDER) { - $res['order'][$res[$i]['name']] = $i; - } - if ($mode & MDB2_TABLEINFO_ORDERTABLE) { - $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; - } - } - - $db->setOption('idxname_format', $idxname_format); - return $res; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/mysql.php b/3rdparty/MDB2/Driver/Reverse/mysql.php deleted file mode 100644 index 8ebdc9979b..0000000000 --- a/3rdparty/MDB2/Driver/Reverse/mysql.php +++ /dev/null @@ -1,546 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Reverse/Common.php'; - -/** - * MDB2 MySQL driver for the schema reverse engineering module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - * @author Lorenzo Alberton - */ -class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common -{ - // {{{ getTableFieldDefinition() - - /** - * Get the structure of a field into an array - * - * @param string $table_name name of table that should be used in method - * @param string $field_name name of field that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableFieldDefinition($table_name, $field_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->loadModule('Datatype', null, true); - if (PEAR::isError($result)) { - return $result; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $table = $db->quoteIdentifier($table, true); - $query = "SHOW FULL COLUMNS FROM $table LIKE ".$db->quote($field_name); - $columns = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($columns)) { - return $columns; - } - foreach ($columns as $column) { - $column = array_change_key_case($column, CASE_LOWER); - $column['name'] = $column['field']; - unset($column['field']); - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column['name'] = strtolower($column['name']); - } else { - $column['name'] = strtoupper($column['name']); - } - } else { - $column = array_change_key_case($column, $db->options['field_case']); - } - if ($field_name == $column['name']) { - $mapped_datatype = $db->datatype->mapNativeDatatype($column); - if (PEAR::isError($mapped_datatype)) { - return $mapped_datatype; - } - list($types, $length, $unsigned, $fixed) = $mapped_datatype; - $notnull = false; - if (empty($column['null']) || $column['null'] !== 'YES') { - $notnull = true; - } - $default = false; - if (array_key_exists('default', $column)) { - $default = $column['default']; - if ((null === $default) && $notnull) { - $default = ''; - } - } - $definition[0] = array( - 'notnull' => $notnull, - 'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type']) - ); - $autoincrement = false; - if (!empty($column['extra'])) { - if ($column['extra'] == 'auto_increment') { - $autoincrement = true; - } else { - $definition[0]['extra'] = $column['extra']; - } - } - $collate = null; - if (!empty($column['collation'])) { - $collate = $column['collation']; - $charset = preg_replace('/(.+?)(_.+)?/', '$1', $collate); - } - - if (null !== $length) { - $definition[0]['length'] = $length; - } - if (null !== $unsigned) { - $definition[0]['unsigned'] = $unsigned; - } - if (null !== $fixed) { - $definition[0]['fixed'] = $fixed; - } - if ($default !== false) { - $definition[0]['default'] = $default; - } - if ($autoincrement !== false) { - $definition[0]['autoincrement'] = $autoincrement; - } - if (null !== $collate) { - $definition[0]['collate'] = $collate; - $definition[0]['charset'] = $charset; - } - foreach ($types as $key => $type) { - $definition[$key] = $definition[0]; - if ($type == 'clob' || $type == 'blob') { - unset($definition[$key]['default']); - } elseif ($type == 'timestamp' && $notnull && empty($definition[$key]['default'])) { - $definition[$key]['default'] = '0000-00-00 00:00:00'; - } - $definition[$key]['type'] = $type; - $definition[$key]['mdb2type'] = $type; - } - return $definition; - } - } - - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table column', __FUNCTION__); - } - - // }}} - // {{{ getTableIndexDefinition() - - /** - * Get the structure of an index into an array - * - * @param string $table_name name of table that should be used in method - * @param string $index_name name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableIndexDefinition($table_name, $index_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $table = $db->quoteIdentifier($table, true); - $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */"; - $index_name_mdb2 = $db->getIndexName($index_name); - $result = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2))); - if (!PEAR::isError($result) && (null !== $result)) { - // apply 'idxname_format' only if the query succeeded, otherwise - // fallback to the given $index_name, without transformation - $index_name = $index_name_mdb2; - } - $result = $db->query(sprintf($query, $db->quote($index_name))); - if (PEAR::isError($result)) { - return $result; - } - $colpos = 1; - $definition = array(); - while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) { - $row = array_change_key_case($row, CASE_LOWER); - $key_name = $row['key_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $key_name = strtolower($key_name); - } else { - $key_name = strtoupper($key_name); - } - } - if ($index_name == $key_name) { - if (!$row['non_unique']) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $index_name . ' is not an existing table index', __FUNCTION__); - } - $column_name = $row['column_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column_name = strtolower($column_name); - } else { - $column_name = strtoupper($column_name); - } - } - $definition['fields'][$column_name] = array( - 'position' => $colpos++ - ); - if (!empty($row['collation'])) { - $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A' - ? 'ascending' : 'descending'); - } - } - } - $result->free(); - if (empty($definition['fields'])) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $index_name . ' is not an existing table index', __FUNCTION__); - } - return $definition; - } - - // }}} - // {{{ getTableConstraintDefinition() - - /** - * Get the structure of a constraint into an array - * - * @param string $table_name name of table that should be used in method - * @param string $constraint_name name of constraint that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableConstraintDefinition($table_name, $constraint_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - $constraint_name_original = $constraint_name; - - $table = $db->quoteIdentifier($table, true); - $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */"; - if (strtolower($constraint_name) != 'primary') { - $constraint_name_mdb2 = $db->getIndexName($constraint_name); - $result = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2))); - if (!PEAR::isError($result) && (null !== $result)) { - // apply 'idxname_format' only if the query succeeded, otherwise - // fallback to the given $index_name, without transformation - $constraint_name = $constraint_name_mdb2; - } - } - $result = $db->query(sprintf($query, $db->quote($constraint_name))); - if (PEAR::isError($result)) { - return $result; - } - $colpos = 1; - //default values, eventually overridden - $definition = array( - 'primary' => false, - 'unique' => false, - 'foreign' => false, - 'check' => false, - 'fields' => array(), - 'references' => array( - 'table' => '', - 'fields' => array(), - ), - 'onupdate' => '', - 'ondelete' => '', - 'match' => '', - 'deferrable' => false, - 'initiallydeferred' => false, - ); - while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) { - $row = array_change_key_case($row, CASE_LOWER); - $key_name = $row['key_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $key_name = strtolower($key_name); - } else { - $key_name = strtoupper($key_name); - } - } - if ($constraint_name == $key_name) { - if ($row['non_unique']) { - //FOREIGN KEY? - return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition); - } - if ($row['key_name'] == 'PRIMARY') { - $definition['primary'] = true; - } elseif (!$row['non_unique']) { - $definition['unique'] = true; - } - $column_name = $row['column_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column_name = strtolower($column_name); - } else { - $column_name = strtoupper($column_name); - } - } - $definition['fields'][$column_name] = array( - 'position' => $colpos++ - ); - if (!empty($row['collation'])) { - $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A' - ? 'ascending' : 'descending'); - } - } - } - $result->free(); - if (empty($definition['fields'])) { - return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition); - } - return $definition; - } - - // }}} - // {{{ _getTableFKConstraintDefinition() - - /** - * Get the FK definition from the CREATE TABLE statement - * - * @param string $table table name - * @param string $constraint_name constraint name - * @param array $definition default values for constraint definition - * - * @return array|PEAR_Error - * @access private - */ - function _getTableFKConstraintDefinition($table, $constraint_name, $definition) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - //Use INFORMATION_SCHEMA instead? - //SELECT * - // FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS - // WHERE CONSTRAINT_SCHEMA = '$dbname' - // AND TABLE_NAME = '$table' - // AND CONSTRAINT_NAME = '$constraint_name'; - $query = 'SHOW CREATE TABLE '. $db->escape($table); - $constraint = $db->queryOne($query, 'text', 1); - if (!PEAR::isError($constraint) && !empty($constraint)) { - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $constraint = strtolower($constraint); - } else { - $constraint = strtoupper($constraint); - } - } - $constraint_name_original = $constraint_name; - $constraint_name = $db->getIndexName($constraint_name); - $pattern = '/\bCONSTRAINT\s+'.$constraint_name.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i'; - if (!preg_match($pattern, str_replace('`', '', $constraint), $matches)) { - //fallback to original constraint name - $pattern = '/\bCONSTRAINT\s+'.$constraint_name_original.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i'; - } - if (preg_match($pattern, str_replace('`', '', $constraint), $matches)) { - $definition['foreign'] = true; - $column_names = explode(',', $matches[1]); - $referenced_cols = explode(',', $matches[3]); - $definition['references'] = array( - 'table' => $matches[2], - 'fields' => array(), - ); - $colpos = 1; - foreach ($column_names as $column_name) { - $definition['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - $colpos = 1; - foreach ($referenced_cols as $column_name) { - $definition['references']['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - $definition['ondelete'] = empty($matches[4]) ? 'RESTRICT' : strtoupper($matches[4]); - $definition['onupdate'] = empty($matches[5]) ? 'RESTRICT' : strtoupper($matches[5]); - $definition['match'] = 'SIMPLE'; - return $definition; - } - } - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not an existing table constraint', __FUNCTION__); - } - - // }}} - // {{{ getTriggerDefinition() - - /** - * Get the structure of a trigger into an array - * - * EXPERIMENTAL - * - * WARNING: this function is experimental and may change the returned value - * at any time until labelled as non-experimental - * - * @param string $trigger name of trigger that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTriggerDefinition($trigger) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT trigger_name, - event_object_table AS table_name, - action_statement AS trigger_body, - action_timing AS trigger_type, - event_manipulation AS trigger_event - FROM information_schema.triggers - WHERE trigger_name = '. $db->quote($trigger, 'text'); - $types = array( - 'trigger_name' => 'text', - 'table_name' => 'text', - 'trigger_body' => 'text', - 'trigger_type' => 'text', - 'trigger_event' => 'text', - ); - $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($def)) { - return $def; - } - $def['trigger_comment'] = ''; - $def['trigger_enabled'] = true; - return $def; - } - - // }}} - // {{{ tableInfo() - - /** - * Returns information about a table or a result set - * - * @param object|string $result MDB2_result object from a query or a - * string containing the name of a table. - * While this also accepts a query result - * resource identifier, this behavior is - * deprecated. - * @param int $mode a valid tableInfo mode - * - * @return array an associative array with the information requested. - * A MDB2_Error object on failure. - * - * @see MDB2_Driver_Common::setOption() - */ - function tableInfo($result, $mode = null) - { - if (is_string($result)) { - return parent::tableInfo($result, $mode); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; - if (!is_resource($resource)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'Could not generate result resource', __FUNCTION__); - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $case_func = 'strtolower'; - } else { - $case_func = 'strtoupper'; - } - } else { - $case_func = 'strval'; - } - - $count = @mysql_num_fields($resource); - $res = array(); - if ($mode) { - $res['num_fields'] = $count; - } - - $db->loadModule('Datatype', null, true); - for ($i = 0; $i < $count; $i++) { - $res[$i] = array( - 'table' => $case_func(@mysql_field_table($resource, $i)), - 'name' => $case_func(@mysql_field_name($resource, $i)), - 'type' => @mysql_field_type($resource, $i), - 'length' => @mysql_field_len($resource, $i), - 'flags' => @mysql_field_flags($resource, $i), - ); - if ($res[$i]['type'] == 'string') { - $res[$i]['type'] = 'char'; - } elseif ($res[$i]['type'] == 'unknown') { - $res[$i]['type'] = 'decimal'; - } - $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]); - if (PEAR::isError($mdb2type_info)) { - return $mdb2type_info; - } - $res[$i]['mdb2type'] = $mdb2type_info[0][0]; - if ($mode & MDB2_TABLEINFO_ORDER) { - $res['order'][$res[$i]['name']] = $i; - } - if ($mode & MDB2_TABLEINFO_ORDERTABLE) { - $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; - } - } - - return $res; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/oci8.php b/3rdparty/MDB2/Driver/Reverse/oci8.php deleted file mode 100644 index d89ad77137..0000000000 --- a/3rdparty/MDB2/Driver/Reverse/oci8.php +++ /dev/null @@ -1,625 +0,0 @@ - | -// | Lorenzo Alberton | -// +----------------------------------------------------------------------+ -// -// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ -// - -require_once 'MDB2/Driver/Reverse/Common.php'; - -/** - * MDB2 Oracle driver for the schema reverse engineering module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common -{ - // {{{ getTableFieldDefinition() - - /** - * Get the structure of a field into an array - * - * @param string $table_name name of table that should be used in method - * @param string $field_name name of field that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableFieldDefinition($table_name, $field_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->loadModule('Datatype', null, true); - if (PEAR::isError($result)) { - return $result; - } - - list($owner, $table) = $this->splitTableSchema($table_name); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT column_name AS "name", - data_type AS "type", - nullable AS "nullable", - data_default AS "default", - COALESCE(data_precision, data_length) AS "length", - data_scale AS "scale" - FROM all_tab_columns - WHERE (table_name=? OR table_name=?) - AND (owner=? OR owner=?) - AND (column_name=? OR column_name=?) - ORDER BY column_id'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $args = array( - $table, - strtoupper($table), - $owner, - strtoupper($owner), - $field_name, - strtoupper($field_name) - ); - $result = $stmt->execute($args); - if (PEAR::isError($result)) { - return $result; - } - $column = $result->fetchRow(MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($column)) { - return $column; - } - $stmt->free(); - $result->free(); - - if (empty($column)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $field_name . ' is not a column in table ' . $table_name, __FUNCTION__); - } - - $column = array_change_key_case($column, CASE_LOWER); - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column['name'] = strtolower($column['name']); - } else { - $column['name'] = strtoupper($column['name']); - } - } - $mapped_datatype = $db->datatype->mapNativeDatatype($column); - if (PEAR::isError($mapped_datatype)) { - return $mapped_datatype; - } - list($types, $length, $unsigned, $fixed) = $mapped_datatype; - $notnull = false; - if (!empty($column['nullable']) && $column['nullable'] == 'N') { - $notnull = true; - } - $default = false; - if (array_key_exists('default', $column)) { - $default = $column['default']; - if ($default === 'NULL') { - $default = null; - } - //ugly hack, but works for the reverse direction - if ($default == "''") { - $default = ''; - } - if ((null === $default) && $notnull) { - $default = ''; - } - } - - $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); - if (null !== $length) { - $definition[0]['length'] = $length; - } - if (null !== $unsigned) { - $definition[0]['unsigned'] = $unsigned; - } - if (null !== $fixed) { - $definition[0]['fixed'] = $fixed; - } - if ($default !== false) { - $definition[0]['default'] = $default; - } - foreach ($types as $key => $type) { - $definition[$key] = $definition[0]; - if ($type == 'clob' || $type == 'blob') { - unset($definition[$key]['default']); - } - $definition[$key]['type'] = $type; - $definition[$key]['mdb2type'] = $type; - } - if ($type == 'integer') { - $query= "SELECT trigger_body - FROM all_triggers - WHERE table_name=? - AND triggering_event='INSERT' - AND trigger_type='BEFORE EACH ROW'"; - // ^^ pretty reasonable mimic for "auto_increment" in oracle? - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute(strtoupper($table)); - if (PEAR::isError($result)) { - return $result; - } - while ($triggerstr = $result->fetchOne()) { - if (preg_match('/.*SELECT\W+(.+)\.nextval +into +\:NEW\.'.$field_name.' +FROM +dual/im', $triggerstr, $matches)) { - $definition[0]['autoincrement'] = $matches[1]; - } - } - $stmt->free(); - $result->free(); - } - return $definition; - } - - // }}} - // {{{ getTableIndexDefinition() - - /** - * Get the structure of an index into an array - * - * @param string $table_name name of table that should be used in method - * @param string $index_name name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableIndexDefinition($table_name, $index_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($owner, $table) = $this->splitTableSchema($table_name); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT aic.column_name AS "column_name", - aic.column_position AS "column_position", - aic.descend AS "descend", - aic.table_owner AS "table_owner", - alc.constraint_type AS "constraint_type" - FROM all_ind_columns aic - LEFT JOIN all_constraints alc - ON aic.index_name = alc.constraint_name - AND aic.table_name = alc.table_name - AND aic.table_owner = alc.owner - WHERE (aic.table_name=? OR aic.table_name=?) - AND (aic.index_name=? OR aic.index_name=?) - AND (aic.table_owner=? OR aic.table_owner=?) - ORDER BY column_position'; - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - $indexnames = array_unique(array($db->getIndexName($index_name), $index_name)); - $i = 0; - $row = null; - while ((null === $row) && array_key_exists($i, $indexnames)) { - $args = array( - $table, - strtoupper($table), - $indexnames[$i], - strtoupper($indexnames[$i]), - $owner, - strtoupper($owner) - ); - $result = $stmt->execute($args); - if (PEAR::isError($result)) { - return $result; - } - $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($row)) { - return $row; - } - $i++; - } - if (null === $row) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $index_name. ' is not an index on table '. $table_name, __FUNCTION__); - } - if ($row['constraint_type'] == 'U' || $row['constraint_type'] == 'P') { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $index_name. ' is a constraint, not an index on table '. $table_name, __FUNCTION__); - } - - $definition = array(); - while (null !== $row) { - $row = array_change_key_case($row, CASE_LOWER); - $column_name = $row['column_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column_name = strtolower($column_name); - } else { - $column_name = strtoupper($column_name); - } - } - $definition['fields'][$column_name] = array( - 'position' => (int)$row['column_position'], - ); - if (!empty($row['descend'])) { - $definition['fields'][$column_name]['sorting'] = - ($row['descend'] == 'ASC' ? 'ascending' : 'descending'); - } - $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); - } - $result->free(); - if (empty($definition['fields'])) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $index_name. ' is not an index on table '. $table_name, __FUNCTION__); - } - return $definition; - } - - // }}} - // {{{ getTableConstraintDefinition() - - /** - * Get the structure of a constraint into an array - * - * @param string $table_name name of table that should be used in method - * @param string $constraint_name name of constraint that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableConstraintDefinition($table_name, $constraint_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($owner, $table) = $this->splitTableSchema($table_name); - if (empty($owner)) { - $owner = $db->dsn['username']; - } - - $query = 'SELECT alc.constraint_name, - CASE alc.constraint_type WHEN \'P\' THEN 1 ELSE 0 END "primary", - CASE alc.constraint_type WHEN \'R\' THEN 1 ELSE 0 END "foreign", - CASE alc.constraint_type WHEN \'U\' THEN 1 ELSE 0 END "unique", - CASE alc.constraint_type WHEN \'C\' THEN 1 ELSE 0 END "check", - alc.DELETE_RULE "ondelete", - \'NO ACTION\' "onupdate", - \'SIMPLE\' "match", - CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable", - CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred", - alc.search_condition AS "search_condition", - alc.table_name, - cols.column_name AS "column_name", - cols.position, - r_alc.table_name "references_table", - r_cols.column_name "references_field", - r_cols.position "references_field_position" - FROM all_cons_columns cols - LEFT JOIN all_constraints alc - ON alc.constraint_name = cols.constraint_name - AND alc.owner = cols.owner - LEFT JOIN all_constraints r_alc - ON alc.r_constraint_name = r_alc.constraint_name - AND alc.r_owner = r_alc.owner - LEFT JOIN all_cons_columns r_cols - ON r_alc.constraint_name = r_cols.constraint_name - AND r_alc.owner = r_cols.owner - AND cols.position = r_cols.position - WHERE (alc.constraint_name=? OR alc.constraint_name=?) - AND alc.constraint_name = cols.constraint_name - AND (alc.owner=? OR alc.owner=?)'; - $tablenames = array(); - if (!empty($table)) { - $query.= ' AND (alc.table_name=? OR alc.table_name=?)'; - $tablenames = array($table, strtoupper($table)); - } - $stmt = $db->prepare($query); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $constraintnames = array_unique(array($db->getIndexName($constraint_name), $constraint_name)); - $c = 0; - $row = null; - while ((null === $row) && array_key_exists($c, $constraintnames)) { - $args = array( - $constraintnames[$c], - strtoupper($constraintnames[$c]), - $owner, - strtoupper($owner) - ); - if (!empty($table)) { - $args = array_merge($args, $tablenames); - } - $result = $stmt->execute($args); - if (PEAR::isError($result)) { - return $result; - } - $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($row)) { - return $row; - } - $c++; - } - - $definition = array( - 'primary' => (boolean)$row['primary'], - 'unique' => (boolean)$row['unique'], - 'foreign' => (boolean)$row['foreign'], - 'check' => (boolean)$row['check'], - 'deferrable' => (boolean)$row['deferrable'], - 'initiallydeferred' => (boolean)$row['initiallydeferred'], - 'ondelete' => $row['ondelete'], - 'onupdate' => $row['onupdate'], - 'match' => $row['match'], - ); - - if ($definition['check']) { - // pattern match constraint for check constraint values into enum-style output: - $enumregex = '/'.$row['column_name'].' in \((.+?)\)/i'; - if (preg_match($enumregex, $row['search_condition'], $rangestr)) { - $definition['fields'][$column_name] = array(); - $allowed = explode(',', $rangestr[1]); - foreach ($allowed as $val) { - $val = trim($val); - $val = preg_replace('/^\'/', '', $val); - $val = preg_replace('/\'$/', '', $val); - array_push($definition['fields'][$column_name], $val); - } - } - } - - while (null !== $row) { - $row = array_change_key_case($row, CASE_LOWER); - $column_name = $row['column_name']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column_name = strtolower($column_name); - } else { - $column_name = strtoupper($column_name); - } - } - $definition['fields'][$column_name] = array( - 'position' => (int)$row['position'] - ); - if ($row['foreign']) { - $ref_column_name = $row['references_field']; - $ref_table_name = $row['references_table']; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $ref_column_name = strtolower($ref_column_name); - $ref_table_name = strtolower($ref_table_name); - } else { - $ref_column_name = strtoupper($ref_column_name); - $ref_table_name = strtoupper($ref_table_name); - } - } - $definition['references']['table'] = $ref_table_name; - $definition['references']['fields'][$ref_column_name] = array( - 'position' => (int)$row['references_field_position'] - ); - } - $lastrow = $row; - $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); - } - $result->free(); - if (empty($definition['fields'])) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not a constraint on table '. $table_name, __FUNCTION__); - } - - return $definition; - } - - // }}} - // {{{ getSequenceDefinition() - - /** - * Get the structure of a sequence into an array - * - * @param string $sequence name of sequence that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getSequenceDefinition($sequence) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $sequence_name = $db->getSequenceName($sequence); - $query = 'SELECT last_number FROM user_sequences'; - $query.= ' WHERE sequence_name='.$db->quote($sequence_name, 'text'); - $query.= ' OR sequence_name='.$db->quote(strtoupper($sequence_name), 'text'); - $start = $db->queryOne($query, 'integer'); - if (PEAR::isError($start)) { - return $start; - } - $definition = array(); - if ($start != 1) { - $definition = array('start' => $start); - } - return $definition; - } - - // }}} - // {{{ getTriggerDefinition() - - /** - * Get the structure of a trigger into an array - * - * EXPERIMENTAL - * - * WARNING: this function is experimental and may change the returned value - * at any time until labelled as non-experimental - * - * @param string $trigger name of trigger that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTriggerDefinition($trigger) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = 'SELECT trigger_name AS "trigger_name", - table_name AS "table_name", - trigger_body AS "trigger_body", - trigger_type AS "trigger_type", - triggering_event AS "trigger_event", - description AS "trigger_comment", - 1 AS "trigger_enabled", - when_clause AS "when_clause" - FROM user_triggers - WHERE trigger_name = \''. strtoupper($trigger).'\''; - $types = array( - 'trigger_name' => 'text', - 'table_name' => 'text', - 'trigger_body' => 'text', - 'trigger_type' => 'text', - 'trigger_event' => 'text', - 'trigger_comment' => 'text', - 'trigger_enabled' => 'boolean', - 'when_clause' => 'text', - ); - $result = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($result)) { - return $result; - } - if (!empty($result['trigger_type'])) { - //$result['trigger_type'] = array_shift(explode(' ', $result['trigger_type'])); - $result['trigger_type'] = preg_replace('/(\S+).*/', '\\1', $result['trigger_type']); - } - return $result; - } - - // }}} - // {{{ tableInfo() - - /** - * Returns information about a table or a result set - * - * NOTE: only supports 'table' and 'flags' if $result - * is a table name. - * - * NOTE: flags won't contain index information. - * - * @param object|string $result MDB2_result object from a query or a - * string containing the name of a table. - * While this also accepts a query result - * resource identifier, this behavior is - * deprecated. - * @param int $mode a valid tableInfo mode - * - * @return array an associative array with the information requested. - * A MDB2_Error object on failure. - * - * @see MDB2_Driver_Common::tableInfo() - */ - function tableInfo($result, $mode = null) - { - if (is_string($result)) { - return parent::tableInfo($result, $mode); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; - if (!is_resource($resource)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'Could not generate result resource', __FUNCTION__); - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $case_func = 'strtolower'; - } else { - $case_func = 'strtoupper'; - } - } else { - $case_func = 'strval'; - } - - $count = @OCINumCols($resource); - $res = array(); - - if ($mode) { - $res['num_fields'] = $count; - } - - $db->loadModule('Datatype', null, true); - for ($i = 0; $i < $count; $i++) { - $column = array( - 'table' => '', - 'name' => $case_func(@OCIColumnName($resource, $i+1)), - 'type' => @OCIColumnType($resource, $i+1), - 'length' => @OCIColumnSize($resource, $i+1), - 'flags' => '', - ); - $res[$i] = $column; - $res[$i]['mdb2type'] = $db->datatype->mapNativeDatatype($res[$i]); - if ($mode & MDB2_TABLEINFO_ORDER) { - $res['order'][$res[$i]['name']] = $i; - } - if ($mode & MDB2_TABLEINFO_ORDERTABLE) { - $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; - } - } - return $res; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/pgsql.php b/3rdparty/MDB2/Driver/Reverse/pgsql.php deleted file mode 100644 index eab02f9b99..0000000000 --- a/3rdparty/MDB2/Driver/Reverse/pgsql.php +++ /dev/null @@ -1,574 +0,0 @@ - | -// | Lorenzo Alberton | -// +----------------------------------------------------------------------+ -// -// $Id$ - -require_once 'MDB2/Driver/Reverse/Common.php'; - -/** - * MDB2 PostGreSQL driver for the schema reverse engineering module - * - * @package MDB2 - * @category Database - * @author Paul Cooper - * @author Lorenzo Alberton - */ -class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common -{ - // {{{ getTableFieldDefinition() - - /** - * Get the structure of a field into an array - * - * @param string $table_name name of table that should be used in method - * @param string $field_name name of field that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableFieldDefinition($table_name, $field_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->loadModule('Datatype', null, true); - if (PEAR::isError($result)) { - return $result; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $query = "SELECT a.attname AS name, - t.typname AS type, - CASE a.attlen - WHEN -1 THEN - CASE t.typname - WHEN 'numeric' THEN (a.atttypmod / 65536) - WHEN 'decimal' THEN (a.atttypmod / 65536) - WHEN 'money' THEN (a.atttypmod / 65536) - ELSE CASE a.atttypmod - WHEN -1 THEN NULL - ELSE a.atttypmod - 4 - END - END - ELSE a.attlen - END AS length, - CASE t.typname - WHEN 'numeric' THEN (a.atttypmod % 65536) - 4 - WHEN 'decimal' THEN (a.atttypmod % 65536) - 4 - WHEN 'money' THEN (a.atttypmod % 65536) - 4 - ELSE 0 - END AS scale, - a.attnotnull, - a.atttypmod, - a.atthasdef, - (SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128) - FROM pg_attrdef d - WHERE d.adrelid = a.attrelid - AND d.adnum = a.attnum - AND a.atthasdef - ) as default - FROM pg_attribute a, - pg_class c, - pg_type t - WHERE c.relname = ".$db->quote($table, 'text')." - AND a.atttypid = t.oid - AND c.oid = a.attrelid - AND NOT a.attisdropped - AND a.attnum > 0 - AND a.attname = ".$db->quote($field_name, 'text')." - ORDER BY a.attnum"; - $column = $db->queryRow($query, null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($column)) { - return $column; - } - - if (empty($column)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table column', __FUNCTION__); - } - - $column = array_change_key_case($column, CASE_LOWER); - $mapped_datatype = $db->datatype->mapNativeDatatype($column); - if (PEAR::isError($mapped_datatype)) { - return $mapped_datatype; - } - list($types, $length, $unsigned, $fixed) = $mapped_datatype; - $notnull = false; - if (!empty($column['attnotnull']) && $column['attnotnull'] == 't') { - $notnull = true; - } - $default = null; - if ($column['atthasdef'] === 't' - && strpos($column['default'], 'NULL') !== 0 - && !preg_match("/nextval\('([^']+)'/", $column['default']) - ) { - $pattern = '/^\'(.*)\'::[\w ]+$/i'; - $default = $column['default'];#substr($column['adsrc'], 1, -1); - if ((null === $default) && $notnull) { - $default = ''; - } elseif (!empty($default) && preg_match($pattern, $default)) { - //remove data type cast - $default = preg_replace ($pattern, '\\1', $default); - } - } - $autoincrement = false; - if (preg_match("/nextval\('([^']+)'/", $column['default'], $nextvals)) { - $autoincrement = true; - } - $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); - if (null !== $length) { - $definition[0]['length'] = $length; - } - if (null !== $unsigned) { - $definition[0]['unsigned'] = $unsigned; - } - if (null !== $fixed) { - $definition[0]['fixed'] = $fixed; - } - if ($default !== false) { - $definition[0]['default'] = $default; - } - if ($autoincrement !== false) { - $definition[0]['autoincrement'] = $autoincrement; - } - foreach ($types as $key => $type) { - $definition[$key] = $definition[0]; - if ($type == 'clob' || $type == 'blob') { - unset($definition[$key]['default']); - } - $definition[$key]['type'] = $type; - $definition[$key]['mdb2type'] = $type; - } - return $definition; - } - - // }}} - // {{{ getTableIndexDefinition() - - /** - * Get the structure of an index into an array - * - * @param string $table_name name of table that should be used in method - * @param string $index_name name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableIndexDefinition($table_name, $index_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $query = 'SELECT relname, indkey FROM pg_index, pg_class'; - $query.= ' WHERE pg_class.oid = pg_index.indexrelid'; - $query.= " AND indisunique != 't' AND indisprimary != 't'"; - $query.= ' AND pg_class.relname = %s'; - $index_name_mdb2 = $db->getIndexName($index_name); - $row = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($row) || empty($row)) { - // fallback to the given $index_name, without transformation - $row = $db->queryRow(sprintf($query, $db->quote($index_name, 'text')), null, MDB2_FETCHMODE_ASSOC); - } - if (PEAR::isError($row)) { - return $row; - } - - if (empty($row)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table index', __FUNCTION__); - } - - $row = array_change_key_case($row, CASE_LOWER); - - $db->loadModule('Manager', null, true); - $columns = $db->manager->listTableFields($table_name); - - $definition = array(); - - $index_column_numbers = explode(' ', $row['indkey']); - - $colpos = 1; - foreach ($index_column_numbers as $number) { - $definition['fields'][$columns[($number - 1)]] = array( - 'position' => $colpos++, - 'sorting' => 'ascending', - ); - } - return $definition; - } - - // }}} - // {{{ getTableConstraintDefinition() - - /** - * Get the structure of a constraint into an array - * - * @param string $table_name name of table that should be used in method - * @param string $constraint_name name of constraint that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableConstraintDefinition($table_name, $constraint_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $query = "SELECT c.oid, - c.conname AS constraint_name, - CASE WHEN c.contype = 'c' THEN 1 ELSE 0 END AS \"check\", - CASE WHEN c.contype = 'f' THEN 1 ELSE 0 END AS \"foreign\", - CASE WHEN c.contype = 'p' THEN 1 ELSE 0 END AS \"primary\", - CASE WHEN c.contype = 'u' THEN 1 ELSE 0 END AS \"unique\", - CASE WHEN c.condeferrable = 'f' THEN 0 ELSE 1 END AS deferrable, - CASE WHEN c.condeferred = 'f' THEN 0 ELSE 1 END AS initiallydeferred, - --array_to_string(c.conkey, ' ') AS constraint_key, - t.relname AS table_name, - t2.relname AS references_table, - CASE confupdtype - WHEN 'a' THEN 'NO ACTION' - WHEN 'r' THEN 'RESTRICT' - WHEN 'c' THEN 'CASCADE' - WHEN 'n' THEN 'SET NULL' - WHEN 'd' THEN 'SET DEFAULT' - END AS onupdate, - CASE confdeltype - WHEN 'a' THEN 'NO ACTION' - WHEN 'r' THEN 'RESTRICT' - WHEN 'c' THEN 'CASCADE' - WHEN 'n' THEN 'SET NULL' - WHEN 'd' THEN 'SET DEFAULT' - END AS ondelete, - CASE confmatchtype - WHEN 'u' THEN 'UNSPECIFIED' - WHEN 'f' THEN 'FULL' - WHEN 'p' THEN 'PARTIAL' - END AS match, - --array_to_string(c.confkey, ' ') AS fk_constraint_key, - consrc - FROM pg_constraint c - LEFT JOIN pg_class t ON c.conrelid = t.oid - LEFT JOIN pg_class t2 ON c.confrelid = t2.oid - WHERE c.conname = %s - AND t.relname = " . $db->quote($table, 'text'); - $constraint_name_mdb2 = $db->getIndexName($constraint_name); - $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($row) || empty($row)) { - // fallback to the given $index_name, without transformation - $constraint_name_mdb2 = $constraint_name; - $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC); - } - if (PEAR::isError($row)) { - return $row; - } - $uniqueIndex = false; - if (empty($row)) { - // We might be looking for a UNIQUE index that was not created - // as a constraint but should be treated as such. - $query = 'SELECT relname AS constraint_name, - indkey, - 0 AS "check", - 0 AS "foreign", - 0 AS "primary", - 1 AS "unique", - 0 AS deferrable, - 0 AS initiallydeferred, - NULL AS references_table, - NULL AS onupdate, - NULL AS ondelete, - NULL AS match - FROM pg_index, pg_class - WHERE pg_class.oid = pg_index.indexrelid - AND indisunique = \'t\' - AND pg_class.relname = %s'; - $constraint_name_mdb2 = $db->getIndexName($constraint_name); - $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($row) || empty($row)) { - // fallback to the given $index_name, without transformation - $constraint_name_mdb2 = $constraint_name; - $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC); - } - if (PEAR::isError($row)) { - return $row; - } - if (empty($row)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not an existing table constraint', __FUNCTION__); - } - $uniqueIndex = true; - } - - $row = array_change_key_case($row, CASE_LOWER); - - $definition = array( - 'primary' => (boolean)$row['primary'], - 'unique' => (boolean)$row['unique'], - 'foreign' => (boolean)$row['foreign'], - 'check' => (boolean)$row['check'], - 'fields' => array(), - 'references' => array( - 'table' => $row['references_table'], - 'fields' => array(), - ), - 'deferrable' => (boolean)$row['deferrable'], - 'initiallydeferred' => (boolean)$row['initiallydeferred'], - 'onupdate' => $row['onupdate'], - 'ondelete' => $row['ondelete'], - 'match' => $row['match'], - ); - - if ($uniqueIndex) { - $db->loadModule('Manager', null, true); - $columns = $db->manager->listTableFields($table_name); - $index_column_numbers = explode(' ', $row['indkey']); - $colpos = 1; - foreach ($index_column_numbers as $number) { - $definition['fields'][$columns[($number - 1)]] = array( - 'position' => $colpos++, - 'sorting' => 'ascending', - ); - } - return $definition; - } - - $query = 'SELECT a.attname - FROM pg_constraint c - LEFT JOIN pg_class t ON c.conrelid = t.oid - LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey) - WHERE c.conname = %s - AND t.relname = ' . $db->quote($table, 'text'); - $fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null); - if (PEAR::isError($fields)) { - return $fields; - } - $colpos = 1; - foreach ($fields as $field) { - $definition['fields'][$field] = array( - 'position' => $colpos++, - 'sorting' => 'ascending', - ); - } - - if ($definition['foreign']) { - $query = 'SELECT a.attname - FROM pg_constraint c - LEFT JOIN pg_class t ON c.confrelid = t.oid - LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.confkey) - WHERE c.conname = %s - AND t.relname = ' . $db->quote($definition['references']['table'], 'text'); - $foreign_fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null); - if (PEAR::isError($foreign_fields)) { - return $foreign_fields; - } - $colpos = 1; - foreach ($foreign_fields as $foreign_field) { - $definition['references']['fields'][$foreign_field] = array( - 'position' => $colpos++, - ); - } - } - - if ($definition['check']) { - $check_def = $db->queryOne("SELECT pg_get_constraintdef(" . $row['oid'] . ", 't')"); - // ... - } - return $definition; - } - - // }}} - // {{{ getTriggerDefinition() - - /** - * Get the structure of a trigger into an array - * - * EXPERIMENTAL - * - * WARNING: this function is experimental and may change the returned value - * at any time until labelled as non-experimental - * - * @param string $trigger name of trigger that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - * - * @TODO: add support for plsql functions and functions with args - */ - function getTriggerDefinition($trigger) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT trg.tgname AS trigger_name, - tbl.relname AS table_name, - CASE - WHEN p.proname IS NOT NULL THEN 'EXECUTE PROCEDURE ' || p.proname || '();' - ELSE '' - END AS trigger_body, - CASE trg.tgtype & cast(2 as int2) - WHEN 0 THEN 'AFTER' - ELSE 'BEFORE' - END AS trigger_type, - CASE trg.tgtype & cast(28 as int2) - WHEN 16 THEN 'UPDATE' - WHEN 8 THEN 'DELETE' - WHEN 4 THEN 'INSERT' - WHEN 20 THEN 'INSERT, UPDATE' - WHEN 28 THEN 'INSERT, UPDATE, DELETE' - WHEN 24 THEN 'UPDATE, DELETE' - WHEN 12 THEN 'INSERT, DELETE' - END AS trigger_event, - CASE trg.tgenabled - WHEN 'O' THEN 't' - ELSE trg.tgenabled - END AS trigger_enabled, - obj_description(trg.oid, 'pg_trigger') AS trigger_comment - FROM pg_trigger trg, - pg_class tbl, - pg_proc p - WHERE trg.tgrelid = tbl.oid - AND trg.tgfoid = p.oid - AND trg.tgname = ". $db->quote($trigger, 'text'); - $types = array( - 'trigger_name' => 'text', - 'table_name' => 'text', - 'trigger_body' => 'text', - 'trigger_type' => 'text', - 'trigger_event' => 'text', - 'trigger_comment' => 'text', - 'trigger_enabled' => 'boolean', - ); - return $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); - } - - // }}} - // {{{ tableInfo() - - /** - * Returns information about a table or a result set - * - * NOTE: only supports 'table' and 'flags' if $result - * is a table name. - * - * @param object|string $result MDB2_result object from a query or a - * string containing the name of a table. - * While this also accepts a query result - * resource identifier, this behavior is - * deprecated. - * @param int $mode a valid tableInfo mode - * - * @return array an associative array with the information requested. - * A MDB2_Error object on failure. - * - * @see MDB2_Driver_Common::tableInfo() - */ - function tableInfo($result, $mode = null) - { - if (is_string($result)) { - return parent::tableInfo($result, $mode); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; - if (!is_resource($resource)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'Could not generate result resource', __FUNCTION__); - } - - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $case_func = 'strtolower'; - } else { - $case_func = 'strtoupper'; - } - } else { - $case_func = 'strval'; - } - - $count = @pg_num_fields($resource); - $res = array(); - - if ($mode) { - $res['num_fields'] = $count; - } - - $db->loadModule('Datatype', null, true); - for ($i = 0; $i < $count; $i++) { - $res[$i] = array( - 'table' => function_exists('pg_field_table') ? @pg_field_table($resource, $i) : '', - 'name' => $case_func(@pg_field_name($resource, $i)), - 'type' => @pg_field_type($resource, $i), - 'length' => @pg_field_size($resource, $i), - 'flags' => '', - ); - $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]); - if (PEAR::isError($mdb2type_info)) { - return $mdb2type_info; - } - $res[$i]['mdb2type'] = $mdb2type_info[0][0]; - if ($mode & MDB2_TABLEINFO_ORDER) { - $res['order'][$res[$i]['name']] = $i; - } - if ($mode & MDB2_TABLEINFO_ORDERTABLE) { - $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; - } - } - - return $res; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/sqlite.php b/3rdparty/MDB2/Driver/Reverse/sqlite.php deleted file mode 100644 index 811400480f..0000000000 --- a/3rdparty/MDB2/Driver/Reverse/sqlite.php +++ /dev/null @@ -1,611 +0,0 @@ - | -// | Lorenzo Alberton | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'MDB2/Driver/Reverse/Common.php'; - -/** - * MDB2 SQlite driver for the schema reverse engineering module - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common -{ - /** - * Remove SQL comments from the field definition - * - * @access private - */ - function _removeComments($sql) { - $lines = explode("\n", $sql); - foreach ($lines as $k => $line) { - $pieces = explode('--', $line); - if (count($pieces) > 1 && (substr_count($pieces[0], '\'') % 2) == 0) { - $lines[$k] = substr($line, 0, strpos($line, '--')); - } - } - return implode("\n", $lines); - } - - /** - * - */ - function _getTableColumns($sql) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $start_pos = strpos($sql, '('); - $end_pos = strrpos($sql, ')'); - $column_def = substr($sql, $start_pos+1, $end_pos-$start_pos-1); - // replace the decimal length-places-separator with a colon - $column_def = preg_replace('/(\d),(\d)/', '\1:\2', $column_def); - $column_def = $this->_removeComments($column_def); - $column_sql = explode(',', $column_def); - $columns = array(); - $count = count($column_sql); - if ($count == 0) { - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unexpected empty table column definition list', __FUNCTION__); - } - $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|TINYINT|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i'; - $regexp2 = '/^\s*([^ ]+) +(PRIMARY|UNIQUE|CHECK)$/i'; - for ($i=0, $j=0; $i<$count; ++$i) { - if (!preg_match($regexp, trim($column_sql[$i]), $matches)) { - if (!preg_match($regexp2, trim($column_sql[$i]))) { - continue; - } - return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'unexpected table column SQL definition: "'.$column_sql[$i].'"', __FUNCTION__); - } - $columns[$j]['name'] = trim($matches[1], implode('', $db->identifier_quoting)); - $columns[$j]['type'] = strtolower($matches[2]); - if (isset($matches[4]) && strlen($matches[4])) { - $columns[$j]['length'] = $matches[4]; - } - if (isset($matches[6]) && strlen($matches[6])) { - $columns[$j]['decimal'] = $matches[6]; - } - if (isset($matches[8]) && strlen($matches[8])) { - $columns[$j]['unsigned'] = true; - } - if (isset($matches[9]) && strlen($matches[9])) { - $columns[$j]['autoincrement'] = true; - } - if (isset($matches[12]) && strlen($matches[12])) { - $default = $matches[12]; - if (strlen($default) && $default[0]=="'") { - $default = str_replace("''", "'", substr($default, 1, strlen($default)-2)); - } - if ($default === 'NULL') { - $default = null; - } - $columns[$j]['default'] = $default; - } else { - $columns[$j]['default'] = null; - } - if (isset($matches[7]) && strlen($matches[7])) { - $columns[$j]['notnull'] = ($matches[7] === ' NOT NULL'); - } else if (isset($matches[9]) && strlen($matches[9])) { - $columns[$j]['notnull'] = ($matches[9] === ' NOT NULL'); - } else if (isset($matches[13]) && strlen($matches[13])) { - $columns[$j]['notnull'] = ($matches[13] === ' NOT NULL'); - } - ++$j; - } - return $columns; - } - - // {{{ getTableFieldDefinition() - - /** - * Get the stucture of a field into an array - * - * @param string $table_name name of table that should be used in method - * @param string $field_name name of field that should be used in method - * @return mixed data array on success, a MDB2 error on failure. - * The returned array contains an array for each field definition, - * with (some of) these indices: - * [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type] - * @access public - */ - function getTableFieldDefinition($table_name, $field_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $result = $db->loadModule('Datatype', null, true); - if (PEAR::isError($result)) { - return $result; - } - $query = "SELECT sql FROM sqlite_master WHERE type='table' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text'); - } else { - $query.= 'name='.$db->quote($table, 'text'); - } - $sql = $db->queryOne($query); - if (PEAR::isError($sql)) { - return $sql; - } - $columns = $this->_getTableColumns($sql); - foreach ($columns as $column) { - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - if ($db->options['field_case'] == CASE_LOWER) { - $column['name'] = strtolower($column['name']); - } else { - $column['name'] = strtoupper($column['name']); - } - } else { - $column = array_change_key_case($column, $db->options['field_case']); - } - if ($field_name == $column['name']) { - $mapped_datatype = $db->datatype->mapNativeDatatype($column); - if (PEAR::isError($mapped_datatype)) { - return $mapped_datatype; - } - list($types, $length, $unsigned, $fixed) = $mapped_datatype; - $notnull = false; - if (!empty($column['notnull'])) { - $notnull = $column['notnull']; - } - $default = false; - if (array_key_exists('default', $column)) { - $default = $column['default']; - if ((null === $default) && $notnull) { - $default = ''; - } - } - $autoincrement = false; - if (!empty($column['autoincrement'])) { - $autoincrement = true; - } - - $definition[0] = array( - 'notnull' => $notnull, - 'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type']) - ); - if (null !== $length) { - $definition[0]['length'] = $length; - } - if (null !== $unsigned) { - $definition[0]['unsigned'] = $unsigned; - } - if (null !== $fixed) { - $definition[0]['fixed'] = $fixed; - } - if ($default !== false) { - $definition[0]['default'] = $default; - } - if ($autoincrement !== false) { - $definition[0]['autoincrement'] = $autoincrement; - } - foreach ($types as $key => $type) { - $definition[$key] = $definition[0]; - if ($type == 'clob' || $type == 'blob') { - unset($definition[$key]['default']); - } - $definition[$key]['type'] = $type; - $definition[$key]['mdb2type'] = $type; - } - return $definition; - } - } - - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table column', __FUNCTION__); - } - - // }}} - // {{{ getTableIndexDefinition() - - /** - * Get the stucture of an index into an array - * - * @param string $table_name name of table that should be used in method - * @param string $index_name name of index that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableIndexDefinition($table_name, $index_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $query = "SELECT sql FROM sqlite_master WHERE type='index' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text'); - } else { - $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text'); - } - $query.= ' AND sql NOT NULL ORDER BY name'; - $index_name_mdb2 = $db->getIndexName($index_name); - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $qry = sprintf($query, $db->quote(strtolower($index_name_mdb2), 'text')); - } else { - $qry = sprintf($query, $db->quote($index_name_mdb2, 'text')); - } - $sql = $db->queryOne($qry, 'text'); - if (PEAR::isError($sql) || empty($sql)) { - // fallback to the given $index_name, without transformation - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $qry = sprintf($query, $db->quote(strtolower($index_name), 'text')); - } else { - $qry = sprintf($query, $db->quote($index_name, 'text')); - } - $sql = $db->queryOne($qry, 'text'); - } - if (PEAR::isError($sql)) { - return $sql; - } - if (!$sql) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table index', __FUNCTION__); - } - - $sql = strtolower($sql); - $start_pos = strpos($sql, '('); - $end_pos = strrpos($sql, ')'); - $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1); - $column_names = explode(',', $column_names); - - if (preg_match("/^create unique/", $sql)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table index', __FUNCTION__); - } - - $definition = array(); - $count = count($column_names); - for ($i=0; $i<$count; ++$i) { - $column_name = strtok($column_names[$i], ' '); - $collation = strtok(' '); - $definition['fields'][$column_name] = array( - 'position' => $i+1 - ); - if (!empty($collation)) { - $definition['fields'][$column_name]['sorting'] = - ($collation=='ASC' ? 'ascending' : 'descending'); - } - } - - if (empty($definition['fields'])) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing table index', __FUNCTION__); - } - return $definition; - } - - // }}} - // {{{ getTableConstraintDefinition() - - /** - * Get the stucture of a constraint into an array - * - * @param string $table_name name of table that should be used in method - * @param string $constraint_name name of constraint that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTableConstraintDefinition($table_name, $constraint_name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - list($schema, $table) = $this->splitTableSchema($table_name); - - $query = "SELECT sql FROM sqlite_master WHERE type='index' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text'); - } else { - $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text'); - } - $query.= ' AND sql NOT NULL ORDER BY name'; - $constraint_name_mdb2 = $db->getIndexName($constraint_name); - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $qry = sprintf($query, $db->quote(strtolower($constraint_name_mdb2), 'text')); - } else { - $qry = sprintf($query, $db->quote($constraint_name_mdb2, 'text')); - } - $sql = $db->queryOne($qry, 'text'); - if (PEAR::isError($sql) || empty($sql)) { - // fallback to the given $index_name, without transformation - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $qry = sprintf($query, $db->quote(strtolower($constraint_name), 'text')); - } else { - $qry = sprintf($query, $db->quote($constraint_name, 'text')); - } - $sql = $db->queryOne($qry, 'text'); - } - if (PEAR::isError($sql)) { - return $sql; - } - //default values, eventually overridden - $definition = array( - 'primary' => false, - 'unique' => false, - 'foreign' => false, - 'check' => false, - 'fields' => array(), - 'references' => array( - 'table' => '', - 'fields' => array(), - ), - 'onupdate' => '', - 'ondelete' => '', - 'match' => '', - 'deferrable' => false, - 'initiallydeferred' => false, - ); - if (!$sql) { - $query = "SELECT sql FROM sqlite_master WHERE type='table' AND "; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text'); - } else { - $query.= 'name='.$db->quote($table, 'text'); - } - $query.= " AND sql NOT NULL ORDER BY name"; - $sql = $db->queryOne($query, 'text'); - if (PEAR::isError($sql)) { - return $sql; - } - if ($constraint_name == 'primary') { - // search in table definition for PRIMARY KEYs - if (preg_match("/\bPRIMARY\s+KEY\b\s*\(([^)]+)/i", $sql, $tmp)) { - $definition['primary'] = true; - $definition['fields'] = array(); - $column_names = explode(',', $tmp[1]); - $colpos = 1; - foreach ($column_names as $column_name) { - $definition['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - return $definition; - } - if (preg_match("/\"([^\"]+)\"[^\,\"]+\bPRIMARY\s+KEY\b[^\,\)]*/i", $sql, $tmp)) { - $definition['primary'] = true; - $definition['fields'] = array(); - $column_names = explode(',', $tmp[1]); - $colpos = 1; - foreach ($column_names as $column_name) { - $definition['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - return $definition; - } - } else { - // search in table definition for FOREIGN KEYs - $pattern = "/\bCONSTRAINT\b\s+%s\s+ - \bFOREIGN\s+KEY\b\s*\(([^\)]+)\)\s* - \bREFERENCES\b\s+([^\s]+)\s*\(([^\)]+)\)\s* - (?:\bMATCH\s*([^\s]+))?\s* - (?:\bON\s+UPDATE\s+([^\s,\)]+))?\s* - (?:\bON\s+DELETE\s+([^\s,\)]+))?\s* - /imsx"; - $found_fk = false; - if (preg_match(sprintf($pattern, $constraint_name_mdb2), $sql, $tmp)) { - $found_fk = true; - } elseif (preg_match(sprintf($pattern, $constraint_name), $sql, $tmp)) { - $found_fk = true; - } - if ($found_fk) { - $definition['foreign'] = true; - $definition['match'] = 'SIMPLE'; - $definition['onupdate'] = 'NO ACTION'; - $definition['ondelete'] = 'NO ACTION'; - $definition['references']['table'] = $tmp[2]; - $column_names = explode(',', $tmp[1]); - $colpos = 1; - foreach ($column_names as $column_name) { - $definition['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - $referenced_cols = explode(',', $tmp[3]); - $colpos = 1; - foreach ($referenced_cols as $column_name) { - $definition['references']['fields'][trim($column_name)] = array( - 'position' => $colpos++ - ); - } - if (isset($tmp[4])) { - $definition['match'] = $tmp[4]; - } - if (isset($tmp[5])) { - $definition['onupdate'] = $tmp[5]; - } - if (isset($tmp[6])) { - $definition['ondelete'] = $tmp[6]; - } - return $definition; - } - } - $sql = false; - } - if (!$sql) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not an existing table constraint', __FUNCTION__); - } - - $sql = strtolower($sql); - $start_pos = strpos($sql, '('); - $end_pos = strrpos($sql, ')'); - $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1); - $column_names = explode(',', $column_names); - - if (!preg_match("/^create unique/", $sql)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not an existing table constraint', __FUNCTION__); - } - - $definition['unique'] = true; - $count = count($column_names); - for ($i=0; $i<$count; ++$i) { - $column_name = strtok($column_names[$i]," "); - $collation = strtok(" "); - $definition['fields'][$column_name] = array( - 'position' => $i+1 - ); - if (!empty($collation)) { - $definition['fields'][$column_name]['sorting'] = - ($collation=='ASC' ? 'ascending' : 'descending'); - } - } - - if (empty($definition['fields'])) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - $constraint_name . ' is not an existing table constraint', __FUNCTION__); - } - return $definition; - } - - // }}} - // {{{ getTriggerDefinition() - - /** - * Get the structure of a trigger into an array - * - * EXPERIMENTAL - * - * WARNING: this function is experimental and may change the returned value - * at any time until labelled as non-experimental - * - * @param string $trigger name of trigger that should be used in method - * @return mixed data array on success, a MDB2 error on failure - * @access public - */ - function getTriggerDefinition($trigger) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $query = "SELECT name as trigger_name, - tbl_name AS table_name, - sql AS trigger_body, - NULL AS trigger_type, - NULL AS trigger_event, - NULL AS trigger_comment, - 1 AS trigger_enabled - FROM sqlite_master - WHERE type='trigger'"; - if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $query.= ' AND LOWER(name)='.$db->quote(strtolower($trigger), 'text'); - } else { - $query.= ' AND name='.$db->quote($trigger, 'text'); - } - $types = array( - 'trigger_name' => 'text', - 'table_name' => 'text', - 'trigger_body' => 'text', - 'trigger_type' => 'text', - 'trigger_event' => 'text', - 'trigger_comment' => 'text', - 'trigger_enabled' => 'boolean', - ); - $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); - if (PEAR::isError($def)) { - return $def; - } - if (empty($def)) { - return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'it was not specified an existing trigger', __FUNCTION__); - } - if (preg_match("/^create\s+(?:temp|temporary)?trigger\s+(?:if\s+not\s+exists\s+)?.*(before|after)?\s+(insert|update|delete)/Uims", $def['trigger_body'], $tmp)) { - $def['trigger_type'] = strtoupper($tmp[1]); - $def['trigger_event'] = strtoupper($tmp[2]); - } - return $def; - } - - // }}} - // {{{ tableInfo() - - /** - * Returns information about a table - * - * @param string $result a string containing the name of a table - * @param int $mode a valid tableInfo mode - * - * @return array an associative array with the information requested. - * A MDB2_Error object on failure. - * - * @see MDB2_Driver_Common::tableInfo() - * @since Method available since Release 1.7.0 - */ - function tableInfo($result, $mode = null) - { - if (is_string($result)) { - return parent::tableInfo($result, $mode); - } - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - return $db->raiseError(MDB2_ERROR_NOT_CAPABLE, null, null, - 'This DBMS can not obtain tableInfo from result sets', __FUNCTION__); - } -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/mysql.php b/3rdparty/MDB2/Driver/mysql.php deleted file mode 100644 index 1d22e61f46..0000000000 --- a/3rdparty/MDB2/Driver/mysql.php +++ /dev/null @@ -1,1729 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * MDB2 MySQL driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_mysql extends MDB2_Driver_Common -{ - // {{{ properties - - public $string_quoting = array( - 'start' => "'", - 'end' => "'", - 'escape' => '\\', - 'escape_pattern' => '\\', - ); - - public $identifier_quoting = array( - 'start' => '`', - 'end' => '`', - 'escape' => '`', - ); - - public $sql_comments = array( - array('start' => '-- ', 'end' => "\n", 'escape' => false), - array('start' => '#', 'end' => "\n", 'escape' => false), - array('start' => '/*', 'end' => '*/', 'escape' => false), - ); - - protected $server_capabilities_checked = false; - - protected $start_transaction = false; - - public $varchar_max_length = 255; - - // }}} - // {{{ constructor - - /** - * Constructor - */ - function __construct() - { - parent::__construct(); - - $this->phptype = 'mysql'; - $this->dbsyntax = 'mysql'; - - $this->supported['sequences'] = 'emulated'; - $this->supported['indexes'] = true; - $this->supported['affected_rows'] = true; - $this->supported['transactions'] = false; - $this->supported['savepoints'] = false; - $this->supported['summary_functions'] = true; - $this->supported['order_by_text'] = true; - $this->supported['current_id'] = 'emulated'; - $this->supported['limit_queries'] = true; - $this->supported['LOBs'] = true; - $this->supported['replace'] = true; - $this->supported['sub_selects'] = 'emulated'; - $this->supported['triggers'] = false; - $this->supported['auto_increment'] = true; - $this->supported['primary_key'] = true; - $this->supported['result_introspection'] = true; - $this->supported['prepared_statements'] = 'emulated'; - $this->supported['identifier_quoting'] = true; - $this->supported['pattern_escaping'] = true; - $this->supported['new_link'] = true; - - $this->options['DBA_username'] = false; - $this->options['DBA_password'] = false; - $this->options['default_table_type'] = ''; - $this->options['max_identifiers_length'] = 64; - - $this->_reCheckSupportedOptions(); - } - - // }}} - // {{{ _reCheckSupportedOptions() - - /** - * If the user changes certain options, other capabilities may depend - * on the new settings, so we need to check them (again). - * - * @access private - */ - function _reCheckSupportedOptions() - { - $this->supported['transactions'] = $this->options['use_transactions']; - $this->supported['savepoints'] = $this->options['use_transactions']; - if ($this->options['default_table_type']) { - switch (strtoupper($this->options['default_table_type'])) { - case 'BLACKHOLE': - case 'MEMORY': - case 'ARCHIVE': - case 'CSV': - case 'HEAP': - case 'ISAM': - case 'MERGE': - case 'MRG_ISAM': - case 'ISAM': - case 'MRG_MYISAM': - case 'MYISAM': - $this->supported['savepoints'] = false; - $this->supported['transactions'] = false; - $this->warnings[] = $this->options['default_table_type'] . - ' is not a supported default table type'; - break; - } - } - } - - // }}} - // {{{ function setOption($option, $value) - - /** - * set the option for the db class - * - * @param string option name - * @param mixed value for the option - * - * @return mixed MDB2_OK or MDB2 Error Object - * - * @access public - */ - function setOption($option, $value) - { - $res = parent::setOption($option, $value); - $this->_reCheckSupportedOptions(); - } - - // }}} - // {{{ errorInfo() - - /** - * This method is used to collect information about an error - * - * @param integer $error - * @return array - * @access public - */ - function errorInfo($error = null) - { - if ($this->connection) { - $native_code = @mysql_errno($this->connection); - $native_msg = @mysql_error($this->connection); - } else { - $native_code = @mysql_errno(); - $native_msg = @mysql_error(); - } - if (is_null($error)) { - static $ecode_map; - if (empty($ecode_map)) { - $ecode_map = array( - 1000 => MDB2_ERROR_INVALID, //hashchk - 1001 => MDB2_ERROR_INVALID, //isamchk - 1004 => MDB2_ERROR_CANNOT_CREATE, - 1005 => MDB2_ERROR_CANNOT_CREATE, - 1006 => MDB2_ERROR_CANNOT_CREATE, - 1007 => MDB2_ERROR_ALREADY_EXISTS, - 1008 => MDB2_ERROR_CANNOT_DROP, - 1009 => MDB2_ERROR_CANNOT_DROP, - 1010 => MDB2_ERROR_CANNOT_DROP, - 1011 => MDB2_ERROR_CANNOT_DELETE, - 1022 => MDB2_ERROR_ALREADY_EXISTS, - 1029 => MDB2_ERROR_NOT_FOUND, - 1032 => MDB2_ERROR_NOT_FOUND, - 1044 => MDB2_ERROR_ACCESS_VIOLATION, - 1045 => MDB2_ERROR_ACCESS_VIOLATION, - 1046 => MDB2_ERROR_NODBSELECTED, - 1048 => MDB2_ERROR_CONSTRAINT, - 1049 => MDB2_ERROR_NOSUCHDB, - 1050 => MDB2_ERROR_ALREADY_EXISTS, - 1051 => MDB2_ERROR_NOSUCHTABLE, - 1054 => MDB2_ERROR_NOSUCHFIELD, - 1060 => MDB2_ERROR_ALREADY_EXISTS, - 1061 => MDB2_ERROR_ALREADY_EXISTS, - 1062 => MDB2_ERROR_ALREADY_EXISTS, - 1064 => MDB2_ERROR_SYNTAX, - 1067 => MDB2_ERROR_INVALID, - 1072 => MDB2_ERROR_NOT_FOUND, - 1086 => MDB2_ERROR_ALREADY_EXISTS, - 1091 => MDB2_ERROR_NOT_FOUND, - 1100 => MDB2_ERROR_NOT_LOCKED, - 1109 => MDB2_ERROR_NOT_FOUND, - 1125 => MDB2_ERROR_ALREADY_EXISTS, - 1136 => MDB2_ERROR_VALUE_COUNT_ON_ROW, - 1138 => MDB2_ERROR_INVALID, - 1142 => MDB2_ERROR_ACCESS_VIOLATION, - 1143 => MDB2_ERROR_ACCESS_VIOLATION, - 1146 => MDB2_ERROR_NOSUCHTABLE, - 1149 => MDB2_ERROR_SYNTAX, - 1169 => MDB2_ERROR_CONSTRAINT, - 1176 => MDB2_ERROR_NOT_FOUND, - 1177 => MDB2_ERROR_NOSUCHTABLE, - 1213 => MDB2_ERROR_DEADLOCK, - 1216 => MDB2_ERROR_CONSTRAINT, - 1217 => MDB2_ERROR_CONSTRAINT, - 1227 => MDB2_ERROR_ACCESS_VIOLATION, - 1235 => MDB2_ERROR_CANNOT_CREATE, - 1299 => MDB2_ERROR_INVALID_DATE, - 1300 => MDB2_ERROR_INVALID, - 1304 => MDB2_ERROR_ALREADY_EXISTS, - 1305 => MDB2_ERROR_NOT_FOUND, - 1306 => MDB2_ERROR_CANNOT_DROP, - 1307 => MDB2_ERROR_CANNOT_CREATE, - 1334 => MDB2_ERROR_CANNOT_ALTER, - 1339 => MDB2_ERROR_NOT_FOUND, - 1356 => MDB2_ERROR_INVALID, - 1359 => MDB2_ERROR_ALREADY_EXISTS, - 1360 => MDB2_ERROR_NOT_FOUND, - 1363 => MDB2_ERROR_NOT_FOUND, - 1365 => MDB2_ERROR_DIVZERO, - 1451 => MDB2_ERROR_CONSTRAINT, - 1452 => MDB2_ERROR_CONSTRAINT, - 1542 => MDB2_ERROR_CANNOT_DROP, - 1546 => MDB2_ERROR_CONSTRAINT, - 1582 => MDB2_ERROR_CONSTRAINT, - 2003 => MDB2_ERROR_CONNECT_FAILED, - 2019 => MDB2_ERROR_INVALID, - ); - } - if ($this->options['portability'] & MDB2_PORTABILITY_ERRORS) { - $ecode_map[1022] = MDB2_ERROR_CONSTRAINT; - $ecode_map[1048] = MDB2_ERROR_CONSTRAINT_NOT_NULL; - $ecode_map[1062] = MDB2_ERROR_CONSTRAINT; - } else { - // Doing this in case mode changes during runtime. - $ecode_map[1022] = MDB2_ERROR_ALREADY_EXISTS; - $ecode_map[1048] = MDB2_ERROR_CONSTRAINT; - $ecode_map[1062] = MDB2_ERROR_ALREADY_EXISTS; - } - if (isset($ecode_map[$native_code])) { - $error = $ecode_map[$native_code]; - } - } - return array($error, $native_code, $native_msg); - } - - // }}} - // {{{ escape() - - /** - * Quotes a string so it can be safely used in a query. It will quote - * the text so it can safely be used within a query. - * - * @param string the input string to quote - * @param bool escape wildcards - * - * @return string quoted string - * - * @access public - */ - function escape($text, $escape_wildcards = false) - { - if ($escape_wildcards) { - $text = $this->escapePattern($text); - } - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $text = @mysql_real_escape_string($text, $connection); - return $text; - } - - // }}} - // {{{ beginTransaction() - - /** - * Start a transaction or set a savepoint. - * - * @param string name of a savepoint to set - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function beginTransaction($savepoint = null) - { - $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - $this->_getServerCapabilities(); - if (!is_null($savepoint)) { - if (!$this->supports('savepoints')) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'savepoint cannot be released when changes are auto committed', __FUNCTION__); - } - $query = 'SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } elseif ($this->in_transaction) { - return MDB2_OK; //nothing to do - } - if (!$this->destructor_registered && $this->opened_persistent) { - $this->destructor_registered = true; - register_shutdown_function('MDB2_closeOpenTransactions'); - } - $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0'; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = true; - return MDB2_OK; - } - - // }}} - // {{{ commit() - - /** - * Commit the database changes done during a transaction that is in - * progress or release a savepoint. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after committing the pending changes. - * - * @param string name of a savepoint to release - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function commit($savepoint = null) - { - $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); - } - if (!is_null($savepoint)) { - if (!$this->supports('savepoints')) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - $server_info = $this->getServerVersion(); - if (version_compare($server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch'], '5.0.3', '<')) { - return MDB2_OK; - } - $query = 'RELEASE SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - - if (!$this->supports('transactions')) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'transactions are not supported', __FUNCTION__); - } - - $result = $this->_doQuery('COMMIT', true); - if (PEAR::isError($result)) { - return $result; - } - if (!$this->start_transaction) { - $query = 'SET AUTOCOMMIT = 1'; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ rollback() - - /** - * Cancel any database changes done during a transaction or since a specific - * savepoint that is in progress. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after canceling the pending changes. - * - * @param string name of a savepoint to rollback to - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function rollback($savepoint = null) - { - $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'rollback cannot be done changes are auto committed', __FUNCTION__); - } - if (!is_null($savepoint)) { - if (!$this->supports('savepoints')) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - - $query = 'ROLLBACK'; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - if (!$this->start_transaction) { - $query = 'SET AUTOCOMMIT = 1'; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ function setTransactionIsolation() - - /** - * Set the transacton isolation level. - * - * @param string standard isolation level - * READ UNCOMMITTED (allows dirty reads) - * READ COMMITTED (prevents dirty reads) - * REPEATABLE READ (prevents nonrepeatable reads) - * SERIALIZABLE (prevents phantom reads) - * @param array some transaction options: - * 'wait' => 'WAIT' | 'NO WAIT' - * 'rw' => 'READ WRITE' | 'READ ONLY' - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function setTransactionIsolation($isolation, $options = array()) - { - $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); - if (!$this->supports('transactions')) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'transactions are not supported', __FUNCTION__); - } - switch ($isolation) { - case 'READ UNCOMMITTED': - case 'READ COMMITTED': - case 'REPEATABLE READ': - case 'SERIALIZABLE': - break; - default: - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'isolation level is not supported: '.$isolation, __FUNCTION__); - } - - $query = "SET SESSION TRANSACTION ISOLATION LEVEL $isolation"; - return $this->_doQuery($query, true); - } - - // }}} - // {{{ _doConnect() - - /** - * do the grunt work of the connect - * - * @return connection on success or MDB2 Error Object on failure - * @access protected - */ - function _doConnect($username, $password, $persistent = false) - { - if (!PEAR::loadExtension($this->phptype)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); - } - - $params = array(); - $unix = ($this->dsn['protocol'] && $this->dsn['protocol'] == 'unix'); - if (empty($this->dsn['hostspec'])) { - $this->dsn['hostspec'] = $unix ? '' : 'localhost'; - } - if ($this->dsn['hostspec']) { - $params[0] = $this->dsn['hostspec'] . ($this->dsn['port'] ? ':' . $this->dsn['port'] : ''); - } else { - $params[0] = ':' . $this->dsn['socket']; - } - $params[] = $username ? $username : null; - $params[] = $password ? $password : null; - if (!$persistent) { - if ($this->_isNewLinkSet()) { - $params[] = true; - } else { - $params[] = false; - } - } - if (version_compare(phpversion(), '4.3.0', '>=')) { - $params[] = isset($this->dsn['client_flags']) - ? $this->dsn['client_flags'] : null; - } - $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; - - $connection = @call_user_func_array($connect_function, $params); - if (!$connection) { - if (($err = @mysql_error()) != '') { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - $err, __FUNCTION__); - } else { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - 'unable to establish a connection', __FUNCTION__); - } - } - - if (!empty($this->dsn['charset'])) { - $result = $this->setCharset($this->dsn['charset'], $connection); - if (PEAR::isError($result)) { - $this->disconnect(false); - return $result; - } - } - - return $connection; - } - - // }}} - // {{{ connect() - - /** - * Connect to the database - * - * @return MDB2_OK on success, MDB2 Error Object on failure - * @access public - */ - function connect() - { - if (is_resource($this->connection)) { - //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 - if (MDB2::areEquals($this->connected_dsn, $this->dsn) - && $this->opened_persistent == $this->options['persistent'] - ) { - return MDB2_OK; - } - $this->disconnect(false); - } - - $connection = $this->_doConnect( - $this->dsn['username'], - $this->dsn['password'], - $this->options['persistent'] - ); - if (PEAR::isError($connection)) { - return $connection; - } - - $this->connection = $connection; - $this->connected_dsn = $this->dsn; - $this->connected_database_name = ''; - $this->opened_persistent = $this->options['persistent']; - $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; - - if ($this->database_name) { - if ($this->database_name != $this->connected_database_name) { - if (!@mysql_select_db($this->database_name, $connection)) { - $err = $this->raiseError(null, null, null, - 'Could not select the database: '.$this->database_name, __FUNCTION__); - return $err; - } - $this->connected_database_name = $this->database_name; - } - } - - $this->_getServerCapabilities(); - - return MDB2_OK; - } - - // }}} - // {{{ setCharset() - - /** - * Set the charset on the current connection - * - * @param string charset (or array(charset, collation)) - * @param resource connection handle - * - * @return true on success, MDB2 Error Object on failure - */ - function setCharset($charset, $connection = null) - { - if (is_null($connection)) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - $collation = null; - if (is_array($charset) && 2 == count($charset)) { - $collation = array_pop($charset); - $charset = array_pop($charset); - } - $client_info = mysql_get_client_info(); - if (function_exists('mysql_set_charset') && version_compare($client_info, '5.0.6')) { - if (!$result = mysql_set_charset($charset, $connection)) { - $err = $this->raiseError(null, null, null, - 'Could not set client character set', __FUNCTION__); - return $err; - } - return $result; - } - $query = "SET NAMES '".mysql_real_escape_string($charset, $connection)."'"; - if (!is_null($collation)) { - $query .= " COLLATE '".mysql_real_escape_string($collation, $connection)."'"; - } - return $this->_doQuery($query, true, $connection); - } - - // }}} - // {{{ databaseExists() - - /** - * check if given database name is exists? - * - * @param string $name name of the database that should be checked - * - * @return mixed true/false on success, a MDB2 error on failure - * @access public - */ - function databaseExists($name) - { - $connection = $this->_doConnect($this->dsn['username'], - $this->dsn['password'], - $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $result = @mysql_select_db($name, $connection); - @mysql_close($connection); - - return $result; - } - - // }}} - // {{{ disconnect() - - /** - * Log out and disconnect from the database. - * - * @param boolean $force if the disconnect should be forced even if the - * connection is opened persistently - * @return mixed true on success, false if not connected and error - * object on error - * @access public - */ - function disconnect($force = true) - { - if (is_resource($this->connection)) { - if ($this->in_transaction) { - $dsn = $this->dsn; - $database_name = $this->database_name; - $persistent = $this->options['persistent']; - $this->dsn = $this->connected_dsn; - $this->database_name = $this->connected_database_name; - $this->options['persistent'] = $this->opened_persistent; - $this->rollback(); - $this->dsn = $dsn; - $this->database_name = $database_name; - $this->options['persistent'] = $persistent; - } - - if (!$this->opened_persistent || $force) { - $ok = @mysql_close($this->connection); - if (!$ok) { - return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, - null, null, null, __FUNCTION__); - } - } - } else { - return false; - } - return parent::disconnect($force); - } - - // }}} - // {{{ standaloneQuery() - - /** - * execute a query as DBA - * - * @param string $query the SQL query - * @param mixed $types array that contains the types of the columns in - * the result set - * @param boolean $is_manip if the query is a manipulation query - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function standaloneQuery($query, $types = null, $is_manip = false) - { - $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; - $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; - $connection = $this->_doConnect($user, $pass, $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - - $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name); - if (!PEAR::isError($result)) { - $result = $this->_affectedRows($connection, $result); - } - - @mysql_close($connection); - return $result; - } - - // }}} - // {{{ _doQuery() - - /** - * Execute a query - * @param string $query query - * @param boolean $is_manip if the query is a manipulation query - * @param resource $connection - * @param string $database_name - * @return result or error object - * @access protected - */ - function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) - { - $this->last_query = $query; - $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - if ($this->options['disable_query']) { - $result = $is_manip ? 0 : null; - return $result; - } - - if (is_null($connection)) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - if (is_null($database_name)) { - $database_name = $this->database_name; - } - - if ($database_name) { - if ($database_name != $this->connected_database_name) { - if (!@mysql_select_db($database_name, $connection)) { - $err = $this->raiseError(null, null, null, - 'Could not select the database: '.$database_name, __FUNCTION__); - return $err; - } - $this->connected_database_name = $database_name; - } - } - - $function = $this->options['result_buffering'] - ? 'mysql_query' : 'mysql_unbuffered_query'; - $result = @$function($query, $connection); - if (!$result && 0 !== mysql_errno($connection)) { - $err = $this->raiseError(null, null, null, - 'Could not execute statement', __FUNCTION__); - return $err; - } - - $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ _affectedRows() - - /** - * Returns the number of rows affected - * - * @param resource $result - * @param resource $connection - * @return mixed MDB2 Error Object or the number of rows affected - * @access private - */ - function _affectedRows($connection, $result = null) - { - if (is_null($connection)) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - return @mysql_affected_rows($connection); - } - - // }}} - // {{{ _modifyQuery() - - /** - * Changes a query string for various DBMS specific reasons - * - * @param string $query query to modify - * @param boolean $is_manip if it is a DML query - * @param integer $limit limit the number of rows - * @param integer $offset start reading from given offset - * @return string modified query - * @access protected - */ - function _modifyQuery($query, $is_manip, $limit, $offset) - { - if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) { - // "DELETE FROM table" gives 0 affected rows in MySQL. - // This little hack lets you know how many rows were deleted. - if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { - $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', - 'DELETE FROM \1 WHERE 1=1', $query); - } - } - if ($limit > 0 - && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query) - ) { - $query = rtrim($query); - if (substr($query, -1) == ';') { - $query = substr($query, 0, -1); - } - - // LIMIT doesn't always come last in the query - // @see http://dev.mysql.com/doc/refman/5.0/en/select.html - $after = ''; - if (preg_match('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', $query, $matches)) { - $after = $matches[0]; - $query = preg_replace('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', '', $query); - } elseif (preg_match('/(\s+FOR\s+UPDATE\s*)$/i', $query, $matches)) { - $after = $matches[0]; - $query = preg_replace('/(\s+FOR\s+UPDATE\s*)$/im', '', $query); - } elseif (preg_match('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', $query, $matches)) { - $after = $matches[0]; - $query = preg_replace('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', '', $query); - } - - if ($is_manip) { - return $query . " LIMIT $limit" . $after; - } else { - return $query . " LIMIT $offset, $limit" . $after; - } - } - return $query; - } - - // }}} - // {{{ getServerVersion() - - /** - * return version information about the server - * - * @param bool $native determines if the raw version string should be returned - * @return mixed array/string with version information or MDB2 error object - * @access public - */ - function getServerVersion($native = false) - { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - if ($this->connected_server_info) { - $server_info = $this->connected_server_info; - } else { - $server_info = @mysql_get_server_info($connection); - } - if (!$server_info) { - return $this->raiseError(null, null, null, - 'Could not get server information', __FUNCTION__); - } - // cache server_info - $this->connected_server_info = $server_info; - if (!$native) { - $tmp = explode('.', $server_info, 3); - if (isset($tmp[2]) && strpos($tmp[2], '-')) { - $tmp2 = explode('-', @$tmp[2], 2); - } else { - $tmp2[0] = isset($tmp[2]) ? $tmp[2] : null; - $tmp2[1] = null; - } - $server_info = array( - 'major' => isset($tmp[0]) ? $tmp[0] : null, - 'minor' => isset($tmp[1]) ? $tmp[1] : null, - 'patch' => $tmp2[0], - 'extra' => $tmp2[1], - 'native' => $server_info, - ); - } - return $server_info; - } - - // }}} - // {{{ _getServerCapabilities() - - /** - * Fetch some information about the server capabilities - * (transactions, subselects, prepared statements, etc). - * - * @access private - */ - function _getServerCapabilities() - { - if (!$this->server_capabilities_checked) { - $this->server_capabilities_checked = true; - - //set defaults - $this->supported['sub_selects'] = 'emulated'; - $this->supported['prepared_statements'] = 'emulated'; - $this->supported['triggers'] = false; - $this->start_transaction = false; - $this->varchar_max_length = 255; - - $server_info = $this->getServerVersion(); - if (is_array($server_info)) { - $server_version = $server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch']; - - if (!version_compare($server_version, '4.1.0', '<')) { - $this->supported['sub_selects'] = true; - $this->supported['prepared_statements'] = true; - } - - // SAVEPOINTs were introduced in MySQL 4.0.14 and 4.1.1 (InnoDB) - if (version_compare($server_version, '4.1.0', '>=')) { - if (version_compare($server_version, '4.1.1', '<')) { - $this->supported['savepoints'] = false; - } - } elseif (version_compare($server_version, '4.0.14', '<')) { - $this->supported['savepoints'] = false; - } - - if (!version_compare($server_version, '4.0.11', '<')) { - $this->start_transaction = true; - } - - if (!version_compare($server_version, '5.0.3', '<')) { - $this->varchar_max_length = 65532; - } - - if (!version_compare($server_version, '5.0.2', '<')) { - $this->supported['triggers'] = true; - } - } - } - } - - // }}} - // {{{ function _skipUserDefinedVariable($query, $position) - - /** - * Utility method, used by prepare() to avoid misinterpreting MySQL user - * defined variables (SELECT @x:=5) for placeholders. - * Check if the placeholder is a false positive, i.e. if it is an user defined - * variable instead. If so, skip it and advance the position, otherwise - * return the current position, which is valid - * - * @param string $query - * @param integer $position current string cursor position - * @return integer $new_position - * @access protected - */ - function _skipUserDefinedVariable($query, $position) - { - $found = strpos(strrev(substr($query, 0, $position)), '@'); - if ($found === false) { - return $position; - } - $pos = strlen($query) - strlen(substr($query, $position)) - $found - 1; - $substring = substr($query, $pos, $position - $pos + 2); - if (preg_match('/^@\w+\s*:=$/', $substring)) { - return $position + 1; //found an user defined variable: skip it - } - return $position; - } - - // }}} - // {{{ prepare() - - /** - * Prepares a query for multiple execution with execute(). - * With some database backends, this is emulated. - * prepare() requires a generic query as string like - * 'INSERT INTO numbers VALUES(?,?)' or - * 'INSERT INTO numbers VALUES(:foo,:bar)'. - * The ? and :name and are placeholders which can be set using - * bindParam() and the query can be sent off using the execute() method. - * The allowed format for :name can be set with the 'bindname_format' option. - * - * @param string $query the query to prepare - * @param mixed $types array that contains the types of the placeholders - * @param mixed $result_types array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders - * @return mixed resource handle for the prepared query on success, a MDB2 - * error on failure - * @access public - * @see bindParam, execute - */ - function prepare($query, $types = null, $result_types = null, $lobs = array()) - { - // connect to get server capabilities (http://pear.php.net/bugs/16147) - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - if ($this->options['emulate_prepared'] - || $this->supported['prepared_statements'] !== true - ) { - return parent::prepare($query, $types, $result_types, $lobs); - } - $is_manip = ($result_types === MDB2_PREPARE_MANIP); - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - $placeholder_type_guess = $placeholder_type = null; - $question = '?'; - $colon = ':'; - $positions = array(); - $position = 0; - while ($position < strlen($query)) { - $q_position = strpos($query, $question, $position); - $c_position = strpos($query, $colon, $position); - if ($q_position && $c_position) { - $p_position = min($q_position, $c_position); - } elseif ($q_position) { - $p_position = $q_position; - } elseif ($c_position) { - $p_position = $c_position; - } else { - break; - } - if (is_null($placeholder_type)) { - $placeholder_type_guess = $query[$p_position]; - } - - $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); - if (PEAR::isError($new_pos)) { - return $new_pos; - } - if ($new_pos != $position) { - $position = $new_pos; - continue; //evaluate again starting from the new position - } - - //make sure this is not part of an user defined variable - $new_pos = $this->_skipUserDefinedVariable($query, $position); - if ($new_pos != $position) { - $position = $new_pos; - continue; //evaluate again starting from the new position - } - - if ($query[$position] == $placeholder_type_guess) { - if (is_null($placeholder_type)) { - $placeholder_type = $query[$p_position]; - $question = $colon = $placeholder_type; - } - if ($placeholder_type == ':') { - $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; - $parameter = preg_replace($regexp, '\\1', $query); - if ($parameter === '') { - $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, - 'named parameter name must match "bindname_format" option', __FUNCTION__); - return $err; - } - $positions[$p_position] = $parameter; - $query = substr_replace($query, '?', $position, strlen($parameter)+1); - } else { - $positions[$p_position] = count($positions); - } - $position = $p_position + 1; - } else { - $position = $p_position; - } - } - - static $prep_statement_counter = 1; - $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand())); - $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']); - $query = "PREPARE $statement_name FROM ".$this->quote($query, 'text'); - $statement = $this->_doQuery($query, true, $connection); - if (PEAR::isError($statement)) { - return $statement; - } - - $class_name = 'MDB2_Statement_'.$this->phptype; - $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); - $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); - return $obj; - } - - // }}} - // {{{ replace() - - /** - * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT - * query, except that if there is already a row in the table with the same - * key field values, the old row is deleted before the new row is inserted. - * - * The REPLACE type of query does not make part of the SQL standards. Since - * practically only MySQL implements it natively, this type of query is - * emulated through this method for other DBMS using standard types of - * queries inside a transaction to assure the atomicity of the operation. - * - * @access public - * - * @param string $table name of the table on which the REPLACE query will - * be executed. - * @param array $fields associative array that describes the fields and the - * values that will be inserted or updated in the specified table. The - * indexes of the array are the names of all the fields of the table. The - * values of the array are also associative arrays that describe the - * values and other properties of the table fields. - * - * Here follows a list of field properties that need to be specified: - * - * value: - * Value to be assigned to the specified field. This value may be - * of specified in database independent type format as this - * function can perform the necessary datatype conversions. - * - * Default: - * this property is required unless the Null property - * is set to 1. - * - * type - * Name of the type of the field. Currently, all types Metabase - * are supported except for clob and blob. - * - * Default: no type conversion - * - * null - * Boolean property that indicates that the value for this field - * should be set to null. - * - * The default value for fields missing in INSERT queries may be - * specified the definition of a table. Often, the default value - * is already null, but since the REPLACE may be emulated using - * an UPDATE query, make sure that all fields of the table are - * listed in this function argument array. - * - * Default: 0 - * - * key - * Boolean property that indicates that this field should be - * handled as a primary key or at least as part of the compound - * unique index of the table that will determine the row that will - * updated if it exists or inserted a new row otherwise. - * - * This function will fail if no key field is specified or if the - * value of a key field is set to null because fields that are - * part of unique index they may not be null. - * - * Default: 0 - * - * @see http://dev.mysql.com/doc/refman/5.0/en/replace.html - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function replace($table, $fields) - { - $count = count($fields); - $query = $values = ''; - $keys = $colnum = 0; - for (reset($fields); $colnum < $count; next($fields), $colnum++) { - $name = key($fields); - if ($colnum > 0) { - $query .= ','; - $values.= ','; - } - $query.= $this->quoteIdentifier($name, true); - if (isset($fields[$name]['null']) && $fields[$name]['null']) { - $value = 'NULL'; - } else { - $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null; - $value = $this->quote($fields[$name]['value'], $type); - if (PEAR::isError($value)) { - return $value; - } - } - $values.= $value; - if (isset($fields[$name]['key']) && $fields[$name]['key']) { - if ($value === 'NULL') { - return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'key value '.$name.' may not be NULL', __FUNCTION__); - } - $keys++; - } - } - if ($keys == 0) { - return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'not specified which fields are keys', __FUNCTION__); - } - - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - $table = $this->quoteIdentifier($table, true); - $query = "REPLACE INTO $table ($query) VALUES ($values)"; - $result = $this->_doQuery($query, true, $connection); - if (PEAR::isError($result)) { - return $result; - } - return $this->_affectedRows($connection, $result); - } - - // }}} - // {{{ nextID() - - /** - * Returns the next free id of a sequence - * - * @param string $seq_name name of the sequence - * @param boolean $ondemand when true the sequence is - * automatic created, if it - * not exists - * - * @return mixed MDB2 Error Object or id - * @access public - */ - function nextID($seq_name, $ondemand = true) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true); - $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)"; - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $this->expectError(MDB2_ERROR_NOSUCHTABLE); - $result = $this->_doQuery($query, true); - $this->popExpect(); - $this->popErrorHandling(); - if (PEAR::isError($result)) { - if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { - $this->loadModule('Manager', null, true); - $result = $this->manager->createSequence($seq_name); - if (PEAR::isError($result)) { - return $this->raiseError($result, null, null, - 'on demand sequence '.$seq_name.' could not be created', __FUNCTION__); - } else { - return $this->nextID($seq_name, false); - } - } - return $result; - } - $value = $this->lastInsertID(); - if (is_numeric($value)) { - $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value"; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name; - } - } - return $value; - } - - // }}} - // {{{ lastInsertID() - - /** - * Returns the autoincrement ID if supported or $id or fetches the current - * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) - * - * @param string $table name of the table into which a new row was inserted - * @param string $field name of the field into which a new row was inserted - * @return mixed MDB2 Error Object or id - * @access public - */ - function lastInsertID($table = null, $field = null) - { - // not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051 - // not casting to integer to handle BIGINT http://pear.php.net/bugs/bug.php?id=17650 - return $this->queryOne('SELECT LAST_INSERT_ID()'); - } - - // }}} - // {{{ currID() - - /** - * Returns the current id of a sequence - * - * @param string $seq_name name of the sequence - * @return mixed MDB2 Error Object or id - * @access public - */ - function currID($seq_name) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true); - $query = "SELECT MAX($seqcol_name) FROM $sequence_name"; - return $this->queryOne($query, 'integer'); - } -} - -/** - * MDB2 MySQL result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Result_mysql extends MDB2_Result_Common -{ - // }}} - // {{{ fetchRow() - - /** - * Fetch a row and insert the data into an existing array. - * - * @param int $fetchmode how the array data should be indexed - * @param int $rownum number of the row where the data can be found - * @return int data array on success, a MDB2 error on failure - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - if (!is_null($rownum)) { - $seek = $this->seek($rownum); - if (PEAR::isError($seek)) { - return $seek; - } - } - if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { - $fetchmode = $this->db->fetchmode; - } - if ( $fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT - ) { - $row = @mysql_fetch_assoc($this->result); - if (is_array($row) - && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - ) { - $row = array_change_key_case($row, $this->db->options['field_case']); - } - } else { - $row = @mysql_fetch_row($this->result); - } - - if (!$row) { - if ($this->result === false) { - $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - return $err; - } - return null; - } - $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; - $rtrim = false; - if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { - if (empty($this->types)) { - $mode += MDB2_PORTABILITY_RTRIM; - } else { - $rtrim = true; - } - } - if ($mode) { - $this->db->_fixResultArrayValues($row, $mode); - } - if ( ( $fetchmode != MDB2_FETCHMODE_ASSOC - && $fetchmode != MDB2_FETCHMODE_OBJECT) - && !empty($this->types) - ) { - $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); - } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT) - && !empty($this->types_assoc) - ) { - $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim); - } - if (!empty($this->values)) { - $this->_assignBindColumns($row); - } - if ($fetchmode === MDB2_FETCHMODE_OBJECT) { - $object_class = $this->db->options['fetch_class']; - if ($object_class == 'stdClass') { - $row = (object) $row; - } else { - $rowObj = new $object_class($row); - $row = $rowObj; - } - } - ++$this->rownum; - return $row; - } - - // }}} - // {{{ _getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result. - * - * @return mixed Array variable that holds the names of columns as keys - * or an MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * @access private - */ - function _getColumnNames() - { - $columns = array(); - $numcols = $this->numCols(); - if (PEAR::isError($numcols)) { - return $numcols; - } - for ($column = 0; $column < $numcols; $column++) { - $column_name = @mysql_field_name($this->result, $column); - $columns[$column_name] = $column; - } - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $columns = array_change_key_case($columns, $this->db->options['field_case']); - } - return $columns; - } - - // }}} - // {{{ numCols() - - /** - * Count the number of columns returned by the DBMS in a query result. - * - * @return mixed integer value with the number of columns, a MDB2 error - * on failure - * @access public - */ - function numCols() - { - $cols = @mysql_num_fields($this->result); - if (is_null($cols)) { - if ($this->result === false) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { - return count($this->types); - } - return $this->db->raiseError(null, null, null, - 'Could not get column count', __FUNCTION__); - } - return $cols; - } - - // }}} - // {{{ free() - - /** - * Free the internal resources associated with result. - * - * @return boolean true on success, false if result is invalid - * @access public - */ - function free() - { - if (is_resource($this->result) && $this->db->connection) { - $free = @mysql_free_result($this->result); - if ($free === false) { - return $this->db->raiseError(null, null, null, - 'Could not free result', __FUNCTION__); - } - } - $this->result = false; - return MDB2_OK; - } -} - -/** - * MDB2 MySQL buffered result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_BufferedResult_mysql extends MDB2_Result_mysql -{ - // }}} - // {{{ seek() - - /** - * Seek to a specific row in a result set - * - * @param int $rownum number of the row where the data can be found - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function seek($rownum = 0) - { - if ($this->rownum != ($rownum - 1) && !@mysql_data_seek($this->result, $rownum)) { - if ($this->result === false) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { - return MDB2_OK; - } - return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, - 'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__); - } - $this->rownum = $rownum - 1; - return MDB2_OK; - } - - // }}} - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return mixed true or false on sucess, a MDB2 error on failure - * @access public - */ - function valid() - { - $numrows = $this->numRows(); - if (PEAR::isError($numrows)) { - return $numrows; - } - return $this->rownum < ($numrows - 1); - } - - // }}} - // {{{ numRows() - - /** - * Returns the number of rows in a result object - * - * @return mixed MDB2 Error Object or the number of rows - * @access public - */ - function numRows() - { - $rows = @mysql_num_rows($this->result); - if (false === $rows) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { - return 0; - } - return $this->db->raiseError(null, null, null, - 'Could not get row count', __FUNCTION__); - } - return $rows; - } - - // }}} -} - -/** - * MDB2 MySQL statement driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Statement_mysql extends MDB2_Statement_Common -{ - // {{{ _execute() - - /** - * Execute a prepared query statement helper method. - * - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * - * @return mixed MDB2_Result or integer (affected rows) on success, - * a MDB2 error on failure - * @access private - */ - function _execute($result_class = true, $result_wrap_class = true) - { - if (is_null($this->statement)) { - $result = parent::_execute($result_class, $result_wrap_class); - return $result; - } - $this->db->last_query = $this->query; - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); - if ($this->db->getOption('disable_query')) { - $result = $this->is_manip ? 0 : null; - return $result; - } - - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - $query = 'EXECUTE '.$this->statement; - if (!empty($this->positions)) { - $parameters = array(); - foreach ($this->positions as $parameter) { - if (!array_key_exists($parameter, $this->values)) { - return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $close = false; - $value = $this->values[$parameter]; - $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; - if (is_resource($value) || $type == 'clob' || $type == 'blob' && $this->db->options['lob_allow_url_include']) { - if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) { - if ($match[1] == 'file://') { - $value = $match[2]; - } - $value = @fopen($value, 'r'); - $close = true; - } - if (is_resource($value)) { - $data = ''; - while (!@feof($value)) { - $data.= @fread($value, $this->db->options['lob_buffer_length']); - } - if ($close) { - @fclose($value); - } - $value = $data; - } - } - $quoted = $this->db->quote($value, $type); - if (PEAR::isError($quoted)) { - return $quoted; - } - $param_query = 'SET @'.$parameter.' = '.$quoted; - $result = $this->db->_doQuery($param_query, true, $connection); - if (PEAR::isError($result)) { - return $result; - } - } - $query.= ' USING @'.implode(', @', array_values($this->positions)); - } - - $result = $this->db->_doQuery($query, $this->is_manip, $connection); - if (PEAR::isError($result)) { - return $result; - } - - if ($this->is_manip) { - $affected_rows = $this->db->_affectedRows($connection, $result); - return $affected_rows; - } - - $result = $this->db->_wrapResult($result, $this->result_types, - $result_class, $result_wrap_class, $this->limit, $this->offset); - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ free() - - /** - * Release resources allocated for the specified prepared query. - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function free() - { - if (is_null($this->positions)) { - return $this->db->raiseError(MDB2_ERROR, null, null, - 'Prepared statement has already been freed', __FUNCTION__); - } - $result = MDB2_OK; - - if (!is_null($this->statement)) { - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $query = 'DEALLOCATE PREPARE '.$this->statement; - $result = $this->db->_doQuery($query, true, $connection); - } - - parent::free(); - return $result; - } -} -?> diff --git a/3rdparty/MDB2/Driver/oci8.php b/3rdparty/MDB2/Driver/oci8.php deleted file mode 100644 index a1eefc94d1..0000000000 --- a/3rdparty/MDB2/Driver/oci8.php +++ /dev/null @@ -1,1700 +0,0 @@ - | -// +----------------------------------------------------------------------+ - -// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ - -/** - * MDB2 OCI8 driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_oci8 extends MDB2_Driver_Common -{ - // {{{ properties - var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '@'); - - var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); - - var $uncommitedqueries = 0; - // }}} - // {{{ constructor - - /** - * Constructor - */ - function __construct() - { - parent::__construct(); - - $this->phptype = 'oci8'; - $this->dbsyntax = 'oci8'; - - $this->supported['sequences'] = true; - $this->supported['indexes'] = true; - $this->supported['summary_functions'] = true; - $this->supported['order_by_text'] = true; - $this->supported['current_id'] = true; - $this->supported['affected_rows'] = true; - $this->supported['transactions'] = true; - $this->supported['savepoints'] = true; - $this->supported['limit_queries'] = true; - $this->supported['LOBs'] = true; - $this->supported['replace'] = 'emulated'; - $this->supported['sub_selects'] = true; - $this->supported['triggers'] = true; - $this->supported['auto_increment'] = false; // implementation is broken - $this->supported['primary_key'] = true; - $this->supported['result_introspection'] = true; - $this->supported['prepared_statements'] = true; - $this->supported['identifier_quoting'] = true; - $this->supported['pattern_escaping'] = true; - $this->supported['new_link'] = true; - - $this->options['DBA_username'] = false; - $this->options['DBA_password'] = false; - $this->options['database_name_prefix'] = false; - $this->options['emulate_database'] = true; - $this->options['default_tablespace'] = false; - $this->options['default_text_field_length'] = 2000; - $this->options['lob_allow_url_include'] = false; - $this->options['result_prefetching'] = false; - $this->options['max_identifiers_length'] = 30; - } - - // }}} - // {{{ errorInfo() - - /** - * This method is used to collect information about an error - * - * @param integer $error - * @return array - * @access public - */ - function errorInfo($error = null) - { - if (is_resource($error)) { - $error_data = @OCIError($error); - $error = null; - } elseif ($this->connection) { - $error_data = @OCIError($this->connection); - } else { - $error_data = @OCIError(); - } - $native_code = $error_data['code']; - $native_msg = $error_data['message']; - if (null === $error) { - static $ecode_map; - if (empty($ecode_map)) { - $ecode_map = array( - 1 => MDB2_ERROR_CONSTRAINT, - 900 => MDB2_ERROR_SYNTAX, - 904 => MDB2_ERROR_NOSUCHFIELD, - 911 => MDB2_ERROR_SYNTAX, //invalid character - 913 => MDB2_ERROR_VALUE_COUNT_ON_ROW, - 921 => MDB2_ERROR_SYNTAX, - 923 => MDB2_ERROR_SYNTAX, - 942 => MDB2_ERROR_NOSUCHTABLE, - 955 => MDB2_ERROR_ALREADY_EXISTS, - 1400 => MDB2_ERROR_CONSTRAINT_NOT_NULL, - 1401 => MDB2_ERROR_INVALID, - 1407 => MDB2_ERROR_CONSTRAINT_NOT_NULL, - 1418 => MDB2_ERROR_NOT_FOUND, - 1435 => MDB2_ERROR_NOT_FOUND, - 1476 => MDB2_ERROR_DIVZERO, - 1722 => MDB2_ERROR_INVALID_NUMBER, - 2289 => MDB2_ERROR_NOSUCHTABLE, - 2291 => MDB2_ERROR_CONSTRAINT, - 2292 => MDB2_ERROR_CONSTRAINT, - 2449 => MDB2_ERROR_CONSTRAINT, - 4081 => MDB2_ERROR_ALREADY_EXISTS, //trigger already exists - 24344 => MDB2_ERROR_SYNTAX, //success with compilation error - ); - } - if (isset($ecode_map[$native_code])) { - $error = $ecode_map[$native_code]; - } - } - return array($error, $native_code, $native_msg); - } - - // }}} - // {{{ beginTransaction() - - /** - * Start a transaction or set a savepoint. - * - * @param string name of a savepoint to set - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function beginTransaction($savepoint = null) - { - $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (null !== $savepoint) { - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'savepoint cannot be released when changes are auto committed', __FUNCTION__); - } - $query = 'SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - if ($this->in_transaction) { - return MDB2_OK; //nothing to do - } - if (!$this->destructor_registered && $this->opened_persistent) { - $this->destructor_registered = true; - register_shutdown_function('MDB2_closeOpenTransactions'); - } - $this->in_transaction = true; - ++$this->uncommitedqueries; - return MDB2_OK; - } - - // }}} - // {{{ commit() - - /** - * Commit the database changes done during a transaction that is in - * progress or release a savepoint. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after committing the pending changes. - * - * @param string name of a savepoint to release - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function commit($savepoint = null) - { - $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - return MDB2_OK; - } - - if ($this->uncommitedqueries) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - if (!@OCICommit($connection)) { - return $this->raiseError(null, null, null, - 'Unable to commit transaction', __FUNCTION__); - } - $this->uncommitedqueries = 0; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ rollback() - - /** - * Cancel any database changes done during a transaction or since a specific - * savepoint that is in progress. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after canceling the pending changes. - * - * @param string name of a savepoint to rollback to - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function rollback($savepoint = null) - { - $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'rollback cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - - if ($this->uncommitedqueries) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - if (!@OCIRollback($connection)) { - return $this->raiseError(null, null, null, - 'Unable to rollback transaction', __FUNCTION__); - } - $this->uncommitedqueries = 0; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ function setTransactionIsolation() - - /** - * Set the transacton isolation level. - * - * @param string standard isolation level - * READ UNCOMMITTED (allows dirty reads) - * READ COMMITTED (prevents dirty reads) - * REPEATABLE READ (prevents nonrepeatable reads) - * SERIALIZABLE (prevents phantom reads) - * @param array some transaction options: - * 'wait' => 'WAIT' | 'NO WAIT' - * 'rw' => 'READ WRITE' | 'READ ONLY' - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function setTransactionIsolation($isolation, $options = array()) - { - $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); - switch ($isolation) { - case 'READ UNCOMMITTED': - $isolation = 'READ COMMITTED'; - case 'READ COMMITTED': - case 'REPEATABLE READ': - $isolation = 'SERIALIZABLE'; - case 'SERIALIZABLE': - break; - default: - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'isolation level is not supported: '.$isolation, __FUNCTION__); - } - - $query = "ALTER SESSION ISOLATION LEVEL $isolation"; - return $this->_doQuery($query, true); - } - - // }}} - // {{{ _doConnect() - - /** - * do the grunt work of the connect - * - * @return connection on success or MDB2 Error Object on failure - * @access protected - */ - function _doConnect($username, $password, $persistent = false) - { - if (!PEAR::loadExtension($this->phptype)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); - } - - $sid = ''; - - if (!empty($this->dsn['service']) && $this->dsn['hostspec']) { - //oci8://username:password@foo.example.com[:port]/?service=service - // service name is given, it is assumed that hostspec is really a - // hostname, we try to construct an oracle connection string from this - $port = $this->dsn['port'] ? $this->dsn['port'] : 1521; - $sid = sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) - (HOST=%s) (PORT=%s))) - (CONNECT_DATA=(SERVICE_NAME=%s)))", - $this->dsn['hostspec'], - $port, - $this->dsn['service'] - ); - } elseif ($this->dsn['hostspec']) { - // we are given something like 'oci8://username:password@foo/' - // we have hostspec but not a service name, now we assume that - // hostspec is a tnsname defined in tnsnames.ora - $sid = $this->dsn['hostspec']; - if (isset($this->dsn['port']) && $this->dsn['port']) { - $sid = $sid.':'.$this->dsn['port']; - } - } else { - // oci://username:password@ - // if everything fails, we have to rely on environment variables - // not before a check to 'emulate_database' - if (!$this->options['emulate_database'] && $this->database_name) { - $sid = $this->database_name; - } elseif (getenv('ORACLE_SID')) { - $sid = getenv('ORACLE_SID'); - } elseif ($sid = getenv('TWO_TASK')) { - $sid = getenv('TWO_TASK'); - } else { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'not a valid connection string or environment variable [ORACLE_SID|TWO_TASK] not set', - __FUNCTION__); - } - } - - if (function_exists('oci_connect')) { - if ($this->_isNewLinkSet()) { - $connect_function = 'oci_new_connect'; - } else { - $connect_function = $persistent ? 'oci_pconnect' : 'oci_connect'; - } - - $charset = empty($this->dsn['charset']) ? null : $this->dsn['charset']; - $session_mode = empty($this->dsn['session_mode']) ? null : $this->dsn['session_mode']; - $connection = @$connect_function($username, $password, $sid, $charset, $session_mode); - $error = @OCIError(); - if (isset($error['code']) && $error['code'] == 12541) { - // Couldn't find TNS listener. Try direct connection. - $connection = @$connect_function($username, $password, null, $charset); - } - } else { - $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; - $connection = @$connect_function($username, $password, $sid); - - if (!empty($this->dsn['charset'])) { - $result = $this->setCharset($this->dsn['charset'], $connection); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!$connection) { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - 'unable to establish a connection', __FUNCTION__); - } - - if (empty($this->dsn['disable_iso_date'])) { - $query = "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"; - $err = $this->_doQuery($query, true, $connection); - if (PEAR::isError($err)) { - $this->disconnect(false); - return $err; - } - } - - $query = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS='. '"; - $err = $this->_doQuery($query, true, $connection); - if (PEAR::isError($err)) { - $this->disconnect(false); - return $err; - } - - return $connection; - } - - // }}} - // {{{ connect() - - /** - * Connect to the database - * - * @return MDB2_OK on success, MDB2 Error Object on failure - * @access public - */ - function connect() - { - if (is_resource($this->connection)) { - //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 - if (MDB2::areEquals($this->connected_dsn, $this->dsn) - && $this->opened_persistent == $this->options['persistent'] - ) { - return MDB2_OK; - } - $this->disconnect(false); - } - - if ($this->database_name && $this->options['emulate_database']) { - $this->dsn['username'] = $this->options['database_name_prefix'].$this->database_name; - } - - $connection = $this->_doConnect($this->dsn['username'], - $this->dsn['password'], - $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - $this->connection = $connection; - $this->connected_dsn = $this->dsn; - $this->connected_database_name = ''; - $this->opened_persistent = $this->options['persistent']; - $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; - - if ($this->database_name) { - if ($this->database_name != $this->connected_database_name) { - $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($this->database_name) .'"'; - $result = $this->_doQuery($query); - if (PEAR::isError($result)) { - $err = $this->raiseError($result, null, null, - 'Could not select the database: '.$this->database_name, __FUNCTION__); - return $err; - } - $this->connected_database_name = $this->database_name; - } - } - - $this->as_keyword = ' '; - $server_info = $this->getServerVersion(); - if (is_array($server_info)) { - if ($server_info['major'] >= '10') { - $this->as_keyword = ' AS '; - } - } - return MDB2_OK; - } - - // }}} - // {{{ databaseExists() - - /** - * check if given database name is exists? - * - * @param string $name name of the database that should be checked - * - * @return mixed true/false on success, a MDB2 error on failure - * @access public - */ - function databaseExists($name) - { - $connection = $this->_doConnect($this->dsn['username'], - $this->dsn['password'], - $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($name) .'"'; - $result = $this->_doQuery($query, true, $connection, false); - if (PEAR::isError($result)) { - if (!MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { - return $result; - } - return false; - } - return true; - } - - // }}} - // {{{ disconnect() - - /** - * Log out and disconnect from the database. - * - * @param boolean $force if the disconnect should be forced even if the - * connection is opened persistently - * @return mixed true on success, false if not connected and error - * object on error - * @access public - */ - function disconnect($force = true) - { - if (is_resource($this->connection)) { - if ($this->in_transaction) { - $dsn = $this->dsn; - $database_name = $this->database_name; - $persistent = $this->options['persistent']; - $this->dsn = $this->connected_dsn; - $this->database_name = $this->connected_database_name; - $this->options['persistent'] = $this->opened_persistent; - $this->rollback(); - $this->dsn = $dsn; - $this->database_name = $database_name; - $this->options['persistent'] = $persistent; - } - - if (!$this->opened_persistent || $force) { - $ok = false; - if (function_exists('oci_close')) { - $ok = @oci_close($this->connection); - } else { - $ok = @OCILogOff($this->connection); - } - if (!$ok) { - return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, - null, null, null, __FUNCTION__); - } - } - $this->uncommitedqueries = 0; - } else { - return false; - } - return parent::disconnect($force); - } - - // }}} - // {{{ standaloneQuery() - - /** - * execute a query as DBA - * - * @param string $query the SQL query - * @param mixed $types array containing the types of the columns in - * the result set - * @param boolean $is_manip if the query is a manipulation query - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function standaloneQuery($query, $types = null, $is_manip = false) - { - $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; - $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; - $connection = $this->_doConnect($user, $pass, $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - - $result = $this->_doQuery($query, $is_manip, $connection, false); - if (!PEAR::isError($result)) { - if ($is_manip) { - $result = $this->_affectedRows($connection, $result); - } else { - $result = $this->_wrapResult($result, $types, true, false, $limit, $offset); - } - } - - @OCILogOff($connection); - return $result; - } - - // }}} - // {{{ _modifyQuery() - - /** - * Changes a query string for various DBMS specific reasons - * - * @param string $query query to modify - * @param boolean $is_manip if it is a DML query - * @param integer $limit limit the number of rows - * @param integer $offset start reading from given offset - * @return string modified query - * @access protected - */ - function _modifyQuery($query, $is_manip, $limit, $offset) - { - if (preg_match('/^\s*SELECT/i', $query)) { - if (!preg_match('/\sFROM\s/i', $query)) { - $query.= " FROM dual"; - } - if ($limit > 0) { - // taken from http://svn.ez.no/svn/ezcomponents/packages/Database - $max = $offset + $limit; - if ($offset > 0) { - $min = $offset + 1; - $query = "SELECT * FROM (SELECT a.*, ROWNUM mdb2rn FROM ($query) a WHERE ROWNUM <= $max) WHERE mdb2rn >= $min"; - } else { - $query = "SELECT a.* FROM ($query) a WHERE ROWNUM <= $max"; - } - } - } - return $query; - } - - /** - * Obtain DBMS specific SQL code portion needed to declare a generic type - * field to be used in statement like CREATE TABLE, without the field name - * and type values (ie. just the character set, default value, if the - * field is permitted to be NULL or not, and the collation options). - * - * @param array $field associative array with the name of the properties - * of the field being declared as array indexes. Currently, the types - * of supported field properties are as follows: - * - * default - * Text value to be used as default for this field. - * notnull - * Boolean flag that indicates whether this field is constrained - * to not be set to null. - * charset - * Text value with the default CHARACTER SET for this field. - * collation - * Text value with the default COLLATION for this field. - * @return string DBMS specific SQL code portion that should be used to - * declare the specified field's options. - * @access protected - */ - function _getDeclarationOptions($field) - { - $charset = empty($field['charset']) ? '' : - ' '.$this->_getCharsetFieldDeclaration($field['charset']); - - $notnull = empty($field['notnull']) ? ' NULL' : ' NOT NULL'; - $default = ''; - if (array_key_exists('default', $field)) { - if ($field['default'] === '') { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $valid_default_values = $this->getValidTypes(); - $field['default'] = $valid_default_values[$field['type']]; - if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) { - $field['default'] = ' '; - } - } - if (null !== $field['default']) { - $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']); - } - } - - $collation = empty($field['collation']) ? '' : - ' '.$this->_getCollationFieldDeclaration($field['collation']); - - return $charset.$default.$notnull.$collation; - } - - // }}} - // {{{ _doQuery() - - /** - * Execute a query - * @param string $query query - * @param boolean $is_manip if the query is a manipulation query - * @param resource $connection - * @param string $database_name - * @return result or error object - * @access protected - */ - function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) - { - $this->last_query = $query; - $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - if ($this->getOption('disable_query')) { - if ($is_manip) { - return 0; - } - return null; - } - - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - - $query = str_replace("\r\n", "\n", $query); //for fixing end-of-line character in the PL/SQL in windows - $result = @OCIParse($connection, $query); - if (!$result) { - $err = $this->raiseError(null, null, null, - 'Could not create statement', __FUNCTION__); - return $err; - } - - $mode = $this->in_transaction ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; - if (!@OCIExecute($result, $mode)) { - $err = $this->raiseError($result, null, null, - 'Could not execute statement', __FUNCTION__); - return $err; - } - - if (is_numeric($this->options['result_prefetching'])) { - @ocisetprefetch($result, $this->options['result_prefetching']); - } - - $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ _affectedRows() - - /** - * Returns the number of rows affected - * - * @param resource $result - * @param resource $connection - * @return mixed MDB2 Error Object or the number of rows affected - * @access private - */ - function _affectedRows($connection, $result = null) - { - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - return @OCIRowCount($result); - } - - // }}} - // {{{ getServerVersion() - - /** - * return version information about the server - * - * @param bool $native determines if the raw version string should be returned - * @return mixed array/string with version information or MDB2 error object - * @access public - */ - function getServerVersion($native = false) - { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - if ($this->connected_server_info) { - $server_info = $this->connected_server_info; - } else { - $server_info = @ociserverversion($connection); - } - if (!$server_info) { - return $this->raiseError(null, null, null, - 'Could not get server information', __FUNCTION__); - } - // cache server_info - $this->connected_server_info = $server_info; - if (!$native) { - if (!preg_match('/ (\d+)\.(\d+)\.(\d+)\.([\d\.]+) /', $server_info, $tmp)) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'Could not parse version information:'.$server_info, __FUNCTION__); - } - $server_info = array( - 'major' => $tmp[1], - 'minor' => $tmp[2], - 'patch' => $tmp[3], - 'extra' => $tmp[4], - 'native' => $server_info, - ); - } - return $server_info; - } - - // }}} - // {{{ prepare() - - /** - * Prepares a query for multiple execution with execute(). - * With some database backends, this is emulated. - * prepare() requires a generic query as string like - * 'INSERT INTO numbers VALUES(?,?)' or - * 'INSERT INTO numbers VALUES(:foo,:bar)'. - * The ? and :name and are placeholders which can be set using - * bindParam() and the query can be sent off using the execute() method. - * The allowed format for :name can be set with the 'bindname_format' option. - * - * @param string $query the query to prepare - * @param mixed $types array that contains the types of the placeholders - * @param mixed $result_types array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders - * @return mixed resource handle for the prepared query on success, a MDB2 - * error on failure - * @access public - * @see bindParam, execute - */ - function prepare($query, $types = null, $result_types = null, $lobs = array()) - { - if ($this->options['emulate_prepared']) { - return parent::prepare($query, $types, $result_types, $lobs); - } - $is_manip = ($result_types === MDB2_PREPARE_MANIP); - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - $placeholder_type_guess = $placeholder_type = null; - $question = '?'; - $colon = ':'; - $positions = array(); - $position = 0; - $parameter = -1; - while ($position < strlen($query)) { - $q_position = strpos($query, $question, $position); - $c_position = strpos($query, $colon, $position); - if ($q_position && $c_position) { - $p_position = min($q_position, $c_position); - } elseif ($q_position) { - $p_position = $q_position; - } elseif ($c_position) { - $p_position = $c_position; - } else { - break; - } - if (null === $placeholder_type) { - $placeholder_type_guess = $query[$p_position]; - } - - $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); - if (PEAR::isError($new_pos)) { - return $new_pos; - } - if ($new_pos != $position) { - $position = $new_pos; - continue; //evaluate again starting from the new position - } - - if ($query[$position] == $placeholder_type_guess) { - if (null === $placeholder_type) { - $placeholder_type = $query[$p_position]; - $question = $colon = $placeholder_type; - if (!empty($types) && is_array($types)) { - if ($placeholder_type == ':') { - if (is_int(key($types))) { - $types_tmp = $types; - $types = array(); - $count = -1; - } - } else { - $types = array_values($types); - } - } - } - if ($placeholder_type == ':') { - $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; - $parameter = preg_replace($regexp, '\\1', $query); - if ($parameter === '') { - $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, - 'named parameter name must match "bindname_format" option', __FUNCTION__); - return $err; - } - // use parameter name in type array - if (isset($count) && isset($types_tmp[++$count])) { - $types[$parameter] = $types_tmp[$count]; - } - $length = strlen($parameter) + 1; - } else { - ++$parameter; - //$length = strlen($parameter); - $length = 1; // strlen('?') - } - if (!in_array($parameter, $positions)) { - $positions[] = $parameter; - } - if (isset($types[$parameter]) - && ($types[$parameter] == 'clob' || $types[$parameter] == 'blob') - ) { - if (!isset($lobs[$parameter])) { - $lobs[$parameter] = $parameter; - } - $value = $this->quote(true, $types[$parameter]); - if (PEAR::isError($value)) { - return $value; - } - $query = substr_replace($query, $value, $p_position, $length); - $position = $p_position + strlen($value) - 1; - } elseif ($placeholder_type == '?') { - $query = substr_replace($query, ':'.$parameter, $p_position, 1); - $position = $p_position + $length; - } else { - $position = $p_position + 1; - } - } else { - $position = $p_position; - } - } - if (is_array($lobs)) { - $columns = $variables = ''; - foreach ($lobs as $parameter => $field) { - $columns.= ($columns ? ', ' : ' RETURNING ').$field; - $variables.= ($variables ? ', ' : ' INTO ').':'.$parameter; - } - $query.= $columns.$variables; - } - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $statement = @OCIParse($connection, $query); - if (!$statement) { - $err = $this->raiseError(null, null, null, - 'Could not create statement', __FUNCTION__); - return $err; - } - - $class_name = 'MDB2_Statement_'.$this->phptype; - $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); - $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); - return $obj; - } - - // }}} - // {{{ nextID() - - /** - * Returns the next free id of a sequence - * - * @param string $seq_name name of the sequence - * @param boolean $ondemand when true the sequence is - * automatic created, if it - * not exists - * @return mixed MDB2 Error Object or id - * @access public - */ - function nextID($seq_name, $ondemand = true) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $query = "SELECT $sequence_name.nextval FROM DUAL"; - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $this->expectError(MDB2_ERROR_NOSUCHTABLE); - $result = $this->queryOne($query, 'integer'); - $this->popExpect(); - $this->popErrorHandling(); - if (PEAR::isError($result)) { - if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { - $this->loadModule('Manager', null, true); - $result = $this->manager->createSequence($seq_name); - if (PEAR::isError($result)) { - return $result; - } - return $this->nextId($seq_name, false); - } - } - return $result; - } - - // }}} - // {{{ lastInsertID() - - /** - * Returns the autoincrement ID if supported or $id or fetches the current - * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) - * - * @param string $table name of the table into which a new row was inserted - * @param string $field name of the field into which a new row was inserted - * @return mixed MDB2 Error Object or id - * @access public - */ - function lastInsertID($table = null, $field = null) - { - $old_seq = $table.(empty($field) ? '' : '_'.$field); - $sequence_name = $this->quoteIdentifier($this->getSequenceName($table), true); - $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); - if (PEAR::isError($result)) { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($old_seq), true); - $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); - } - - return $result; - } - - // }}} - // {{{ currId() - - /** - * Returns the current id of a sequence - * - * @param string $seq_name name of the sequence - * @return mixed MDB2_Error or id - * @access public - */ - function currId($seq_name) - { - $sequence_name = $this->getSequenceName($seq_name); - $query = 'SELECT (last_number-1) FROM all_sequences'; - $query.= ' WHERE sequence_name='.$this->quote($sequence_name, 'text'); - $query.= ' OR sequence_name='.$this->quote(strtoupper($sequence_name), 'text'); - return $this->queryOne($query, 'integer'); - } -} - -/** - * MDB2 OCI8 result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Result_oci8 extends MDB2_Result_Common -{ - // }}} - // {{{ fetchRow() - - /** - * Fetch a row and insert the data into an existing array. - * - * @param int $fetchmode how the array data should be indexed - * @param int $rownum number of the row where the data can be found - * @return int data array on success, a MDB2 error on failure - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - if (null !== $rownum) { - $seek = $this->seek($rownum); - if (PEAR::isError($seek)) { - return $seek; - } - } - if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { - $fetchmode = $this->db->fetchmode; - } - if ($fetchmode & MDB2_FETCHMODE_ASSOC) { - @OCIFetchInto($this->result, $row, OCI_ASSOC+OCI_RETURN_NULLS); - if (is_array($row) - && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - ) { - $row = array_change_key_case($row, $this->db->options['field_case']); - } - } else { - @OCIFetchInto($this->result, $row, OCI_RETURN_NULLS); - } - if (!$row) { - if (false === $this->result) { - $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - return $err; - } - return null; - } - // remove additional column at the end - if ($this->offset > 0) { - array_pop($row); - } - $mode = 0; - $rtrim = false; - if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { - if (empty($this->types)) { - $mode += MDB2_PORTABILITY_RTRIM; - } else { - $rtrim = true; - } - } - if ($mode) { - $this->db->_fixResultArrayValues($row, $mode); - } - if (!empty($this->types)) { - $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); - } - if (!empty($this->values)) { - $this->_assignBindColumns($row); - } - if ($fetchmode === MDB2_FETCHMODE_OBJECT) { - $object_class = $this->db->options['fetch_class']; - if ($object_class == 'stdClass') { - $row = (object) $row; - } else { - $rowObj = new $object_class($row); - $row = $rowObj; - } - } - ++$this->rownum; - return $row; - } - - // }}} - // {{{ _getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result. - * - * @return mixed Array variable that holds the names of columns as keys - * or an MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * @access private - */ - function _getColumnNames() - { - $columns = array(); - $numcols = $this->numCols(); - if (PEAR::isError($numcols)) { - return $numcols; - } - for ($column = 0; $column < $numcols; $column++) { - $column_name = @OCIColumnName($this->result, $column + 1); - $columns[$column_name] = $column; - } - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $columns = array_change_key_case($columns, $this->db->options['field_case']); - } - return $columns; - } - - // }}} - // {{{ numCols() - - /** - * Count the number of columns returned by the DBMS in a query result. - * - * @return mixed integer value with the number of columns, a MDB2 error - * on failure - * @access public - */ - function numCols() - { - $cols = @OCINumCols($this->result); - if (null === $cols) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return count($this->types); - } - return $this->db->raiseError(null, null, null, - 'Could not get column count', __FUNCTION__); - } - if ($this->offset > 0) { - --$cols; - } - return $cols; - } - - // }}} - // {{{ free() - - /** - * Free the internal resources associated with $result. - * - * @return boolean true on success, false if $result is invalid - * @access public - */ - function free() - { - if (is_resource($this->result) && $this->db->connection) { - $free = @OCIFreeCursor($this->result); - if (false === $free) { - return $this->db->raiseError(null, null, null, - 'Could not free result', __FUNCTION__); - } - } - $this->result = false; - return MDB2_OK; - - } -} - -/** - * MDB2 OCI8 buffered result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_BufferedResult_oci8 extends MDB2_Result_oci8 -{ - var $buffer; - var $buffer_rownum = - 1; - - // {{{ _fillBuffer() - - /** - * Fill the row buffer - * - * @param int $rownum row number upto which the buffer should be filled - if the row number is null all rows are ready into the buffer - * @return boolean true on success, false on failure - * @access protected - */ - function _fillBuffer($rownum = null) - { - if (isset($this->buffer) && is_array($this->buffer)) { - if (null === $rownum) { - if (!end($this->buffer)) { - return false; - } - } elseif (isset($this->buffer[$rownum])) { - return (bool)$this->buffer[$rownum]; - } - } - - $row = true; - while (((null === $rownum) || $this->buffer_rownum < $rownum) - && ($row = @OCIFetchInto($this->result, $buffer, OCI_RETURN_NULLS)) - ) { - ++$this->buffer_rownum; - // remove additional column at the end - if ($this->offset > 0) { - array_pop($buffer); - } - if (empty($this->types)) { - foreach (array_keys($buffer) as $key) { - if (is_a($buffer[$key], 'oci-lob')) { - $buffer[$key] = $buffer[$key]->load(); - } - } - } - $this->buffer[$this->buffer_rownum] = $buffer; - } - - if (!$row) { - ++$this->buffer_rownum; - $this->buffer[$this->buffer_rownum] = false; - return false; - } - return true; - } - - // }}} - // {{{ fetchRow() - - /** - * Fetch a row and insert the data into an existing array. - * - * @param int $fetchmode how the array data should be indexed - * @param int $rownum number of the row where the data can be found - * @return int data array on success, a MDB2 error on failure - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - if (false === $this->result) { - $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - return $err; - } - if (null === $this->result) { - return null; - } - if (null !== $rownum) { - $seek = $this->seek($rownum); - if (PEAR::isError($seek)) { - return $seek; - } - } - $target_rownum = $this->rownum + 1; - if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { - $fetchmode = $this->db->fetchmode; - } - if (!$this->_fillBuffer($target_rownum)) { - return null; - } - $row = $this->buffer[$target_rownum]; - if ($fetchmode & MDB2_FETCHMODE_ASSOC) { - $column_names = $this->getColumnNames(); - foreach ($column_names as $name => $i) { - $column_names[$name] = $row[$i]; - } - $row = $column_names; - } - $mode = 0; - $rtrim = false; - if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { - if (empty($this->types)) { - $mode += MDB2_PORTABILITY_RTRIM; - } else { - $rtrim = true; - } - } - if ($mode) { - $this->db->_fixResultArrayValues($row, $mode); - } - if (!empty($this->types)) { - $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); - } - if (!empty($this->values)) { - $this->_assignBindColumns($row); - } - if ($fetchmode === MDB2_FETCHMODE_OBJECT) { - $object_class = $this->db->options['fetch_class']; - if ($object_class == 'stdClass') { - $row = (object) $row; - } else { - $rowObj = new $object_class($row); - $row = $rowObj; - } - } - ++$this->rownum; - return $row; - } - - // }}} - // {{{ seek() - - /** - * Seek to a specific row in a result set - * - * @param int $rownum number of the row where the data can be found - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function seek($rownum = 0) - { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - $this->rownum = $rownum - 1; - return MDB2_OK; - } - - // }}} - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return mixed true or false on sucess, a MDB2 error on failure - * @access public - */ - function valid() - { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return true; - } - if ($this->_fillBuffer($this->rownum + 1)) { - return true; - } - return false; - } - - // }}} - // {{{ numRows() - - /** - * Returns the number of rows in a result object - * - * @return mixed MDB2 Error Object or the number of rows - * @access public - */ - function numRows() - { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return 0; - } - $this->_fillBuffer(); - return $this->buffer_rownum; - } - - // }}} - // {{{ free() - - /** - * Free the internal resources associated with $result. - * - * @return boolean true on success, false if $result is invalid - * @access public - */ - function free() - { - $this->buffer = null; - $this->buffer_rownum = null; - return parent::free(); - } -} - -/** - * MDB2 OCI8 statement driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Statement_oci8 extends MDB2_Statement_Common -{ - // {{{ Variables (Properties) - - var $type_maxlengths = array(); - - // }}} - // {{{ bindParam() - - /** - * Bind a variable to a parameter of a prepared query. - * - * @param int $parameter the order number of the parameter in the query - * statement. The order number of the first parameter is 1. - * @param mixed &$value variable that is meant to be bound to specified - * parameter. The type of the value depends on the $type argument. - * @param string $type specifies the type of the field - * @param int $maxlength specifies the maximum length of the field; if set to -1, the - * current length of $value is used - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function bindParam($parameter, &$value, $type = null, $maxlength = -1) - { - if (!is_numeric($parameter)) { - $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter); - } - if (MDB2_OK === ($ret = parent::bindParam($parameter, $value, $type))) { - $this->type_maxlengths[$parameter] = $maxlength; - } - - return $ret; - } - - // }}} - // {{{ _execute() - - /** - * Execute a prepared query statement helper method. - * - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * - * @return mixed MDB2_Result or integer (affected rows) on success, - * a MDB2 error on failure - * @access private - */ - function _execute($result_class = true, $result_wrap_class = false) - { - if (null === $this->statement) { - return parent::_execute($result_class, $result_wrap_class); - } - $this->db->last_query = $this->query; - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); - if ($this->db->getOption('disable_query')) { - $result = $this->is_manip ? 0 : null; - return $result; - } - - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - $result = MDB2_OK; - $lobs = $quoted_values = array(); - $i = 0; - foreach ($this->positions as $parameter) { - if (!array_key_exists($parameter, $this->values)) { - return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; - if ($type == 'clob' || $type == 'blob') { - $lobs[$i]['file'] = false; - if (is_resource($this->values[$parameter])) { - $fp = $this->values[$parameter]; - $this->values[$parameter] = ''; - while (!feof($fp)) { - $this->values[$parameter] .= fread($fp, 8192); - } - } elseif (is_a($this->values[$parameter], 'OCI-Lob')) { - //do nothing - } elseif ($this->db->getOption('lob_allow_url_include') - && preg_match('/^(\w+:\/\/)(.*)$/', $this->values[$parameter], $match) - ) { - $lobs[$i]['file'] = true; - if ($match[1] == 'file://') { - $this->values[$parameter] = $match[2]; - } - } - $lobs[$i]['value'] = $this->values[$parameter]; - $lobs[$i]['descriptor'] =& $this->values[$parameter]; - // Test to see if descriptor has already been created for this - // variable (i.e. if it has been bound more than once): - if (!is_a($this->values[$parameter], 'OCI-Lob')) { - $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_LOB); - if (false === $this->values[$parameter]) { - $result = $this->db->raiseError(null, null, null, - 'Unable to create descriptor for LOB in parameter: '.$parameter, __FUNCTION__); - break; - } - } - $lob_type = ($type == 'blob' ? OCI_B_BLOB : OCI_B_CLOB); - if (!@OCIBindByName($this->statement, ':'.$parameter, $lobs[$i]['descriptor'], -1, $lob_type)) { - $result = $this->db->raiseError($this->statement, null, null, - 'could not bind LOB parameter', __FUNCTION__); - break; - } - } else if ($type == OCI_B_BFILE) { - // Test to see if descriptor has already been created for this - // variable (i.e. if it has been bound more than once): - if (!is_a($this->values[$parameter], "OCI-Lob")) { - $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_FILE); - if (false === $this->values[$parameter]) { - $result = $this->db->raiseError(null, null, null, - 'Unable to create descriptor for BFILE in parameter: '.$parameter, __FUNCTION__); - break; - } - } - if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { - $result = $this->db->raiseError($this->statement, null, null, - 'Could not bind BFILE parameter', __FUNCTION__); - break; - } - } else if ($type == OCI_B_ROWID) { - // Test to see if descriptor has already been created for this - // variable (i.e. if it has been bound more than once): - if (!is_a($this->values[$parameter], "OCI-Lob")) { - $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_ROWID); - if (false === $this->values[$parameter]) { - $result = $this->db->raiseError(null, null, null, - 'Unable to create descriptor for ROWID in parameter: '.$parameter, __FUNCTION__); - break; - } - } - if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { - $result = $this->db->raiseError($this->statement, null, null, - 'Could not bind ROWID parameter', __FUNCTION__); - break; - } - } else if ($type == OCI_B_CURSOR) { - // Test to see if cursor has already been allocated for this - // variable (i.e. if it has been bound more than once): - if (!is_resource($this->values[$parameter]) || !get_resource_type($this->values[$parameter]) == "oci8 statement") { - $this->values[$parameter] = @OCINewCursor($connection); - if (false === $this->values[$parameter]) { - $result = $this->db->raiseError(null, null, null, - 'Unable to allocate cursor for parameter: '.$parameter, __FUNCTION__); - break; - } - } - if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { - $result = $this->db->raiseError($this->statement, null, null, - 'Could not bind CURSOR parameter', __FUNCTION__); - break; - } - } else { - $maxlength = array_key_exists($parameter, $this->type_maxlengths) ? $this->type_maxlengths[$parameter] : -1; - $this->values[$parameter] = $this->db->quote($this->values[$parameter], $type, false); - $quoted_values[$i] =& $this->values[$parameter]; - if (PEAR::isError($quoted_values[$i])) { - return $quoted_values[$i]; - } - if (!@OCIBindByName($this->statement, ':'.$parameter, $quoted_values[$i], $maxlength)) { - $result = $this->db->raiseError($this->statement, null, null, - 'could not bind non-abstract parameter', __FUNCTION__); - break; - } - } - ++$i; - } - - $lob_keys = array_keys($lobs); - if (!PEAR::isError($result)) { - $mode = (!empty($lobs) || $this->db->in_transaction) ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; - if (!@OCIExecute($this->statement, $mode)) { - $err = $this->db->raiseError($this->statement, null, null, - 'could not execute statement', __FUNCTION__); - return $err; - } - - if (!empty($lobs)) { - foreach ($lob_keys as $i) { - if ((null !== $lobs[$i]['value']) && $lobs[$i]['value'] !== '') { - if (is_object($lobs[$i]['value'])) { - // Probably a NULL LOB - // @see http://bugs.php.net/bug.php?id=27485 - continue; - } - if ($lobs[$i]['file']) { - $result = $lobs[$i]['descriptor']->savefile($lobs[$i]['value']); - } else { - $result = $lobs[$i]['descriptor']->save($lobs[$i]['value']); - } - if (!$result) { - $result = $this->db->raiseError(null, null, null, - 'Unable to save descriptor contents', __FUNCTION__); - break; - } - } - } - - if (!PEAR::isError($result)) { - if (!$this->db->in_transaction) { - if (!@OCICommit($connection)) { - $result = $this->db->raiseError(null, null, null, - 'Unable to commit transaction', __FUNCTION__); - } - } else { - ++$this->db->uncommitedqueries; - } - } - } - } - - if (PEAR::isError($result)) { - return $result; - } - - if ($this->is_manip) { - $affected_rows = $this->db->_affectedRows($connection, $this->statement); - return $affected_rows; - } - - $result = $this->db->_wrapResult($this->statement, $this->result_types, - $result_class, $result_wrap_class, $this->limit, $this->offset); - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ free() - - /** - * Release resources allocated for the specified prepared query. - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function free() - { - if (null === $this->positions) { - return $this->db->raiseError(MDB2_ERROR, null, null, - 'Prepared statement has already been freed', __FUNCTION__); - } - $result = MDB2_OK; - - if ((null !== $this->statement) && !@OCIFreeStatement($this->statement)) { - $result = $this->db->raiseError(null, null, null, - 'Could not free statement', __FUNCTION__); - } - - parent::free(); - return $result; - } -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/pgsql.php b/3rdparty/MDB2/Driver/pgsql.php deleted file mode 100644 index 8a8b3f7c91..0000000000 --- a/3rdparty/MDB2/Driver/pgsql.php +++ /dev/null @@ -1,1583 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -/** - * MDB2 PostGreSQL driver - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Driver_pgsql extends MDB2_Driver_Common -{ - // {{{ properties - var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '\\'); - - var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); - // }}} - // {{{ constructor - - /** - * Constructor - */ - function __construct() - { - parent::__construct(); - - $this->phptype = 'pgsql'; - $this->dbsyntax = 'pgsql'; - - $this->supported['sequences'] = true; - $this->supported['indexes'] = true; - $this->supported['affected_rows'] = true; - $this->supported['summary_functions'] = true; - $this->supported['order_by_text'] = true; - $this->supported['transactions'] = true; - $this->supported['savepoints'] = true; - $this->supported['current_id'] = true; - $this->supported['limit_queries'] = true; - $this->supported['LOBs'] = true; - $this->supported['replace'] = 'emulated'; - $this->supported['sub_selects'] = true; - $this->supported['triggers'] = true; - $this->supported['auto_increment'] = 'emulated'; - $this->supported['primary_key'] = true; - $this->supported['result_introspection'] = true; - $this->supported['prepared_statements'] = true; - $this->supported['identifier_quoting'] = true; - $this->supported['pattern_escaping'] = true; - $this->supported['new_link'] = true; - - $this->options['DBA_username'] = false; - $this->options['DBA_password'] = false; - $this->options['multi_query'] = false; - $this->options['disable_smart_seqname'] = true; - $this->options['max_identifiers_length'] = 63; - } - - // }}} - // {{{ errorInfo() - - /** - * This method is used to collect information about an error - * - * @param integer $error - * @return array - * @access public - */ - function errorInfo($error = null) - { - // Fall back to MDB2_ERROR if there was no mapping. - $error_code = MDB2_ERROR; - - $native_msg = ''; - if (is_resource($error)) { - $native_msg = @pg_result_error($error); - } elseif ($this->connection) { - $native_msg = @pg_last_error($this->connection); - if (!$native_msg && @pg_connection_status($this->connection) === PGSQL_CONNECTION_BAD) { - $native_msg = 'Database connection has been lost.'; - $error_code = MDB2_ERROR_CONNECT_FAILED; - } - } else { - $native_msg = @pg_last_error(); - } - - static $error_regexps; - if (empty($error_regexps)) { - $error_regexps = array( - '/column .* (of relation .*)?does not exist/i' - => MDB2_ERROR_NOSUCHFIELD, - '/(relation|sequence|table).*does not exist|class .* not found/i' - => MDB2_ERROR_NOSUCHTABLE, - '/database .* does not exist/' - => MDB2_ERROR_NOT_FOUND, - '/constraint .* does not exist/' - => MDB2_ERROR_NOT_FOUND, - '/index .* does not exist/' - => MDB2_ERROR_NOT_FOUND, - '/database .* already exists/i' - => MDB2_ERROR_ALREADY_EXISTS, - '/relation .* already exists/i' - => MDB2_ERROR_ALREADY_EXISTS, - '/(divide|division) by zero$/i' - => MDB2_ERROR_DIVZERO, - '/pg_atoi: error in .*: can\'t parse /i' - => MDB2_ERROR_INVALID_NUMBER, - '/invalid input syntax for( type)? (integer|numeric)/i' - => MDB2_ERROR_INVALID_NUMBER, - '/value .* is out of range for type \w*int/i' - => MDB2_ERROR_INVALID_NUMBER, - '/integer out of range/i' - => MDB2_ERROR_INVALID_NUMBER, - '/value too long for type character/i' - => MDB2_ERROR_INVALID, - '/attribute .* not found|relation .* does not have attribute/i' - => MDB2_ERROR_NOSUCHFIELD, - '/column .* specified in USING clause does not exist in (left|right) table/i' - => MDB2_ERROR_NOSUCHFIELD, - '/parser: parse error at or near/i' - => MDB2_ERROR_SYNTAX, - '/syntax error at/' - => MDB2_ERROR_SYNTAX, - '/column reference .* is ambiguous/i' - => MDB2_ERROR_SYNTAX, - '/permission denied/' - => MDB2_ERROR_ACCESS_VIOLATION, - '/violates not-null constraint/' - => MDB2_ERROR_CONSTRAINT_NOT_NULL, - '/violates [\w ]+ constraint/' - => MDB2_ERROR_CONSTRAINT, - '/referential integrity violation/' - => MDB2_ERROR_CONSTRAINT, - '/more expressions than target columns/i' - => MDB2_ERROR_VALUE_COUNT_ON_ROW, - ); - } - if (is_numeric($error) && $error < 0) { - $error_code = $error; - } else { - foreach ($error_regexps as $regexp => $code) { - if (preg_match($regexp, $native_msg)) { - $error_code = $code; - break; - } - } - } - return array($error_code, null, $native_msg); - } - - // }}} - // {{{ escape() - - /** - * Quotes a string so it can be safely used in a query. It will quote - * the text so it can safely be used within a query. - * - * @param string the input string to quote - * @param bool escape wildcards - * - * @return string quoted string - * - * @access public - */ - function escape($text, $escape_wildcards = false) - { - if ($escape_wildcards) { - $text = $this->escapePattern($text); - } - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - if (is_resource($connection) && version_compare(PHP_VERSION, '5.2.0RC5', '>=')) { - $text = @pg_escape_string($connection, $text); - } else { - $text = @pg_escape_string($text); - } - return $text; - } - - // }}} - // {{{ beginTransaction() - - /** - * Start a transaction or set a savepoint. - * - * @param string name of a savepoint to set - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function beginTransaction($savepoint = null) - { - $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (null !== $savepoint) { - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'savepoint cannot be released when changes are auto committed', __FUNCTION__); - } - $query = 'SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - if ($this->in_transaction) { - return MDB2_OK; //nothing to do - } - if (!$this->destructor_registered && $this->opened_persistent) { - $this->destructor_registered = true; - register_shutdown_function('MDB2_closeOpenTransactions'); - } - $result = $this->_doQuery('BEGIN', true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = true; - return MDB2_OK; - } - - // }}} - // {{{ commit() - - /** - * Commit the database changes done during a transaction that is in - * progress or release a savepoint. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after committing the pending changes. - * - * @param string name of a savepoint to release - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function commit($savepoint = null) - { - $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - $query = 'RELEASE SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - - $result = $this->_doQuery('COMMIT', true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ rollback() - - /** - * Cancel any database changes done during a transaction or since a specific - * savepoint that is in progress. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after canceling the pending changes. - * - * @param string name of a savepoint to rollback to - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function rollback($savepoint = null) - { - $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'rollback cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; - return $this->_doQuery($query, true); - } - - $query = 'ROLLBACK'; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ function setTransactionIsolation() - - /** - * Set the transacton isolation level. - * - * @param string standard isolation level - * READ UNCOMMITTED (allows dirty reads) - * READ COMMITTED (prevents dirty reads) - * REPEATABLE READ (prevents nonrepeatable reads) - * SERIALIZABLE (prevents phantom reads) - * @param array some transaction options: - * 'wait' => 'WAIT' | 'NO WAIT' - * 'rw' => 'READ WRITE' | 'READ ONLY' - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function setTransactionIsolation($isolation, $options = array()) - { - $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); - switch ($isolation) { - case 'READ UNCOMMITTED': - case 'READ COMMITTED': - case 'REPEATABLE READ': - case 'SERIALIZABLE': - break; - default: - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'isolation level is not supported: '.$isolation, __FUNCTION__); - } - - $query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL $isolation"; - return $this->_doQuery($query, true); - } - - // }}} - // {{{ _doConnect() - - /** - * Do the grunt work of connecting to the database - * - * @return mixed connection resource on success, MDB2 Error Object on failure - * @access protected - */ - function _doConnect($username, $password, $database_name, $persistent = false) - { - if (!PEAR::loadExtension($this->phptype)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); - } - - if ($database_name == '') { - $database_name = 'template1'; - } - - $protocol = $this->dsn['protocol'] ? $this->dsn['protocol'] : 'tcp'; - - $params = array(''); - if ($protocol == 'tcp') { - if ($this->dsn['hostspec']) { - $params[0].= 'host=' . $this->dsn['hostspec']; - } - if ($this->dsn['port']) { - $params[0].= ' port=' . $this->dsn['port']; - } - } elseif ($protocol == 'unix') { - // Allow for pg socket in non-standard locations. - if ($this->dsn['socket']) { - $params[0].= 'host=' . $this->dsn['socket']; - } - if ($this->dsn['port']) { - $params[0].= ' port=' . $this->dsn['port']; - } - } - if ($database_name) { - $params[0].= ' dbname=\'' . addslashes($database_name) . '\''; - } - if ($username) { - $params[0].= ' user=\'' . addslashes($username) . '\''; - } - if ($password) { - $params[0].= ' password=\'' . addslashes($password) . '\''; - } - if (!empty($this->dsn['options'])) { - $params[0].= ' options=' . $this->dsn['options']; - } - if (!empty($this->dsn['tty'])) { - $params[0].= ' tty=' . $this->dsn['tty']; - } - if (!empty($this->dsn['connect_timeout'])) { - $params[0].= ' connect_timeout=' . $this->dsn['connect_timeout']; - } - if (!empty($this->dsn['sslmode'])) { - $params[0].= ' sslmode=' . $this->dsn['sslmode']; - } - if (!empty($this->dsn['service'])) { - $params[0].= ' service=' . $this->dsn['service']; - } - - if ($this->_isNewLinkSet()) { - if (version_compare(phpversion(), '4.3.0', '>=')) { - $params[] = PGSQL_CONNECT_FORCE_NEW; - } - } - - $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; - $connection = @call_user_func_array($connect_function, $params); - if (!$connection) { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - 'unable to establish a connection', __FUNCTION__); - } - - if (empty($this->dsn['disable_iso_date'])) { - if (!@pg_query($connection, "SET SESSION DATESTYLE = 'ISO'")) { - return $this->raiseError(null, null, null, - 'Unable to set date style to iso', __FUNCTION__); - } - } - - if (!empty($this->dsn['charset'])) { - $result = $this->setCharset($this->dsn['charset'], $connection); - if (PEAR::isError($result)) { - return $result; - } - } - - // Enable extra compatibility settings on 8.2 and later - if (function_exists('pg_parameter_status')) { - $version = pg_parameter_status($connection, 'server_version'); - if ($version == false) { - return $this->raiseError(null, null, null, - 'Unable to retrieve server version', __FUNCTION__); - } - $version = explode ('.', $version); - if ( $version['0'] > 8 - || ($version['0'] == 8 && $version['1'] >= 2) - ) { - if (!@pg_query($connection, "SET SESSION STANDARD_CONFORMING_STRINGS = OFF")) { - return $this->raiseError(null, null, null, - 'Unable to set standard_conforming_strings to off', __FUNCTION__); - } - - if (!@pg_query($connection, "SET SESSION ESCAPE_STRING_WARNING = OFF")) { - return $this->raiseError(null, null, null, - 'Unable to set escape_string_warning to off', __FUNCTION__); - } - } - } - - return $connection; - } - - // }}} - // {{{ connect() - - /** - * Connect to the database - * - * @return true on success, MDB2 Error Object on failure - * @access public - */ - function connect() - { - if (is_resource($this->connection)) { - //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 - if (MDB2::areEquals($this->connected_dsn, $this->dsn) - && $this->connected_database_name == $this->database_name - && ($this->opened_persistent == $this->options['persistent']) - ) { - return MDB2_OK; - } - $this->disconnect(false); - } - - if ($this->database_name) { - $connection = $this->_doConnect($this->dsn['username'], - $this->dsn['password'], - $this->database_name, - $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $this->connection = $connection; - $this->connected_dsn = $this->dsn; - $this->connected_database_name = $this->database_name; - $this->opened_persistent = $this->options['persistent']; - $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; - } - - return MDB2_OK; - } - - // }}} - // {{{ setCharset() - - /** - * Set the charset on the current connection - * - * @param string charset - * @param resource connection handle - * - * @return true on success, MDB2 Error Object on failure - */ - function setCharset($charset, $connection = null) - { - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - if (is_array($charset)) { - $charset = array_shift($charset); - $this->warnings[] = 'postgresql does not support setting client collation'; - } - $result = @pg_set_client_encoding($connection, $charset); - if ($result == -1) { - return $this->raiseError(null, null, null, - 'Unable to set client charset: '.$charset, __FUNCTION__); - } - return MDB2_OK; - } - - // }}} - // {{{ databaseExists() - - /** - * check if given database name is exists? - * - * @param string $name name of the database that should be checked - * - * @return mixed true/false on success, a MDB2 error on failure - * @access public - */ - function databaseExists($name) - { - $res = $this->_doConnect($this->dsn['username'], - $this->dsn['password'], - $this->escape($name), - $this->options['persistent']); - if (!PEAR::isError($res)) { - return true; - } - - return false; - } - - // }}} - // {{{ disconnect() - - /** - * Log out and disconnect from the database. - * - * @param boolean $force if the disconnect should be forced even if the - * connection is opened persistently - * @return mixed true on success, false if not connected and error - * object on error - * @access public - */ - function disconnect($force = true) - { - if (is_resource($this->connection)) { - if ($this->in_transaction) { - $dsn = $this->dsn; - $database_name = $this->database_name; - $persistent = $this->options['persistent']; - $this->dsn = $this->connected_dsn; - $this->database_name = $this->connected_database_name; - $this->options['persistent'] = $this->opened_persistent; - $this->rollback(); - $this->dsn = $dsn; - $this->database_name = $database_name; - $this->options['persistent'] = $persistent; - } - - if (!$this->opened_persistent || $force) { - $ok = @pg_close($this->connection); - if (!$ok) { - return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, - null, null, null, __FUNCTION__); - } - } - } else { - return false; - } - return parent::disconnect($force); - } - - // }}} - // {{{ standaloneQuery() - - /** - * execute a query as DBA - * - * @param string $query the SQL query - * @param mixed $types array that contains the types of the columns in - * the result set - * @param boolean $is_manip if the query is a manipulation query - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function standaloneQuery($query, $types = null, $is_manip = false) - { - $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; - $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; - $connection = $this->_doConnect($user, $pass, $this->database_name, $this->options['persistent']); - if (PEAR::isError($connection)) { - return $connection; - } - - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - - $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name); - if (!PEAR::isError($result)) { - if ($is_manip) { - $result = $this->_affectedRows($connection, $result); - } else { - $result = $this->_wrapResult($result, $types, true, true, $limit, $offset); - } - } - - @pg_close($connection); - return $result; - } - - // }}} - // {{{ _doQuery() - - /** - * Execute a query - * @param string $query query - * @param boolean $is_manip if the query is a manipulation query - * @param resource $connection - * @param string $database_name - * @return result or error object - * @access protected - */ - function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) - { - $this->last_query = $query; - $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - if ($this->options['disable_query']) { - $result = $is_manip ? 0 : null; - return $result; - } - - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - - $function = $this->options['multi_query'] ? 'pg_send_query' : 'pg_query'; - $result = @$function($connection, $query); - if (!$result) { - $err = $this->raiseError(null, null, null, - 'Could not execute statement', __FUNCTION__); - return $err; - } elseif ($this->options['multi_query']) { - if (!($result = @pg_get_result($connection))) { - $err = $this->raiseError(null, null, null, - 'Could not get the first result from a multi query', __FUNCTION__); - return $err; - } - } - - $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ _affectedRows() - - /** - * Returns the number of rows affected - * - * @param resource $result - * @param resource $connection - * @return mixed MDB2 Error Object or the number of rows affected - * @access private - */ - function _affectedRows($connection, $result = null) - { - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - return @pg_affected_rows($result); - } - - // }}} - // {{{ _modifyQuery() - - /** - * Changes a query string for various DBMS specific reasons - * - * @param string $query query to modify - * @param boolean $is_manip if it is a DML query - * @param integer $limit limit the number of rows - * @param integer $offset start reading from given offset - * @return string modified query - * @access protected - */ - function _modifyQuery($query, $is_manip, $limit, $offset) - { - if ($limit > 0 - && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query) - ) { - $query = rtrim($query); - if (substr($query, -1) == ';') { - $query = substr($query, 0, -1); - } - if ($is_manip) { - $query = $this->_modifyManipQuery($query, $limit); - } else { - $query.= " LIMIT $limit OFFSET $offset"; - } - } - return $query; - } - - // }}} - // {{{ _modifyManipQuery() - - /** - * Changes a manip query string for various DBMS specific reasons - * - * @param string $query query to modify - * @param integer $limit limit the number of rows - * @return string modified query - * @access protected - */ - function _modifyManipQuery($query, $limit) - { - $pos = strpos(strtolower($query), 'where'); - $where = $pos ? substr($query, $pos) : ''; - - $manip_clause = '(\bDELETE\b\s+(?:\*\s+)?\bFROM\b|\bUPDATE\b)'; - $from_clause = '([\w\.]+)'; - $where_clause = '(?:(.*)\bWHERE\b\s+(.*))|(.*)'; - $pattern = '/^'. $manip_clause . '\s+' . $from_clause .'(?:\s)*(?:'. $where_clause .')?$/i'; - $matches = preg_match($pattern, $query, $match); - if ($matches) { - $manip = $match[1]; - $from = $match[2]; - $what = (count($matches) == 6) ? $match[5] : $match[3]; - return $manip.' '.$from.' '.$what.' WHERE ctid=(SELECT ctid FROM '.$from.' '.$where.' LIMIT '.$limit.')'; - } - //return error? - return $query; - } - - // }}} - // {{{ getServerVersion() - - /** - * return version information about the server - * - * @param bool $native determines if the raw version string should be returned - * @return mixed array/string with version information or MDB2 error object - * @access public - */ - function getServerVersion($native = false) - { - $query = 'SHOW SERVER_VERSION'; - if ($this->connected_server_info) { - $server_info = $this->connected_server_info; - } else { - $server_info = $this->queryOne($query, 'text'); - if (PEAR::isError($server_info)) { - return $server_info; - } - } - // cache server_info - $this->connected_server_info = $server_info; - if (!$native && !PEAR::isError($server_info)) { - $tmp = explode('.', $server_info, 3); - if (empty($tmp[2]) - && isset($tmp[1]) - && preg_match('/(\d+)(.*)/', $tmp[1], $tmp2) - ) { - $server_info = array( - 'major' => $tmp[0], - 'minor' => $tmp2[1], - 'patch' => null, - 'extra' => $tmp2[2], - 'native' => $server_info, - ); - } else { - $server_info = array( - 'major' => isset($tmp[0]) ? $tmp[0] : null, - 'minor' => isset($tmp[1]) ? $tmp[1] : null, - 'patch' => isset($tmp[2]) ? $tmp[2] : null, - 'extra' => null, - 'native' => $server_info, - ); - } - } - return $server_info; - } - - // }}} - // {{{ prepare() - - /** - * Prepares a query for multiple execution with execute(). - * With some database backends, this is emulated. - * prepare() requires a generic query as string like - * 'INSERT INTO numbers VALUES(?,?)' or - * 'INSERT INTO numbers VALUES(:foo,:bar)'. - * The ? and :name and are placeholders which can be set using - * bindParam() and the query can be sent off using the execute() method. - * The allowed format for :name can be set with the 'bindname_format' option. - * - * @param string $query the query to prepare - * @param mixed $types array that contains the types of the placeholders - * @param mixed $result_types array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders - * @return mixed resource handle for the prepared query on success, a MDB2 - * error on failure - * @access public - * @see bindParam, execute - */ - function prepare($query, $types = null, $result_types = null, $lobs = array()) - { - if ($this->options['emulate_prepared']) { - return parent::prepare($query, $types, $result_types, $lobs); - } - $is_manip = ($result_types === MDB2_PREPARE_MANIP); - $offset = $this->offset; - $limit = $this->limit; - $this->offset = $this->limit = 0; - $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - $pgtypes = function_exists('pg_prepare') ? false : array(); - if ($pgtypes !== false && !empty($types)) { - $this->loadModule('Datatype', null, true); - } - $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); - $placeholder_type_guess = $placeholder_type = null; - $question = '?'; - $colon = ':'; - $positions = array(); - $position = $parameter = 0; - while ($position < strlen($query)) { - $q_position = strpos($query, $question, $position); - $c_position = strpos($query, $colon, $position); - //skip "::type" cast ("select id::varchar(20) from sometable where name=?") - $doublecolon_position = strpos($query, '::', $position); - if ($doublecolon_position !== false && $doublecolon_position == $c_position) { - $c_position = strpos($query, $colon, $position+2); - } - if ($q_position && $c_position) { - $p_position = min($q_position, $c_position); - } elseif ($q_position) { - $p_position = $q_position; - } elseif ($c_position) { - $p_position = $c_position; - } else { - break; - } - if (null === $placeholder_type) { - $placeholder_type_guess = $query[$p_position]; - } - - $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); - if (PEAR::isError($new_pos)) { - return $new_pos; - } - if ($new_pos != $position) { - $position = $new_pos; - continue; //evaluate again starting from the new position - } - - if ($query[$position] == $placeholder_type_guess) { - if (null === $placeholder_type) { - $placeholder_type = $query[$p_position]; - $question = $colon = $placeholder_type; - if (!empty($types) && is_array($types)) { - if ($placeholder_type == ':') { - } else { - $types = array_values($types); - } - } - } - if ($placeholder_type_guess == '?') { - $length = 1; - $name = $parameter; - } else { - $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; - $param = preg_replace($regexp, '\\1', $query); - if ($param === '') { - $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, - 'named parameter name must match "bindname_format" option', __FUNCTION__); - return $err; - } - $length = strlen($param) + 1; - $name = $param; - } - if ($pgtypes !== false) { - if (is_array($types) && array_key_exists($name, $types)) { - $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$name]); - } elseif (is_array($types) && array_key_exists($parameter, $types)) { - $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$parameter]); - } else { - $pgtypes[] = 'text'; - } - } - if (($key_parameter = array_search($name, $positions)) !== false) { - //$next_parameter = 1; - $parameter = $key_parameter + 1; - //foreach ($positions as $key => $value) { - // if ($key_parameter == $key) { - // break; - // } - // ++$next_parameter; - //} - } else { - ++$parameter; - //$next_parameter = $parameter; - $positions[] = $name; - } - $query = substr_replace($query, '$'.$parameter, $position, $length); - $position = $p_position + strlen($parameter); - } else { - $position = $p_position; - } - } - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - static $prep_statement_counter = 1; - $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand())); - $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']); - if (false === $pgtypes) { - $result = @pg_prepare($connection, $statement_name, $query); - if (!$result) { - $err = $this->raiseError(null, null, null, - 'Unable to create prepared statement handle', __FUNCTION__); - return $err; - } - } else { - $types_string = ''; - if ($pgtypes) { - $types_string = ' ('.implode(', ', $pgtypes).') '; - } - $query = 'PREPARE '.$statement_name.$types_string.' AS '.$query; - $statement = $this->_doQuery($query, true, $connection); - if (PEAR::isError($statement)) { - return $statement; - } - } - - $class_name = 'MDB2_Statement_'.$this->phptype; - $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); - $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); - return $obj; - } - - // }}} - // {{{ function getSequenceName($sqn) - - /** - * adds sequence name formatting to a sequence name - * - * @param string name of the sequence - * - * @return string formatted sequence name - * - * @access public - */ - function getSequenceName($sqn) - { - if (false === $this->options['disable_smart_seqname']) { - if (strpos($sqn, '_') !== false) { - list($table, $field) = explode('_', $sqn, 2); - } - $schema_list = $this->queryOne("SELECT array_to_string(current_schemas(false), ',')"); - if (PEAR::isError($schema_list) || empty($schema_list) || count($schema_list) < 2) { - $order_by = ' a.attnum'; - $schema_clause = ' AND n.nspname=current_schema()'; - } else { - $schemas = explode(',', $schema_list); - $schema_clause = ' AND n.nspname IN ('.$schema_list.')'; - $counter = 1; - $order_by = ' CASE '; - foreach ($schemas as $schema) { - $order_by .= ' WHEN n.nspname='.$schema.' THEN '.$counter++; - } - $order_by .= ' ELSE '.$counter.' END, a.attnum'; - } - - $query = "SELECT substring((SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128) - FROM pg_attrdef d - WHERE d.adrelid = a.attrelid - AND d.adnum = a.attnum - AND a.atthasdef - ) FROM 'nextval[^'']*''([^'']*)') - FROM pg_attribute a - LEFT JOIN pg_class c ON c.oid = a.attrelid - LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef - LEFT JOIN pg_namespace n ON c.relnamespace = n.oid - WHERE (c.relname = ".$this->quote($sqn, 'text'); - if (!empty($field)) { - $query .= " OR (c.relname = ".$this->quote($table, 'text')." AND a.attname = ".$this->quote($field, 'text').")"; - } - $query .= " )" - .$schema_clause." - AND NOT a.attisdropped - AND a.attnum > 0 - AND pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%' - ORDER BY ".$order_by; - $seqname = $this->queryOne($query); - if (!PEAR::isError($seqname) && !empty($seqname) && is_string($seqname)) { - return $seqname; - } - } - - return parent::getSequenceName($sqn); - } - - // }}} - // {{{ nextID() - - /** - * Returns the next free id of a sequence - * - * @param string $seq_name name of the sequence - * @param boolean $ondemand when true the sequence is - * automatic created, if it - * not exists - * @return mixed MDB2 Error Object or id - * @access public - */ - function nextID($seq_name, $ondemand = true) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $query = "SELECT NEXTVAL('$sequence_name')"; - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $this->expectError(MDB2_ERROR_NOSUCHTABLE); - $result = $this->queryOne($query, 'integer'); - $this->popExpect(); - $this->popErrorHandling(); - if (PEAR::isError($result)) { - if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { - $this->loadModule('Manager', null, true); - $result = $this->manager->createSequence($seq_name); - if (PEAR::isError($result)) { - return $this->raiseError($result, null, null, - 'on demand sequence could not be created', __FUNCTION__); - } - return $this->nextId($seq_name, false); - } - } - return $result; - } - - // }}} - // {{{ lastInsertID() - - /** - * Returns the autoincrement ID if supported or $id or fetches the current - * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) - * - * @param string $table name of the table into which a new row was inserted - * @param string $field name of the field into which a new row was inserted - * @return mixed MDB2 Error Object or id - * @access public - */ - function lastInsertID($table = null, $field = null) - { - if (empty($table) && empty($field)) { - return $this->queryOne('SELECT lastval()', 'integer'); - } - $seq = $table.(empty($field) ? '' : '_'.$field); - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq), true); - return $this->queryOne("SELECT currval('$sequence_name')", 'integer'); - } - - // }}} - // {{{ currID() - - /** - * Returns the current id of a sequence - * - * @param string $seq_name name of the sequence - * @return mixed MDB2 Error Object or id - * @access public - */ - function currID($seq_name) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - return $this->queryOne("SELECT last_value FROM $sequence_name", 'integer'); - } -} - -/** - * MDB2 PostGreSQL result driver - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Result_pgsql extends MDB2_Result_Common -{ - // }}} - // {{{ fetchRow() - - /** - * Fetch a row and insert the data into an existing array. - * - * @param int $fetchmode how the array data should be indexed - * @param int $rownum number of the row where the data can be found - * @return int data array on success, a MDB2 error on failure - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - if (null !== $rownum) { - $seek = $this->seek($rownum); - if (PEAR::isError($seek)) { - return $seek; - } - } - if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { - $fetchmode = $this->db->fetchmode; - } - if ( $fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT - ) { - $row = @pg_fetch_array($this->result, null, PGSQL_ASSOC); - if (is_array($row) - && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - ) { - $row = array_change_key_case($row, $this->db->options['field_case']); - } - } else { - $row = @pg_fetch_row($this->result); - } - if (!$row) { - if (false === $this->result) { - $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - return $err; - } - return null; - } - $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; - $rtrim = false; - if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { - if (empty($this->types)) { - $mode += MDB2_PORTABILITY_RTRIM; - } else { - $rtrim = true; - } - } - if ($mode) { - $this->db->_fixResultArrayValues($row, $mode); - } - if ( ( $fetchmode != MDB2_FETCHMODE_ASSOC - && $fetchmode != MDB2_FETCHMODE_OBJECT) - && !empty($this->types) - ) { - $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); - } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT) - && !empty($this->types_assoc) - ) { - $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim); - } - if (!empty($this->values)) { - $this->_assignBindColumns($row); - } - if ($fetchmode === MDB2_FETCHMODE_OBJECT) { - $object_class = $this->db->options['fetch_class']; - if ($object_class == 'stdClass') { - $row = (object) $row; - } else { - $rowObj = new $object_class($row); - $row = $rowObj; - } - } - ++$this->rownum; - return $row; - } - - // }}} - // {{{ _getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result. - * - * @return mixed Array variable that holds the names of columns as keys - * or an MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * @access private - */ - function _getColumnNames() - { - $columns = array(); - $numcols = $this->numCols(); - if (PEAR::isError($numcols)) { - return $numcols; - } - for ($column = 0; $column < $numcols; $column++) { - $column_name = @pg_field_name($this->result, $column); - $columns[$column_name] = $column; - } - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $columns = array_change_key_case($columns, $this->db->options['field_case']); - } - return $columns; - } - - // }}} - // {{{ numCols() - - /** - * Count the number of columns returned by the DBMS in a query result. - * - * @access public - * @return mixed integer value with the number of columns, a MDB2 error - * on failure - */ - function numCols() - { - $cols = @pg_num_fields($this->result); - if (null === $cols) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return count($this->types); - } - return $this->db->raiseError(null, null, null, - 'Could not get column count', __FUNCTION__); - } - return $cols; - } - - // }}} - // {{{ nextResult() - - /** - * Move the internal result pointer to the next available result - * - * @return true on success, false if there is no more result set or an error object on failure - * @access public - */ - function nextResult() - { - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - if (!($this->result = @pg_get_result($connection))) { - return false; - } - return MDB2_OK; - } - - // }}} - // {{{ free() - - /** - * Free the internal resources associated with result. - * - * @return boolean true on success, false if result is invalid - * @access public - */ - function free() - { - if (is_resource($this->result) && $this->db->connection) { - $free = @pg_free_result($this->result); - if (false === $free) { - return $this->db->raiseError(null, null, null, - 'Could not free result', __FUNCTION__); - } - } - $this->result = false; - return MDB2_OK; - } -} - -/** - * MDB2 PostGreSQL buffered result driver - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_BufferedResult_pgsql extends MDB2_Result_pgsql -{ - // {{{ seek() - - /** - * Seek to a specific row in a result set - * - * @param int $rownum number of the row where the data can be found - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function seek($rownum = 0) - { - if ($this->rownum != ($rownum - 1) && !@pg_result_seek($this->result, $rownum)) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return MDB2_OK; - } - return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, - 'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__); - } - $this->rownum = $rownum - 1; - return MDB2_OK; - } - - // }}} - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return mixed true or false on sucess, a MDB2 error on failure - * @access public - */ - function valid() - { - $numrows = $this->numRows(); - if (PEAR::isError($numrows)) { - return $numrows; - } - return $this->rownum < ($numrows - 1); - } - - // }}} - // {{{ numRows() - - /** - * Returns the number of rows in a result object - * - * @return mixed MDB2 Error Object or the number of rows - * @access public - */ - function numRows() - { - $rows = @pg_num_rows($this->result); - if (null === $rows) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return 0; - } - return $this->db->raiseError(null, null, null, - 'Could not get row count', __FUNCTION__); - } - return $rows; - } -} - -/** - * MDB2 PostGreSQL statement driver - * - * @package MDB2 - * @category Database - * @author Paul Cooper - */ -class MDB2_Statement_pgsql extends MDB2_Statement_Common -{ - // {{{ _execute() - - /** - * Execute a prepared query statement helper method. - * - * @param mixed $result_class string which specifies which result class to use - * @param mixed $result_wrap_class string which specifies which class to wrap results in - * - * @return mixed MDB2_Result or integer (affected rows) on success, - * a MDB2 error on failure - * @access private - */ - function _execute($result_class = true, $result_wrap_class = true) - { - if (null === $this->statement) { - return parent::_execute($result_class, $result_wrap_class); - } - $this->db->last_query = $this->query; - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); - if ($this->db->getOption('disable_query')) { - $result = $this->is_manip ? 0 : null; - return $result; - } - - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - $query = false; - $parameters = array(); - // todo: disabled until pg_execute() bytea issues are cleared up - if (true || !function_exists('pg_execute')) { - $query = 'EXECUTE '.$this->statement; - } - if (!empty($this->positions)) { - foreach ($this->positions as $parameter) { - if (!array_key_exists($parameter, $this->values)) { - return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); - } - $value = $this->values[$parameter]; - $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; - if (is_resource($value) || $type == 'clob' || $type == 'blob' || $this->db->options['lob_allow_url_include']) { - if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) { - if ($match[1] == 'file://') { - $value = $match[2]; - } - $value = @fopen($value, 'r'); - $close = true; - } - if (is_resource($value)) { - $data = ''; - while (!@feof($value)) { - $data.= @fread($value, $this->db->options['lob_buffer_length']); - } - if ($close) { - @fclose($value); - } - $value = $data; - } - } - $quoted = $this->db->quote($value, $type, $query); - if (PEAR::isError($quoted)) { - return $quoted; - } - $parameters[] = $quoted; - } - if ($query) { - $query.= ' ('.implode(', ', $parameters).')'; - } - } - - if (!$query) { - $result = @pg_execute($connection, $this->statement, $parameters); - if (!$result) { - $err = $this->db->raiseError(null, null, null, - 'Unable to execute statement', __FUNCTION__); - return $err; - } - } else { - $result = $this->db->_doQuery($query, $this->is_manip, $connection); - if (PEAR::isError($result)) { - return $result; - } - } - - if ($this->is_manip) { - $affected_rows = $this->db->_affectedRows($connection, $result); - return $affected_rows; - } - - $result = $this->db->_wrapResult($result, $this->result_types, - $result_class, $result_wrap_class, $this->limit, $this->offset); - $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ free() - - /** - * Release resources allocated for the specified prepared query. - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function free() - { - if (null === $this->positions) { - return $this->db->raiseError(MDB2_ERROR, null, null, - 'Prepared statement has already been freed', __FUNCTION__); - } - $result = MDB2_OK; - - if (null !== $this->statement) { - $connection = $this->db->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $query = 'DEALLOCATE PREPARE '.$this->statement; - $result = $this->db->_doQuery($query, true, $connection); - } - - parent::free(); - return $result; - } - - /** - * drop an existing table - * - * @param string $name name of the table that should be dropped - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function dropTable($name) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $name = $db->quoteIdentifier($name, true); - $result = $db->exec("DROP TABLE $name"); - - if (PEAR::isError($result)) { - $result = $db->exec("DROP TABLE $name CASCADE"); - } - - return $result; - } -} -?> diff --git a/3rdparty/MDB2/Driver/sqlite.php b/3rdparty/MDB2/Driver/sqlite.php deleted file mode 100644 index 42363bb8c5..0000000000 --- a/3rdparty/MDB2/Driver/sqlite.php +++ /dev/null @@ -1,1104 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -/** - * MDB2 SQLite driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Driver_sqlite extends MDB2_Driver_Common -{ - // {{{ properties - var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => false); - - var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); - - var $_lasterror = ''; - - var $fix_assoc_fields_names = false; - - // }}} - // {{{ constructor - - /** - * Constructor - */ - function __construct() - { - parent::__construct(); - - $this->phptype = 'sqlite'; - $this->dbsyntax = 'sqlite'; - - $this->supported['sequences'] = 'emulated'; - $this->supported['indexes'] = true; - $this->supported['affected_rows'] = true; - $this->supported['summary_functions'] = true; - $this->supported['order_by_text'] = true; - $this->supported['current_id'] = 'emulated'; - $this->supported['limit_queries'] = true; - $this->supported['LOBs'] = true; - $this->supported['replace'] = true; - $this->supported['transactions'] = true; - $this->supported['savepoints'] = false; - $this->supported['sub_selects'] = true; - $this->supported['triggers'] = true; - $this->supported['auto_increment'] = true; - $this->supported['primary_key'] = false; // requires alter table implementation - $this->supported['result_introspection'] = false; // not implemented - $this->supported['prepared_statements'] = 'emulated'; - $this->supported['identifier_quoting'] = true; - $this->supported['pattern_escaping'] = false; - $this->supported['new_link'] = false; - - $this->options['DBA_username'] = false; - $this->options['DBA_password'] = false; - $this->options['base_transaction_name'] = '___php_MDB2_sqlite_auto_commit_off'; - $this->options['fixed_float'] = 0; - $this->options['database_path'] = ''; - $this->options['database_extension'] = ''; - $this->options['server_version'] = ''; - $this->options['max_identifiers_length'] = 128; //no real limit - } - - // }}} - // {{{ errorInfo() - - /** - * This method is used to collect information about an error - * - * @param integer $error - * @return array - * @access public - */ - function errorInfo($error = null) - { - $native_code = null; - if ($this->connection) { - $native_code = @sqlite_last_error($this->connection); - } - $native_msg = $this->_lasterror - ? html_entity_decode($this->_lasterror) : @sqlite_error_string($native_code); - - // PHP 5.2+ prepends the function name to $php_errormsg, so we need - // this hack to work around it, per bug #9599. - $native_msg = preg_replace('/^sqlite[a-z_]+\(\)[^:]*: /', '', $native_msg); - - if (null === $error) { - static $error_regexps; - if (empty($error_regexps)) { - $error_regexps = array( - '/^no such table:/' => MDB2_ERROR_NOSUCHTABLE, - '/^no such index:/' => MDB2_ERROR_NOT_FOUND, - '/^(table|index) .* already exists$/' => MDB2_ERROR_ALREADY_EXISTS, - '/PRIMARY KEY must be unique/i' => MDB2_ERROR_CONSTRAINT, - '/is not unique/' => MDB2_ERROR_CONSTRAINT, - '/columns .* are not unique/i' => MDB2_ERROR_CONSTRAINT, - '/uniqueness constraint failed/' => MDB2_ERROR_CONSTRAINT, - '/violates .*constraint/' => MDB2_ERROR_CONSTRAINT, - '/may not be NULL/' => MDB2_ERROR_CONSTRAINT_NOT_NULL, - '/^no such column:/' => MDB2_ERROR_NOSUCHFIELD, - '/no column named/' => MDB2_ERROR_NOSUCHFIELD, - '/column not present in both tables/i' => MDB2_ERROR_NOSUCHFIELD, - '/^near ".*": syntax error$/' => MDB2_ERROR_SYNTAX, - '/[0-9]+ values for [0-9]+ columns/i' => MDB2_ERROR_VALUE_COUNT_ON_ROW, - ); - } - foreach ($error_regexps as $regexp => $code) { - if (preg_match($regexp, $native_msg)) { - $error = $code; - break; - } - } - } - return array($error, $native_code, $native_msg); - } - - // }}} - // {{{ escape() - - /** - * Quotes a string so it can be safely used in a query. It will quote - * the text so it can safely be used within a query. - * - * @param string the input string to quote - * @param bool escape wildcards - * - * @return string quoted string - * - * @access public - */ - function escape($text, $escape_wildcards = false) - { - $text = @sqlite_escape_string($text); - return $text; - } - - // }}} - // {{{ beginTransaction() - - /** - * Start a transaction or set a savepoint. - * - * @param string name of a savepoint to set - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function beginTransaction($savepoint = null) - { - $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (null !== $savepoint) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - if ($this->in_transaction) { - return MDB2_OK; //nothing to do - } - if (!$this->destructor_registered && $this->opened_persistent) { - $this->destructor_registered = true; - register_shutdown_function('MDB2_closeOpenTransactions'); - } - $query = 'BEGIN TRANSACTION '.$this->options['base_transaction_name']; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = true; - return MDB2_OK; - } - - // }}} - // {{{ commit() - - /** - * Commit the database changes done during a transaction that is in - * progress or release a savepoint. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after committing the pending changes. - * - * @param string name of a savepoint to release - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function commit($savepoint = null) - { - $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - - $query = 'COMMIT TRANSACTION '.$this->options['base_transaction_name']; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ - - /** - * Cancel any database changes done during a transaction or since a specific - * savepoint that is in progress. This function may only be called when - * auto-committing is disabled, otherwise it will fail. Therefore, a new - * transaction is implicitly started after canceling the pending changes. - * - * @param string name of a savepoint to rollback to - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - */ - function rollback($savepoint = null) - { - $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); - if (!$this->in_transaction) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'rollback cannot be done changes are auto committed', __FUNCTION__); - } - if (null !== $savepoint) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'savepoints are not supported', __FUNCTION__); - } - - $query = 'ROLLBACK TRANSACTION '.$this->options['base_transaction_name']; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - return $result; - } - $this->in_transaction = false; - return MDB2_OK; - } - - // }}} - // {{{ function setTransactionIsolation() - - /** - * Set the transacton isolation level. - * - * @param string standard isolation level - * READ UNCOMMITTED (allows dirty reads) - * READ COMMITTED (prevents dirty reads) - * REPEATABLE READ (prevents nonrepeatable reads) - * SERIALIZABLE (prevents phantom reads) - * @param array some transaction options: - * 'wait' => 'WAIT' | 'NO WAIT' - * 'rw' => 'READ WRITE' | 'READ ONLY' - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - * - * @access public - * @since 2.1.1 - */ - function setTransactionIsolation($isolation, $options = array()) - { - $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); - switch ($isolation) { - case 'READ UNCOMMITTED': - $isolation = 0; - break; - case 'READ COMMITTED': - case 'REPEATABLE READ': - case 'SERIALIZABLE': - $isolation = 1; - break; - default: - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'isolation level is not supported: '.$isolation, __FUNCTION__); - } - - $query = "PRAGMA read_uncommitted=$isolation"; - return $this->_doQuery($query, true); - } - - // }}} - // {{{ getDatabaseFile() - - /** - * Builds the string with path+dbname+extension - * - * @return string full database path+file - * @access protected - */ - function _getDatabaseFile($database_name) - { - if ($database_name === '' || $database_name === ':memory:') { - return $database_name; - } - return $this->options['database_path'].$database_name.$this->options['database_extension']; - } - - // }}} - // {{{ connect() - - /** - * Connect to the database - * - * @return true on success, MDB2 Error Object on failure - **/ - function connect() - { - $database_file = $this->_getDatabaseFile($this->database_name); - if (is_resource($this->connection)) { - //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 - if (MDB2::areEquals($this->connected_dsn, $this->dsn) - && $this->connected_database_name == $database_file - && $this->opened_persistent == $this->options['persistent'] - ) { - return MDB2_OK; - } - $this->disconnect(false); - } - - if (!PEAR::loadExtension($this->phptype)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); - } - - if (empty($this->database_name)) { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - 'unable to establish a connection', __FUNCTION__); - } - - if ($database_file !== ':memory:') { - if (!file_exists($database_file)) { - if (!touch($database_file)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Could not create database file', __FUNCTION__); - } - if (!isset($this->dsn['mode']) - || !is_numeric($this->dsn['mode']) - ) { - $mode = 0644; - } else { - $mode = octdec($this->dsn['mode']); - } - if (!chmod($database_file, $mode)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Could not be chmodded database file', __FUNCTION__); - } - if (!file_exists($database_file)) { - return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, - 'Could not be found database file', __FUNCTION__); - } - } - if (!is_file($database_file)) { - return $this->raiseError(MDB2_ERROR_INVALID, null, null, - 'Database is a directory name', __FUNCTION__); - } - if (!is_readable($database_file)) { - return $this->raiseError(MDB2_ERROR_ACCESS_VIOLATION, null, null, - 'Could not read database file', __FUNCTION__); - } - } - - $connect_function = ($this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open'); - $php_errormsg = ''; - if (version_compare('5.1.0', PHP_VERSION, '>')) { - @ini_set('track_errors', true); - $connection = @$connect_function($database_file); - @ini_restore('track_errors'); - } else { - $connection = @$connect_function($database_file, 0666, $php_errormsg); - } - $this->_lasterror = $php_errormsg; - if (!$connection) { - return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, - 'unable to establish a connection', __FUNCTION__); - } - - if ($this->fix_assoc_fields_names || - $this->options['portability'] & MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES) - { - @sqlite_query("PRAGMA short_column_names = 1", $connection); - $this->fix_assoc_fields_names = true; - } - - $this->connection = $connection; - $this->connected_dsn = $this->dsn; - $this->connected_database_name = $database_file; - $this->opened_persistent = $this->getoption('persistent'); - $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; - - return MDB2_OK; - } - - // }}} - // {{{ databaseExists() - - /** - * check if given database name is exists? - * - * @param string $name name of the database that should be checked - * - * @return mixed true/false on success, a MDB2 error on failure - * @access public - */ - function databaseExists($name) - { - $database_file = $this->_getDatabaseFile($name); - $result = file_exists($database_file); - return $result; - } - - // }}} - // {{{ disconnect() - - /** - * Log out and disconnect from the database. - * - * @param boolean $force if the disconnect should be forced even if the - * connection is opened persistently - * @return mixed true on success, false if not connected and error - * object on error - * @access public - */ - function disconnect($force = true) - { - if (is_resource($this->connection)) { - if ($this->in_transaction) { - $dsn = $this->dsn; - $database_name = $this->database_name; - $persistent = $this->options['persistent']; - $this->dsn = $this->connected_dsn; - $this->database_name = $this->connected_database_name; - $this->options['persistent'] = $this->opened_persistent; - $this->rollback(); - $this->dsn = $dsn; - $this->database_name = $database_name; - $this->options['persistent'] = $persistent; - } - - if (!$this->opened_persistent || $force) { - @sqlite_close($this->connection); - } - } else { - return false; - } - return parent::disconnect($force); - } - - // }}} - // {{{ _doQuery() - - /** - * Execute a query - * @param string $query query - * @param boolean $is_manip if the query is a manipulation query - * @param resource $connection - * @param string $database_name - * @return result or error object - * @access protected - */ - function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) - { - $this->last_query = $query; - $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); - if ($result) { - if (PEAR::isError($result)) { - return $result; - } - $query = $result; - } - if ($this->options['disable_query']) { - $result = $is_manip ? 0 : null; - return $result; - } - - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - - $function = $this->options['result_buffering'] - ? 'sqlite_query' : 'sqlite_unbuffered_query'; - $php_errormsg = ''; - if (version_compare('5.1.0', PHP_VERSION, '>')) { - @ini_set('track_errors', true); - do { - $result = @$function($query.';', $connection); - } while (sqlite_last_error($connection) == SQLITE_SCHEMA); - @ini_restore('track_errors'); - } else { - do { - $result = @$function($query.';', $connection, SQLITE_BOTH, $php_errormsg); - } while (sqlite_last_error($connection) == SQLITE_SCHEMA); - } - $this->_lasterror = $php_errormsg; - - if (!$result) { - $code = null; - if (0 === strpos($this->_lasterror, 'no such table')) { - $code = MDB2_ERROR_NOSUCHTABLE; - } - $err = $this->raiseError($code, null, null, - 'Could not execute statement', __FUNCTION__); - return $err; - } - - $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); - return $result; - } - - // }}} - // {{{ _affectedRows() - - /** - * Returns the number of rows affected - * - * @param resource $result - * @param resource $connection - * @return mixed MDB2 Error Object or the number of rows affected - * @access private - */ - function _affectedRows($connection, $result = null) - { - if (null === $connection) { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - } - return @sqlite_changes($connection); - } - - // }}} - // {{{ _modifyQuery() - - /** - * Changes a query string for various DBMS specific reasons - * - * @param string $query query to modify - * @param boolean $is_manip if it is a DML query - * @param integer $limit limit the number of rows - * @param integer $offset start reading from given offset - * @return string modified query - * @access protected - */ - function _modifyQuery($query, $is_manip, $limit, $offset) - { - if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) { - if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { - $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', - 'DELETE FROM \1 WHERE 1=1', $query); - } - } - if ($limit > 0 - && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query) - ) { - $query = rtrim($query); - if (substr($query, -1) == ';') { - $query = substr($query, 0, -1); - } - if ($is_manip) { - $query.= " LIMIT $limit"; - } else { - $query.= " LIMIT $offset,$limit"; - } - } - return $query; - } - - // }}} - // {{{ getServerVersion() - - /** - * return version information about the server - * - * @param bool $native determines if the raw version string should be returned - * @return mixed array/string with version information or MDB2 error object - * @access public - */ - function getServerVersion($native = false) - { - $server_info = false; - if ($this->connected_server_info) { - $server_info = $this->connected_server_info; - } elseif ($this->options['server_version']) { - $server_info = $this->options['server_version']; - } elseif (function_exists('sqlite_libversion')) { - $server_info = @sqlite_libversion(); - } - if (!$server_info) { - return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, - 'Requires either the "server_version" option or the sqlite_libversion() function', __FUNCTION__); - } - // cache server_info - $this->connected_server_info = $server_info; - if (!$native) { - $tmp = explode('.', $server_info, 3); - $server_info = array( - 'major' => isset($tmp[0]) ? $tmp[0] : null, - 'minor' => isset($tmp[1]) ? $tmp[1] : null, - 'patch' => isset($tmp[2]) ? $tmp[2] : null, - 'extra' => null, - 'native' => $server_info, - ); - } - return $server_info; - } - - // }}} - // {{{ replace() - - /** - * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT - * query, except that if there is already a row in the table with the same - * key field values, the old row is deleted before the new row is inserted. - * - * The REPLACE type of query does not make part of the SQL standards. Since - * practically only SQLite implements it natively, this type of query is - * emulated through this method for other DBMS using standard types of - * queries inside a transaction to assure the atomicity of the operation. - * - * @access public - * - * @param string $table name of the table on which the REPLACE query will - * be executed. - * @param array $fields associative array that describes the fields and the - * values that will be inserted or updated in the specified table. The - * indexes of the array are the names of all the fields of the table. The - * values of the array are also associative arrays that describe the - * values and other properties of the table fields. - * - * Here follows a list of field properties that need to be specified: - * - * value: - * Value to be assigned to the specified field. This value may be - * of specified in database independent type format as this - * function can perform the necessary datatype conversions. - * - * Default: - * this property is required unless the Null property - * is set to 1. - * - * type - * Name of the type of the field. Currently, all types Metabase - * are supported except for clob and blob. - * - * Default: no type conversion - * - * null - * Boolean property that indicates that the value for this field - * should be set to null. - * - * The default value for fields missing in INSERT queries may be - * specified the definition of a table. Often, the default value - * is already null, but since the REPLACE may be emulated using - * an UPDATE query, make sure that all fields of the table are - * listed in this function argument array. - * - * Default: 0 - * - * key - * Boolean property that indicates that this field should be - * handled as a primary key or at least as part of the compound - * unique index of the table that will determine the row that will - * updated if it exists or inserted a new row otherwise. - * - * This function will fail if no key field is specified or if the - * value of a key field is set to null because fields that are - * part of unique index they may not be null. - * - * Default: 0 - * - * @return mixed MDB2_OK on success, a MDB2 error on failure - */ - function replace($table, $fields) - { - $count = count($fields); - $query = $values = ''; - $keys = $colnum = 0; - for (reset($fields); $colnum < $count; next($fields), $colnum++) { - $name = key($fields); - if ($colnum > 0) { - $query .= ','; - $values.= ','; - } - $query.= $this->quoteIdentifier($name, true); - if (isset($fields[$name]['null']) && $fields[$name]['null']) { - $value = 'NULL'; - } else { - $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null; - $value = $this->quote($fields[$name]['value'], $type); - if (PEAR::isError($value)) { - return $value; - } - } - $values.= $value; - if (isset($fields[$name]['key']) && $fields[$name]['key']) { - if ($value === 'NULL') { - return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'key value '.$name.' may not be NULL', __FUNCTION__); - } - $keys++; - } - } - if ($keys == 0) { - return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null, - 'not specified which fields are keys', __FUNCTION__); - } - - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - - $table = $this->quoteIdentifier($table, true); - $query = "REPLACE INTO $table ($query) VALUES ($values)"; - $result = $this->_doQuery($query, true, $connection); - if (PEAR::isError($result)) { - return $result; - } - return $this->_affectedRows($connection, $result); - } - - // }}} - // {{{ nextID() - - /** - * Returns the next free id of a sequence - * - * @param string $seq_name name of the sequence - * @param boolean $ondemand when true the sequence is - * automatic created, if it - * not exists - * - * @return mixed MDB2 Error Object or id - * @access public - */ - function nextID($seq_name, $ondemand = true) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $seqcol_name = $this->options['seqcol_name']; - $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)"; - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $this->expectError(MDB2_ERROR_NOSUCHTABLE); - $result = $this->_doQuery($query, true); - $this->popExpect(); - $this->popErrorHandling(); - if (PEAR::isError($result)) { - if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { - $this->loadModule('Manager', null, true); - $result = $this->manager->createSequence($seq_name); - if (PEAR::isError($result)) { - return $this->raiseError($result, null, null, - 'on demand sequence '.$seq_name.' could not be created', __FUNCTION__); - } else { - return $this->nextID($seq_name, false); - } - } - return $result; - } - $value = $this->lastInsertID(); - if (is_numeric($value)) { - $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value"; - $result = $this->_doQuery($query, true); - if (PEAR::isError($result)) { - $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name; - } - } - return $value; - } - - // }}} - // {{{ lastInsertID() - - /** - * Returns the autoincrement ID if supported or $id or fetches the current - * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) - * - * @param string $table name of the table into which a new row was inserted - * @param string $field name of the field into which a new row was inserted - * @return mixed MDB2 Error Object or id - * @access public - */ - function lastInsertID($table = null, $field = null) - { - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } - $value = @sqlite_last_insert_rowid($connection); - if (!$value) { - return $this->raiseError(null, null, null, - 'Could not get last insert ID', __FUNCTION__); - } - return $value; - } - - // }}} - // {{{ currID() - - /** - * Returns the current id of a sequence - * - * @param string $seq_name name of the sequence - * @return mixed MDB2 Error Object or id - * @access public - */ - function currID($seq_name) - { - $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); - $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true); - $query = "SELECT MAX($seqcol_name) FROM $sequence_name"; - return $this->queryOne($query, 'integer'); - } -} - -/** - * MDB2 SQLite result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Result_sqlite extends MDB2_Result_Common -{ - // }}} - // {{{ fetchRow() - - /** - * Fetch a row and insert the data into an existing array. - * - * @param int $fetchmode how the array data should be indexed - * @param int $rownum number of the row where the data can be found - * @return int data array on success, a MDB2 error on failure - * @access public - */ - function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) - { - if (null !== $rownum) { - $seek = $this->seek($rownum); - if (PEAR::isError($seek)) { - return $seek; - } - } - if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { - $fetchmode = $this->db->fetchmode; - } - if ( $fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT - ) { - $row = @sqlite_fetch_array($this->result, SQLITE_ASSOC); - if (is_array($row) - && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE - ) { - $row = array_change_key_case($row, $this->db->options['field_case']); - } - } else { - $row = @sqlite_fetch_array($this->result, SQLITE_NUM); - } - if (!$row) { - if (false === $this->result) { - $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - return $err; - } - return null; - } - $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; - $rtrim = false; - if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { - if (empty($this->types)) { - $mode += MDB2_PORTABILITY_RTRIM; - } else { - $rtrim = true; - } - } - if ($mode) { - $this->db->_fixResultArrayValues($row, $mode); - } - if ( ( $fetchmode != MDB2_FETCHMODE_ASSOC - && $fetchmode != MDB2_FETCHMODE_OBJECT) - && !empty($this->types) - ) { - $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); - } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC - || $fetchmode == MDB2_FETCHMODE_OBJECT) - && !empty($this->types_assoc) - ) { - $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim); - } - if (!empty($this->values)) { - $this->_assignBindColumns($row); - } - if ($fetchmode === MDB2_FETCHMODE_OBJECT) { - $object_class = $this->db->options['fetch_class']; - if ($object_class == 'stdClass') { - $row = (object) $row; - } else { - $rowObj = new $object_class($row); - $row = $rowObj; - } - } - ++$this->rownum; - return $row; - } - - // }}} - // {{{ _getColumnNames() - - /** - * Retrieve the names of columns returned by the DBMS in a query result. - * - * @return mixed Array variable that holds the names of columns as keys - * or an MDB2 error on failure. - * Some DBMS may not return any columns when the result set - * does not contain any rows. - * @access private - */ - function _getColumnNames() - { - $columns = array(); - $numcols = $this->numCols(); - if (PEAR::isError($numcols)) { - return $numcols; - } - for ($column = 0; $column < $numcols; $column++) { - $column_name = @sqlite_field_name($this->result, $column); - $columns[$column_name] = $column; - } - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $columns = array_change_key_case($columns, $this->db->options['field_case']); - } - return $columns; - } - - // }}} - // {{{ numCols() - - /** - * Count the number of columns returned by the DBMS in a query result. - * - * @access public - * @return mixed integer value with the number of columns, a MDB2 error - * on failure - */ - function numCols() - { - $cols = @sqlite_num_fields($this->result); - if (null === $cols) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return count($this->types); - } - return $this->db->raiseError(null, null, null, - 'Could not get column count', __FUNCTION__); - } - return $cols; - } -} - -/** - * MDB2 SQLite buffered result driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_BufferedResult_sqlite extends MDB2_Result_sqlite -{ - // {{{ seek() - - /** - * Seek to a specific row in a result set - * - * @param int $rownum number of the row where the data can be found - * @return mixed MDB2_OK on success, a MDB2 error on failure - * @access public - */ - function seek($rownum = 0) - { - if (!@sqlite_seek($this->result, $rownum)) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return MDB2_OK; - } - return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, - 'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__); - } - $this->rownum = $rownum - 1; - return MDB2_OK; - } - - // }}} - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return mixed true or false on sucess, a MDB2 error on failure - * @access public - */ - function valid() - { - $numrows = $this->numRows(); - if (PEAR::isError($numrows)) { - return $numrows; - } - return $this->rownum < ($numrows - 1); - } - - // }}} - // {{{ numRows() - - /** - * Returns the number of rows in a result object - * - * @return mixed MDB2 Error Object or the number of rows - * @access public - */ - function numRows() - { - $rows = @sqlite_num_rows($this->result); - if (null === $rows) { - if (false === $this->result) { - return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'resultset has already been freed', __FUNCTION__); - } - if (null === $this->result) { - return 0; - } - return $this->db->raiseError(null, null, null, - 'Could not get row count', __FUNCTION__); - } - return $rows; - } -} - -/** - * MDB2 SQLite statement driver - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Statement_sqlite extends MDB2_Statement_Common -{ - -} -?> diff --git a/3rdparty/MDB2/Extended.php b/3rdparty/MDB2/Extended.php deleted file mode 100644 index 5b0a5be34a..0000000000 --- a/3rdparty/MDB2/Extended.php +++ /dev/null @@ -1,723 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -/** - * Used by autoPrepare() - */ -define('MDB2_AUTOQUERY_INSERT', 1); -define('MDB2_AUTOQUERY_UPDATE', 2); -define('MDB2_AUTOQUERY_DELETE', 3); -define('MDB2_AUTOQUERY_SELECT', 4); - -/** - * MDB2_Extended: class which adds several high level methods to MDB2 - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Extended extends MDB2_Module_Common -{ - // {{{ autoPrepare() - - /** - * Generate an insert, update or delete query and call prepare() on it - * - * @param string table - * @param array the fields names - * @param int type of query to build - * MDB2_AUTOQUERY_INSERT - * MDB2_AUTOQUERY_UPDATE - * MDB2_AUTOQUERY_DELETE - * MDB2_AUTOQUERY_SELECT - * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement) - * @param array that contains the types of the placeholders - * @param mixed array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * - * @return resource handle for the query - * @see buildManipSQL - * @access public - */ - function autoPrepare($table, $table_fields, $mode = MDB2_AUTOQUERY_INSERT, - $where = false, $types = null, $result_types = MDB2_PREPARE_MANIP) - { - $query = $this->buildManipSQL($table, $table_fields, $mode, $where); - if (PEAR::isError($query)) { - return $query; - } - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - $lobs = array(); - foreach ((array)$types as $param => $type) { - if (($type == 'clob') || ($type == 'blob')) { - $lobs[$param] = $table_fields[$param]; - } - } - return $db->prepare($query, $types, $result_types, $lobs); - } - - // }}} - // {{{ autoExecute() - - /** - * Generate an insert, update or delete query and call prepare() and execute() on it - * - * @param string name of the table - * @param array assoc ($key=>$value) where $key is a field name and $value its value - * @param int type of query to build - * MDB2_AUTOQUERY_INSERT - * MDB2_AUTOQUERY_UPDATE - * MDB2_AUTOQUERY_DELETE - * MDB2_AUTOQUERY_SELECT - * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement) - * @param array that contains the types of the placeholders - * @param string which specifies which result class to use - * @param mixed array that contains the types of the columns in - * the result set or MDB2_PREPARE_RESULT, if set to - * MDB2_PREPARE_MANIP the query is handled as a manipulation query - * - * @return bool|MDB2_Error true on success, a MDB2 error on failure - * @see buildManipSQL - * @see autoPrepare - * @access public - */ - function autoExecute($table, $fields_values, $mode = MDB2_AUTOQUERY_INSERT, - $where = false, $types = null, $result_class = true, $result_types = MDB2_PREPARE_MANIP) - { - $fields_values = (array)$fields_values; - if ($mode == MDB2_AUTOQUERY_SELECT) { - if (is_array($result_types)) { - $keys = array_keys($result_types); - } elseif (!empty($fields_values)) { - $keys = $fields_values; - } else { - $keys = array(); - } - } else { - $keys = array_keys($fields_values); - } - $params = array_values($fields_values); - if (empty($params)) { - $query = $this->buildManipSQL($table, $keys, $mode, $where); - - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - if ($mode == MDB2_AUTOQUERY_SELECT) { - $result = $db->query($query, $result_types, $result_class); - } else { - $result = $db->exec($query); - } - } else { - $stmt = $this->autoPrepare($table, $keys, $mode, $where, $types, $result_types); - if (PEAR::isError($stmt)) { - return $stmt; - } - $result = $stmt->execute($params, $result_class); - $stmt->free(); - } - return $result; - } - - // }}} - // {{{ buildManipSQL() - - /** - * Make automaticaly an sql query for prepare() - * - * Example : buildManipSQL('table_sql', array('field1', 'field2', 'field3'), MDB2_AUTOQUERY_INSERT) - * will return the string : INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) - * NB : - This belongs more to a SQL Builder class, but this is a simple facility - * - Be carefull ! If you don't give a $where param with an UPDATE/DELETE query, all - * the records of the table will be updated/deleted ! - * - * @param string name of the table - * @param ordered array containing the fields names - * @param int type of query to build - * MDB2_AUTOQUERY_INSERT - * MDB2_AUTOQUERY_UPDATE - * MDB2_AUTOQUERY_DELETE - * MDB2_AUTOQUERY_SELECT - * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement) - * - * @return string sql query for prepare() - * @access public - */ - function buildManipSQL($table, $table_fields, $mode, $where = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($db->options['quote_identifier']) { - $table = $db->quoteIdentifier($table); - } - - if (!empty($table_fields) && $db->options['quote_identifier']) { - foreach ($table_fields as $key => $field) { - $table_fields[$key] = $db->quoteIdentifier($field); - } - } - - if ((false !== $where) && (null !== $where)) { - if (is_array($where)) { - $where = implode(' AND ', $where); - } - $where = ' WHERE '.$where; - } - - switch ($mode) { - case MDB2_AUTOQUERY_INSERT: - if (empty($table_fields)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'Insert requires table fields', __FUNCTION__); - } - $cols = implode(', ', $table_fields); - $values = '?'.str_repeat(', ?', (count($table_fields) - 1)); - return 'INSERT INTO '.$table.' ('.$cols.') VALUES ('.$values.')'; - break; - case MDB2_AUTOQUERY_UPDATE: - if (empty($table_fields)) { - return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, - 'Update requires table fields', __FUNCTION__); - } - $set = implode(' = ?, ', $table_fields).' = ?'; - $sql = 'UPDATE '.$table.' SET '.$set.$where; - return $sql; - break; - case MDB2_AUTOQUERY_DELETE: - $sql = 'DELETE FROM '.$table.$where; - return $sql; - break; - case MDB2_AUTOQUERY_SELECT: - $cols = !empty($table_fields) ? implode(', ', $table_fields) : '*'; - $sql = 'SELECT '.$cols.' FROM '.$table.$where; - return $sql; - break; - } - return $db->raiseError(MDB2_ERROR_SYNTAX, null, null, - 'Non existant mode', __FUNCTION__); - } - - // }}} - // {{{ limitQuery() - - /** - * Generates a limited query - * - * @param string query - * @param array that contains the types of the columns in the result set - * @param integer the numbers of rows to fetch - * @param integer the row to start to fetching - * @param string which specifies which result class to use - * @param mixed string which specifies which class to wrap results in - * - * @return MDB2_Result|MDB2_Error result set on success, a MDB2 error on failure - * @access public - */ - function limitQuery($query, $types, $limit, $offset = 0, $result_class = true, - $result_wrap_class = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - $result = $db->setLimit($limit, $offset); - if (PEAR::isError($result)) { - return $result; - } - return $db->query($query, $types, $result_class, $result_wrap_class); - } - - // }}} - // {{{ execParam() - - /** - * Execute a parameterized DML statement. - * - * @param string the SQL query - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * - * @return int|MDB2_Error affected rows on success, a MDB2 error on failure - * @access public - */ - function execParam($query, $params = array(), $param_types = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - if (empty($params)) { - return $db->exec($query); - } - - $stmt = $db->prepare($query, $param_types, MDB2_PREPARE_MANIP); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (PEAR::isError($result)) { - return $result; - } - - $stmt->free(); - return $result; - } - - // }}} - // {{{ getOne() - - /** - * Fetch the first column of the first row of data returned from a query. - * Takes care of doing the query and freeing the results when finished. - * - * @param string the SQL query - * @param string that contains the type of the column in the result set - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * @param int|string which column to return - * - * @return scalar|MDB2_Error data on success, a MDB2 error on failure - * @access public - */ - function getOne($query, $type = null, $params = array(), - $param_types = null, $colnum = 0) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - settype($type, 'array'); - if (empty($params)) { - return $db->queryOne($query, $type, $colnum); - } - - $stmt = $db->prepare($query, $param_types, $type); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $one = $result->fetchOne($colnum); - $stmt->free(); - $result->free(); - return $one; - } - - // }}} - // {{{ getRow() - - /** - * Fetch the first row of data returned from a query. Takes care - * of doing the query and freeing the results when finished. - * - * @param string the SQL query - * @param array that contains the types of the columns in the result set - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * @param int the fetch mode to use - * - * @return array|MDB2_Error data on success, a MDB2 error on failure - * @access public - */ - function getRow($query, $types = null, $params = array(), - $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - if (empty($params)) { - return $db->queryRow($query, $types, $fetchmode); - } - - $stmt = $db->prepare($query, $param_types, $types); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $row = $result->fetchRow($fetchmode); - $stmt->free(); - $result->free(); - return $row; - } - - // }}} - // {{{ getCol() - - /** - * Fetch a single column from a result set and return it as an - * indexed array. - * - * @param string the SQL query - * @param string that contains the type of the column in the result set - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * @param int|string which column to return - * - * @return array|MDB2_Error data on success, a MDB2 error on failure - * @access public - */ - function getCol($query, $type = null, $params = array(), - $param_types = null, $colnum = 0) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - settype($type, 'array'); - if (empty($params)) { - return $db->queryCol($query, $type, $colnum); - } - - $stmt = $db->prepare($query, $param_types, $type); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $col = $result->fetchCol($colnum); - $stmt->free(); - $result->free(); - return $col; - } - - // }}} - // {{{ getAll() - - /** - * Fetch all the rows returned from a query. - * - * @param string the SQL query - * @param array that contains the types of the columns in the result set - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * @param int the fetch mode to use - * @param bool if set to true, the $all will have the first - * column as its first dimension - * @param bool $force_array used only when the query returns exactly - * two columns. If true, the values of the returned array will be - * one-element arrays instead of scalars. - * @param bool $group if true, the values of the returned array is - * wrapped in another array. If the same key value (in the first - * column) repeats itself, the values will be appended to this array - * instead of overwriting the existing values. - * - * @return array|MDB2_Error data on success, a MDB2 error on failure - * @access public - */ - function getAll($query, $types = null, $params = array(), - $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, - $rekey = false, $force_array = false, $group = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - if (empty($params)) { - return $db->queryAll($query, $types, $fetchmode, $rekey, $force_array, $group); - } - - $stmt = $db->prepare($query, $param_types, $types); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group); - $stmt->free(); - $result->free(); - return $all; - } - - // }}} - // {{{ getAssoc() - - /** - * Fetch the entire result set of a query and return it as an - * associative array using the first column as the key. - * - * If the result set contains more than two columns, the value - * will be an array of the values from column 2-n. If the result - * set contains only two columns, the returned value will be a - * scalar with the value of the second column (unless forced to an - * array with the $force_array parameter). A MDB2 error code is - * returned on errors. If the result set contains fewer than two - * columns, a MDB2_ERROR_TRUNCATED error is returned. - * - * For example, if the table 'mytable' contains: - *
    -     *   ID      TEXT       DATE
    -     * --------------------------------
    -     *   1       'one'      944679408
    -     *   2       'two'      944679408
    -     *   3       'three'    944679408
    -     * 
    - * Then the call getAssoc('SELECT id,text FROM mytable') returns: - *
    -     *    array(
    -     *      '1' => 'one',
    -     *      '2' => 'two',
    -     *      '3' => 'three',
    -     *    )
    -     * 
    - * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: - *
    -     *    array(
    -     *      '1' => array('one', '944679408'),
    -     *      '2' => array('two', '944679408'),
    -     *      '3' => array('three', '944679408')
    -     *    )
    -     * 
    - * - * If the more than one row occurs with the same value in the - * first column, the last row overwrites all previous ones by - * default. Use the $group parameter if you don't want to - * overwrite like this. Example: - *
    -     * getAssoc('SELECT category,id,name FROM mytable', null, null
    -     *           MDB2_FETCHMODE_ASSOC, false, true) returns:
    -     *    array(
    -     *      '1' => array(array('id' => '4', 'name' => 'number four'),
    -     *                   array('id' => '6', 'name' => 'number six')
    -     *             ),
    -     *      '9' => array(array('id' => '4', 'name' => 'number four'),
    -     *                   array('id' => '6', 'name' => 'number six')
    -     *             )
    -     *    )
    -     * 
    - * - * Keep in mind that database functions in PHP usually return string - * values for results regardless of the database's internal type. - * - * @param string the SQL query - * @param array that contains the types of the columns in the result set - * @param array if supplied, prepare/execute will be used - * with this array as execute parameters - * @param array that contains the types of the values defined in $params - * @param bool $force_array used only when the query returns - * exactly two columns. If TRUE, the values of the returned array - * will be one-element arrays instead of scalars. - * @param bool $group if TRUE, the values of the returned array - * is wrapped in another array. If the same key value (in the first - * column) repeats itself, the values will be appended to this array - * instead of overwriting the existing values. - * - * @return array|MDB2_Error data on success, a MDB2 error on failure - * @access public - */ - function getAssoc($query, $types = null, $params = array(), $param_types = null, - $fetchmode = MDB2_FETCHMODE_DEFAULT, $force_array = false, $group = false) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - settype($params, 'array'); - if (empty($params)) { - return $db->queryAll($query, $types, $fetchmode, true, $force_array, $group); - } - - $stmt = $db->prepare($query, $param_types, $types); - if (PEAR::isError($stmt)) { - return $stmt; - } - - $result = $stmt->execute($params); - if (!MDB2::isResultCommon($result)) { - return $result; - } - - $all = $result->fetchAll($fetchmode, true, $force_array, $group); - $stmt->free(); - $result->free(); - return $all; - } - - // }}} - // {{{ executeMultiple() - - /** - * This function does several execute() calls on the same statement handle. - * $params must be an array indexed numerically from 0, one execute call is - * done for every 'row' in the array. - * - * If an error occurs during execute(), executeMultiple() does not execute - * the unfinished rows, but rather returns that error. - * - * @param resource query handle from prepare() - * @param array numeric array containing the data to insert into the query - * - * @return bool|MDB2_Error true on success, a MDB2 error on failure - * @access public - * @see prepare(), execute() - */ - function executeMultiple($stmt, $params = null) - { - if (MDB2::isError($stmt)) { - return $stmt; - } - for ($i = 0, $j = count($params); $i < $j; $i++) { - $result = $stmt->execute($params[$i]); - if (PEAR::isError($result)) { - return $result; - } - } - return MDB2_OK; - } - - // }}} - // {{{ getBeforeID() - - /** - * Returns the next free id of a sequence if the RDBMS - * does not support auto increment - * - * @param string name of the table into which a new row was inserted - * @param string name of the field into which a new row was inserted - * @param bool when true the sequence is automatic created, if it not exists - * @param bool if the returned value should be quoted - * - * @return int|MDB2_Error id on success, a MDB2 error on failure - * @access public - */ - function getBeforeID($table, $field = null, $ondemand = true, $quote = true) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($db->supports('auto_increment') !== true) { - $seq = $table.(empty($field) ? '' : '_'.$field); - $id = $db->nextID($seq, $ondemand); - if (!$quote || PEAR::isError($id)) { - return $id; - } - return $db->quote($id, 'integer'); - } elseif (!$quote) { - return null; - } - return 'NULL'; - } - - // }}} - // {{{ getAfterID() - - /** - * Returns the autoincrement ID if supported or $id - * - * @param mixed value as returned by getBeforeId() - * @param string name of the table into which a new row was inserted - * @param string name of the field into which a new row was inserted - * - * @return int|MDB2_Error id on success, a MDB2 error on failure - * @access public - */ - function getAfterID($id, $table, $field = null) - { - $db = $this->getDBInstance(); - if (PEAR::isError($db)) { - return $db; - } - - if ($db->supports('auto_increment') !== true) { - return $id; - } - return $db->lastInsertID($table, $field); - } - - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/MDB2/Iterator.php b/3rdparty/MDB2/Iterator.php deleted file mode 100644 index 46feade321..0000000000 --- a/3rdparty/MDB2/Iterator.php +++ /dev/null @@ -1,262 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -/** - * PHP5 Iterator - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_Iterator implements Iterator -{ - protected $fetchmode; - /** - * @var MDB2_Result_Common - */ - protected $result; - protected $row; - - // {{{ constructor - - /** - * Constructor - */ - public function __construct(MDB2_Result_Common $result, $fetchmode = MDB2_FETCHMODE_DEFAULT) - { - $this->result = $result; - $this->fetchmode = $fetchmode; - } - // }}} - - // {{{ seek() - - /** - * Seek forward to a specific row in a result set - * - * @param int number of the row where the data can be found - * - * @return void - * @access public - */ - public function seek($rownum) - { - $this->row = null; - if ($this->result) { - $this->result->seek($rownum); - } - } - // }}} - - // {{{ next() - - /** - * Fetch next row of data - * - * @return void - * @access public - */ - public function next() - { - $this->row = null; - } - // }}} - - // {{{ current() - - /** - * return a row of data - * - * @return void - * @access public - */ - public function current() - { - if (null === $this->row) { - $row = $this->result->fetchRow($this->fetchmode); - if (PEAR::isError($row)) { - $row = false; - } - $this->row = $row; - } - return $this->row; - } - // }}} - - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return bool true/false, false is also returned on failure - * @access public - */ - public function valid() - { - return (bool)$this->current(); - } - // }}} - - // {{{ free() - - /** - * Free the internal resources associated with result. - * - * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid - * @access public - */ - public function free() - { - if ($this->result) { - return $this->result->free(); - } - $this->result = false; - $this->row = null; - return false; - } - // }}} - - // {{{ key() - - /** - * Returns the row number - * - * @return int|bool|MDB2_Error true on success, false|MDB2_Error if result is invalid - * @access public - */ - public function key() - { - if ($this->result) { - return $this->result->rowCount(); - } - return false; - } - // }}} - - // {{{ rewind() - - /** - * Seek to the first row in a result set - * - * @return void - * @access public - */ - public function rewind() - { - } - // }}} - - // {{{ destructor - - /** - * Destructor - */ - public function __destruct() - { - $this->free(); - } - // }}} -} - -/** - * PHP5 buffered Iterator - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_BufferedIterator extends MDB2_Iterator implements SeekableIterator -{ - // {{{ valid() - - /** - * Check if the end of the result set has been reached - * - * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid - * @access public - */ - public function valid() - { - if ($this->result) { - return $this->result->valid(); - } - return false; - } - // }}} - - // {{{count() - - /** - * Returns the number of rows in a result object - * - * @return int|MDB2_Error number of rows, false|MDB2_Error if result is invalid - * @access public - */ - public function count() - { - if ($this->result) { - return $this->result->numRows(); - } - return false; - } - // }}} - - // {{{ rewind() - - /** - * Seek to the first row in a result set - * - * @return void - * @access public - */ - public function rewind() - { - $this->seek(0); - } - // }}} -} - -?> \ No newline at end of file diff --git a/3rdparty/MDB2/LOB.php b/3rdparty/MDB2/LOB.php deleted file mode 100644 index 537a77e546..0000000000 --- a/3rdparty/MDB2/LOB.php +++ /dev/null @@ -1,264 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id$ - -/** - * @package MDB2 - * @category Database - * @author Lukas Smith - */ - -require_once 'MDB2.php'; - -/** - * MDB2_LOB: user land stream wrapper implementation for LOB support - * - * @package MDB2 - * @category Database - * @author Lukas Smith - */ -class MDB2_LOB -{ - /** - * contains the key to the global MDB2 instance array of the associated - * MDB2 instance - * - * @var integer - * @access protected - */ - var $db_index; - - /** - * contains the key to the global MDB2_LOB instance array of the associated - * MDB2_LOB instance - * - * @var integer - * @access protected - */ - var $lob_index; - - // {{{ stream_open() - - /** - * open stream - * - * @param string specifies the URL that was passed to fopen() - * @param string the mode used to open the file - * @param int holds additional flags set by the streams API - * @param string not used - * - * @return bool - * @access public - */ - function stream_open($path, $mode, $options, &$opened_path) - { - if (!preg_match('/^rb?\+?$/', $mode)) { - return false; - } - $url = parse_url($path); - if (empty($url['host'])) { - return false; - } - $this->db_index = (int)$url['host']; - if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - return false; - } - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - $this->lob_index = (int)$url['user']; - if (!isset($db->datatype->lobs[$this->lob_index])) { - return false; - } - return true; - } - // }}} - - // {{{ stream_read() - - /** - * read stream - * - * @param int number of bytes to read - * - * @return string - * @access public - */ - function stream_read($count) - { - if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - $db->datatype->_retrieveLOB($db->datatype->lobs[$this->lob_index]); - - $data = $db->datatype->_readLOB($db->datatype->lobs[$this->lob_index], $count); - $length = strlen($data); - if ($length == 0) { - $db->datatype->lobs[$this->lob_index]['endOfLOB'] = true; - } - $db->datatype->lobs[$this->lob_index]['position'] += $length; - return $data; - } - } - // }}} - - // {{{ stream_write() - - /** - * write stream, note implemented - * - * @param string data - * - * @return int - * @access public - */ - function stream_write($data) - { - return 0; - } - // }}} - - // {{{ stream_tell() - - /** - * return the current position - * - * @return int current position - * @access public - */ - function stream_tell() - { - if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - return $db->datatype->lobs[$this->lob_index]['position']; - } - } - // }}} - - // {{{ stream_eof() - - /** - * Check if stream reaches EOF - * - * @return bool - * @access public - */ - function stream_eof() - { - if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - return true; - } - - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - $result = $db->datatype->_endOfLOB($db->datatype->lobs[$this->lob_index]); - if (version_compare(phpversion(), "5.0", ">=") - && version_compare(phpversion(), "5.1", "<") - ) { - return !$result; - } - return $result; - } - // }}} - - // {{{ stream_seek() - - /** - * Seek stream, not implemented - * - * @param int offset - * @param int whence - * - * @return bool - * @access public - */ - function stream_seek($offset, $whence) - { - return false; - } - // }}} - - // {{{ stream_stat() - - /** - * return information about stream - * - * @access public - */ - function stream_stat() - { - if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - return array( - 'db_index' => $this->db_index, - 'lob_index' => $this->lob_index, - ); - } - } - // }}} - - // {{{ stream_close() - - /** - * close stream - * - * @access public - */ - function stream_close() - { - if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { - $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; - if (isset($db->datatype->lobs[$this->lob_index])) { - $db->datatype->_destroyLOB($db->datatype->lobs[$this->lob_index]); - unset($db->datatype->lobs[$this->lob_index]); - } - } - } - // }}} -} - -// register streams wrapper -if (!stream_wrapper_register("MDB2LOB", "MDB2_LOB")) { - MDB2::raiseError(); - return false; -} - -?> diff --git a/3rdparty/MDB2/Schema.php b/3rdparty/MDB2/Schema.php deleted file mode 100644 index 5eeb97b055..0000000000 --- a/3rdparty/MDB2/Schema.php +++ /dev/null @@ -1,2797 +0,0 @@ - - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -require_once 'MDB2.php'; - -define('MDB2_SCHEMA_DUMP_ALL', 0); -define('MDB2_SCHEMA_DUMP_STRUCTURE', 1); -define('MDB2_SCHEMA_DUMP_CONTENT', 2); - -/** - * If you add an error code here, make sure you also add a textual - * version of it in MDB2_Schema::errorMessage(). - */ - -define('MDB2_SCHEMA_ERROR', -1); -define('MDB2_SCHEMA_ERROR_PARSE', -2); -define('MDB2_SCHEMA_ERROR_VALIDATE', -3); -define('MDB2_SCHEMA_ERROR_UNSUPPORTED', -4); // Driver does not support this function -define('MDB2_SCHEMA_ERROR_INVALID', -5); // Invalid attribute value -define('MDB2_SCHEMA_ERROR_WRITER', -6); - -/** - * The database manager is a class that provides a set of database - * management services like installing, altering and dumping the data - * structures of databases. - * - * @category Database - * @package MDB2_Schema - * @author Lukas Smith - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema extends PEAR -{ - // {{{ properties - - var $db; - - var $warnings = array(); - - var $options = array( - 'fail_on_invalid_names' => true, - 'dtd_file' => false, - 'valid_types' => array(), - 'force_defaults' => true, - 'parser' => 'MDB2_Schema_Parser', - 'writer' => 'MDB2_Schema_Writer', - 'validate' => 'MDB2_Schema_Validate', - 'drop_obsolete_objects' => false - ); - - // }}} - // {{{ apiVersion() - - /** - * Return the MDB2 API version - * - * @return string the MDB2 API version number - * @access public - */ - function apiVersion() - { - return '0.4.3'; - } - - // }}} - // {{{ arrayMergeClobber() - - /** - * Clobbers two arrays together - * - * @param array $a1 array that should be clobbered - * @param array $a2 array that should be clobbered - * - * @return array|false array on success and false on error - * - * @access public - * @author kc@hireability.com - */ - function arrayMergeClobber($a1, $a2) - { - if (!is_array($a1) || !is_array($a2)) { - return false; - } - foreach ($a2 as $key => $val) { - if (is_array($val) && array_key_exists($key, $a1) && is_array($a1[$key])) { - $a1[$key] = MDB2_Schema::arrayMergeClobber($a1[$key], $val); - } else { - $a1[$key] = $val; - } - } - return $a1; - } - - // }}} - // {{{ resetWarnings() - - /** - * reset the warning array - * - * @access public - * @return void - */ - function resetWarnings() - { - $this->warnings = array(); - } - - // }}} - // {{{ getWarnings() - - /** - * Get all warnings in reverse order - * - * This means that the last warning is the first element in the array - * - * @return array with warnings - * @access public - * @see resetWarnings() - */ - function getWarnings() - { - return array_reverse($this->warnings); - } - - // }}} - // {{{ setOption() - - /** - * Sets the option for the db class - * - * @param string $option option name - * @param mixed $value value for the option - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function setOption($option, $value) - { - if (isset($this->options[$option])) { - if (is_null($value)) { - return $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'may not set an option to value null'); - } - $this->options[$option] = $value; - return MDB2_OK; - } - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - "unknown option $option"); - } - - // }}} - // {{{ getOption() - - /** - * returns the value of an option - * - * @param string $option option name - * - * @return mixed the option value or error object - * @access public - */ - function getOption($option) - { - if (isset($this->options[$option])) { - return $this->options[$option]; - } - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, - null, null, "unknown option $option"); - } - - // }}} - // {{{ factory() - - /** - * Create a new MDB2 object for the specified database type - * type - * - * @param string|array|MDB2_Driver_Common &$db 'data source name', see the - * MDB2::parseDSN method for a description of the dsn format. - * Can also be specified as an array of the - * format returned by @see MDB2::parseDSN. - * Finally you can also pass an existing db object to be used. - * @param array $options An associative array of option names and their values. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - * @see MDB2::parseDSN - */ - static function &factory(&$db, $options = array()) - { - $obj = new MDB2_Schema(); - - $result = $obj->connect($db, $options); - if (PEAR::isError($result)) { - return $result; - } - return $obj; - } - - // }}} - // {{{ connect() - - /** - * Create a new MDB2 connection object and connect to the specified - * database - * - * @param string|array|MDB2_Driver_Common &$db 'data source name', see the - * MDB2::parseDSN method for a description of the dsn format. - * Can also be specified as an array of the - * format returned by MDB2::parseDSN. - * Finally you can also pass an existing db object to be used. - * @param array $options An associative array of option names and their values. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - * @see MDB2::parseDSN - */ - function connect(&$db, $options = array()) - { - $db_options = array(); - if (is_array($options)) { - foreach ($options as $option => $value) { - if (array_key_exists($option, $this->options)) { - $result = $this->setOption($option, $value); - if (PEAR::isError($result)) { - return $result; - } - } else { - $db_options[$option] = $value; - } - } - } - - $this->disconnect(); - if (!MDB2::isConnection($db)) { - $db = MDB2::factory($db, $db_options); - } - - if (PEAR::isError($db)) { - return $db; - } - - $this->db = $db; - $this->db->loadModule('Datatype'); - $this->db->loadModule('Manager'); - $this->db->loadModule('Reverse'); - $this->db->loadModule('Function'); - if (empty($this->options['valid_types'])) { - $this->options['valid_types'] = $this->db->datatype->getValidTypes(); - } - - return MDB2_OK; - } - - // }}} - // {{{ disconnect() - - /** - * Log out and disconnect from the database. - * - * @access public - * @return void - */ - function disconnect() - { - if (MDB2::isConnection($this->db)) { - $this->db->disconnect(); - unset($this->db); - } - } - - // }}} - // {{{ parseDatabaseDefinition() - - /** - * Parse a database definition from a file or an array - * - * @param string|array $schema the database schema array or file name - * @param bool $skip_unreadable if non readable files should be skipped - * @param array $variables associative array that the defines the text string values - * that are meant to be used to replace the variables that are - * used in the schema description. - * @param bool $fail_on_invalid_names make function fail on invalid names - * @param array $structure database structure definition - * - * @access public - * @return array - */ - function parseDatabaseDefinition($schema, $skip_unreadable = false, $variables = array(), - $fail_on_invalid_names = true, $structure = false) - { - $database_definition = false; - if (is_string($schema)) { - // if $schema is not readable then we just skip it - // and simply copy the $current_schema file to that file name - if (is_readable($schema)) { - $database_definition = $this->parseDatabaseDefinitionFile($schema, $variables, $fail_on_invalid_names, $structure); - } - } elseif (is_array($schema)) { - $database_definition = $schema; - } - if (!$database_definition && !$skip_unreadable) { - $database_definition = $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'invalid data type of schema or unreadable data source'); - } - return $database_definition; - } - - // }}} - // {{{ parseDatabaseDefinitionFile() - - /** - * Parse a database definition file by creating a schema format - * parser object and passing the file contents as parser input data stream. - * - * @param string $input_file the database schema file. - * @param array $variables associative array that the defines the text string values - * that are meant to be used to replace the variables that are - * used in the schema description. - * @param bool $fail_on_invalid_names make function fail on invalid names - * @param array $structure database structure definition - * - * @access public - * @return array - */ - function parseDatabaseDefinitionFile($input_file, $variables = array(), - $fail_on_invalid_names = true, $structure = false) - { - $dtd_file = $this->options['dtd_file']; - if ($dtd_file) { - include_once 'XML/DTD/XmlValidator.php'; - $dtd = new XML_DTD_XmlValidator; - if (!$dtd->isValid($dtd_file, $input_file)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_PARSE, null, null, $dtd->getMessage()); - } - } - - $class_name = $this->options['parser']; - - $result = MDB2::loadClass($class_name, $this->db->getOption('debug')); - if (PEAR::isError($result)) { - return $result; - } - - $max_identifiers_length = null; - if (isset($this->db->options['max_identifiers_length'])) { - $max_identifiers_length = $this->db->options['max_identifiers_length']; - } - - $parser = new $class_name($variables, $fail_on_invalid_names, $structure, - $this->options['valid_types'], $this->options['force_defaults'], - $max_identifiers_length - ); - - $result = $parser->setInputFile($input_file); - if (PEAR::isError($result)) { - return $result; - } - - $result = $parser->parse(); - if (PEAR::isError($result)) { - return $result; - } - if (PEAR::isError($parser->error)) { - return $parser->error; - } - - return $parser->database_definition; - } - - // }}} - // {{{ getDefinitionFromDatabase() - - /** - * Attempt to reverse engineer a schema structure from an existing MDB2 - * This method can be used if no xml schema file exists yet. - * The resulting xml schema file may need some manual adjustments. - * - * @return array|MDB2_Error array with definition or error object - * @access public - */ - function getDefinitionFromDatabase() - { - $database = $this->db->database_name; - if (empty($database)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'it was not specified a valid database name'); - } - - $class_name = $this->options['validate']; - - $result = MDB2::loadClass($class_name, $this->db->getOption('debug')); - if (PEAR::isError($result)) { - return $result; - } - - $max_identifiers_length = null; - if (isset($this->db->options['max_identifiers_length'])) { - $max_identifiers_length = $this->db->options['max_identifiers_length']; - } - - $val = new $class_name( - $this->options['fail_on_invalid_names'], - $this->options['valid_types'], - $this->options['force_defaults'], - $max_identifiers_length - ); - - $database_definition = array( - 'name' => $database, - 'create' => true, - 'overwrite' => false, - 'charset' => 'utf8', - 'description' => '', - 'comments' => '', - 'tables' => array(), - 'sequences' => array(), - ); - - $tables = $this->db->manager->listTables(); - if (PEAR::isError($tables)) { - return $tables; - } - - foreach ($tables as $table_name) { - $fields = $this->db->manager->listTableFields($table_name); - if (PEAR::isError($fields)) { - return $fields; - } - - $database_definition['tables'][$table_name] = array( - 'was' => '', - 'description' => '', - 'comments' => '', - 'fields' => array(), - 'indexes' => array(), - 'constraints' => array(), - 'initialization' => array() - ); - - $table_definition = $database_definition['tables'][$table_name]; - foreach ($fields as $field_name) { - $definition = $this->db->reverse->getTableFieldDefinition($table_name, $field_name); - if (PEAR::isError($definition)) { - return $definition; - } - - if (!empty($definition[0]['autoincrement'])) { - $definition[0]['default'] = '0'; - } - - $table_definition['fields'][$field_name] = $definition[0]; - - $field_choices = count($definition); - if ($field_choices > 1) { - $warning = "There are $field_choices type choices in the table $table_name field $field_name (#1 is the default): "; - - $field_choice_cnt = 1; - - $table_definition['fields'][$field_name]['choices'] = array(); - foreach ($definition as $field_choice) { - $table_definition['fields'][$field_name]['choices'][] = $field_choice; - - $warning .= 'choice #'.($field_choice_cnt).': '.serialize($field_choice); - $field_choice_cnt++; - } - $this->warnings[] = $warning; - } - - /** - * The first parameter is used to verify if there are duplicated - * fields which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateField(array(), $table_definition['fields'][$field_name], $field_name); - if (PEAR::isError($result)) { - return $result; - } - } - - $keys = array(); - - $indexes = $this->db->manager->listTableIndexes($table_name); - if (PEAR::isError($indexes)) { - return $indexes; - } - - if (is_array($indexes)) { - foreach ($indexes as $index_name) { - $this->db->expectError(MDB2_ERROR_NOT_FOUND); - $definition = $this->db->reverse->getTableIndexDefinition($table_name, $index_name); - $this->db->popExpect(); - if (PEAR::isError($definition)) { - if (PEAR::isError($definition, MDB2_ERROR_NOT_FOUND)) { - continue; - } - return $definition; - } - - $keys[$index_name] = $definition; - } - } - - $constraints = $this->db->manager->listTableConstraints($table_name); - if (PEAR::isError($constraints)) { - return $constraints; - } - - if (is_array($constraints)) { - foreach ($constraints as $constraint_name) { - $this->db->expectError(MDB2_ERROR_NOT_FOUND); - $definition = $this->db->reverse->getTableConstraintDefinition($table_name, $constraint_name); - $this->db->popExpect(); - if (PEAR::isError($definition)) { - if (PEAR::isError($definition, MDB2_ERROR_NOT_FOUND)) { - continue; - } - return $definition; - } - - $keys[$constraint_name] = $definition; - } - } - - foreach ($keys as $key_name => $definition) { - if (array_key_exists('foreign', $definition) - && $definition['foreign'] - ) { - /** - * The first parameter is used to verify if there are duplicated - * foreign keys which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateConstraint(array(), $definition, $key_name); - if (PEAR::isError($result)) { - return $result; - } - - foreach ($definition['fields'] as $field_name => $field) { - /** - * The first parameter is used to verify if there are duplicated - * referencing fields which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateConstraintField(array(), $field_name); - if (PEAR::isError($result)) { - return $result; - } - - $definition['fields'][$field_name] = ''; - } - - foreach ($definition['references']['fields'] as $field_name => $field) { - /** - * The first parameter is used to verify if there are duplicated - * referenced fields which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateConstraintReferencedField(array(), $field_name); - if (PEAR::isError($result)) { - return $result; - } - - $definition['references']['fields'][$field_name] = ''; - } - - $table_definition['constraints'][$key_name] = $definition; - } else { - /** - * The first parameter is used to verify if there are duplicated - * indices which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateIndex(array(), $definition, $key_name); - if (PEAR::isError($result)) { - return $result; - } - - foreach ($definition['fields'] as $field_name => $field) { - /** - * The first parameter is used to verify if there are duplicated - * index fields which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateIndexField(array(), $field, $field_name); - if (PEAR::isError($result)) { - return $result; - } - - $definition['fields'][$field_name] = $field; - } - - $table_definition['indexes'][$key_name] = $definition; - } - } - - /** - * The first parameter is used to verify if there are duplicated - * tables which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateTable(array(), $table_definition, $table_name); - if (PEAR::isError($result)) { - return $result; - } - $database_definition['tables'][$table_name]=$table_definition; - - } - - $sequences = $this->db->manager->listSequences(); - if (PEAR::isError($sequences)) { - return $sequences; - } - - if (is_array($sequences)) { - foreach ($sequences as $sequence_name) { - $definition = $this->db->reverse->getSequenceDefinition($sequence_name); - if (PEAR::isError($definition)) { - return $definition; - } - if (isset($database_definition['tables'][$sequence_name]) - && isset($database_definition['tables'][$sequence_name]['indexes']) - ) { - foreach ($database_definition['tables'][$sequence_name]['indexes'] as $index) { - if (isset($index['primary']) && $index['primary'] - && count($index['fields'] == 1) - ) { - $definition['on'] = array( - 'table' => $sequence_name, - 'field' => key($index['fields']), - ); - break; - } - } - } - - /** - * The first parameter is used to verify if there are duplicated - * sequences which we can guarantee that won't happen when reverse engineering - */ - $result = $val->validateSequence(array(), $definition, $sequence_name); - if (PEAR::isError($result)) { - return $result; - } - - $database_definition['sequences'][$sequence_name] = $definition; - } - } - - $result = $val->validateDatabase($database_definition); - if (PEAR::isError($result)) { - return $result; - } - - return $database_definition; - } - - // }}} - // {{{ createTableIndexes() - - /** - * A method to create indexes for an existing table - * - * @param string $table_name Name of the table - * @param array $indexes An array of indexes to be created - * @param boolean $overwrite If the table/index should be overwritten if it already exists - * - * @return mixed MDB2_Error if there is an error creating an index, MDB2_OK otherwise - * @access public - */ - function createTableIndexes($table_name, $indexes, $overwrite = false) - { - if (!$this->db->supports('indexes')) { - $this->db->debug('Indexes are not supported', __FUNCTION__); - return MDB2_OK; - } - - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NOT_CAPABLE); - foreach ($indexes as $index_name => $index) { - - // Does the index already exist, and if so, should it be overwritten? - $create_index = true; - $this->db->expectError($errorcodes); - if (!empty($index['primary']) || !empty($index['unique'])) { - $current_indexes = $this->db->manager->listTableConstraints($table_name); - } else { - $current_indexes = $this->db->manager->listTableIndexes($table_name); - } - - $this->db->popExpect(); - if (PEAR::isError($current_indexes)) { - if (!MDB2::isError($current_indexes, $errorcodes)) { - return $current_indexes; - } - } elseif (is_array($current_indexes) && in_array($index_name, $current_indexes)) { - if (!$overwrite) { - $this->db->debug('Index already exists: '.$index_name, __FUNCTION__); - $create_index = false; - } else { - $this->db->debug('Preparing to overwrite index: '.$index_name, __FUNCTION__); - - $this->db->expectError(MDB2_ERROR_NOT_FOUND); - if (!empty($index['primary']) || !empty($index['unique'])) { - $result = $this->db->manager->dropConstraint($table_name, $index_name); - } else { - $result = $this->db->manager->dropIndex($table_name, $index_name); - } - $this->db->popExpect(); - if (PEAR::isError($result) && !MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { - return $result; - } - } - } - - // Check if primary is being used and if it's supported - if (!empty($index['primary']) && !$this->db->supports('primary_key')) { - - // Primary not supported so we fallback to UNIQUE and making the field NOT NULL - $index['unique'] = true; - - $changes = array(); - - foreach ($index['fields'] as $field => $empty) { - $field_info = $this->db->reverse->getTableFieldDefinition($table_name, $field); - if (PEAR::isError($field_info)) { - return $field_info; - } - if (!$field_info[0]['notnull']) { - $changes['change'][$field] = $field_info[0]; - - $changes['change'][$field]['notnull'] = true; - } - } - if (!empty($changes)) { - $this->db->manager->alterTable($table_name, $changes, false); - } - } - - // Should the index be created? - if ($create_index) { - if (!empty($index['primary']) || !empty($index['unique'])) { - $result = $this->db->manager->createConstraint($table_name, $index_name, $index); - } else { - $result = $this->db->manager->createIndex($table_name, $index_name, $index); - } - if (PEAR::isError($result)) { - return $result; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ createTableConstraints() - - /** - * A method to create foreign keys for an existing table - * - * @param string $table_name Name of the table - * @param array $constraints An array of foreign keys to be created - * @param boolean $overwrite If the foreign key should be overwritten if it already exists - * - * @return mixed MDB2_Error if there is an error creating a foreign key, MDB2_OK otherwise - * @access public - */ - function createTableConstraints($table_name, $constraints, $overwrite = false) - { - if (!$this->db->supports('indexes')) { - $this->db->debug('Indexes are not supported', __FUNCTION__); - return MDB2_OK; - } - - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NOT_CAPABLE); - foreach ($constraints as $constraint_name => $constraint) { - - // Does the foreign key already exist, and if so, should it be overwritten? - $create_constraint = true; - $this->db->expectError($errorcodes); - $current_constraints = $this->db->manager->listTableConstraints($table_name); - $this->db->popExpect(); - if (PEAR::isError($current_constraints)) { - if (!MDB2::isError($current_constraints, $errorcodes)) { - return $current_constraints; - } - } elseif (is_array($current_constraints) && in_array($constraint_name, $current_constraints)) { - if (!$overwrite) { - $this->db->debug('Foreign key already exists: '.$constraint_name, __FUNCTION__); - $create_constraint = false; - } else { - $this->db->debug('Preparing to overwrite foreign key: '.$constraint_name, __FUNCTION__); - $result = $this->db->manager->dropConstraint($table_name, $constraint_name); - if (PEAR::isError($result)) { - return $result; - } - } - } - - // Should the foreign key be created? - if ($create_constraint) { - $result = $this->db->manager->createConstraint($table_name, $constraint_name, $constraint); - if (PEAR::isError($result)) { - return $result; - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ createTable() - - /** - * Create a table and inititialize the table if data is available - * - * @param string $table_name name of the table to be created - * @param array $table multi dimensional array that contains the - * structure and optional data of the table - * @param bool $overwrite if the table/index should be overwritten if it already exists - * @param array $options an array of options to be passed to the database specific driver - * version of MDB2_Driver_Manager_Common::createTable(). - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function createTable($table_name, $table, $overwrite = false, $options = array()) - { - $create = true; - - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NOT_CAPABLE); - - $this->db->expectError($errorcodes); - - $tables = $this->db->manager->listTables(); - - $this->db->popExpect(); - if (PEAR::isError($tables)) { - if (!MDB2::isError($tables, $errorcodes)) { - return $tables; - } - } elseif (is_array($tables) && in_array($table_name, $tables)) { - if (!$overwrite) { - $create = false; - $this->db->debug('Table already exists: '.$table_name, __FUNCTION__); - } else { - $result = $this->db->manager->dropTable($table_name); - if (PEAR::isError($result)) { - return $result; - } - $this->db->debug('Overwritting table: '.$table_name, __FUNCTION__); - } - } - - if ($create) { - $result = $this->db->manager->createTable($table_name, $table['fields'], $options); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($table['initialization']) && is_array($table['initialization'])) { - $result = $this->initializeTable($table_name, $table); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($table['indexes']) && is_array($table['indexes'])) { - $result = $this->createTableIndexes($table_name, $table['indexes'], $overwrite); - if (PEAR::isError($result)) { - return $result; - } - } - - if (!empty($table['constraints']) && is_array($table['constraints'])) { - $result = $this->createTableConstraints($table_name, $table['constraints'], $overwrite); - if (PEAR::isError($result)) { - return $result; - } - } - - return MDB2_OK; - } - - // }}} - // {{{ initializeTable() - - /** - * Inititialize the table with data - * - * @param string $table_name name of the table - * @param array $table multi dimensional array that contains the - * structure and optional data of the table - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function initializeTable($table_name, $table) - { - $query_insertselect = 'INSERT INTO %s (%s) (SELECT %s FROM %s %s)'; - - $query_insert = 'INSERT INTO %s (%s) VALUES (%s)'; - $query_update = 'UPDATE %s SET %s %s'; - $query_delete = 'DELETE FROM %s %s'; - - $table_name = $this->db->quoteIdentifier($table_name, true); - - $result = MDB2_OK; - - $support_transactions = $this->db->supports('transactions'); - - foreach ($table['initialization'] as $instruction) { - $query = ''; - switch ($instruction['type']) { - case 'insert': - if (!isset($instruction['data']['select'])) { - $data = $this->getInstructionFields($instruction['data'], $table['fields']); - if (!empty($data)) { - $fields = implode(', ', array_keys($data)); - $values = implode(', ', array_values($data)); - - $query = sprintf($query_insert, $table_name, $fields, $values); - } - } else { - $data = $this->getInstructionFields($instruction['data']['select'], $table['fields']); - $where = $this->getInstructionWhere($instruction['data']['select'], $table['fields']); - - $select_table_name = $this->db->quoteIdentifier($instruction['data']['select']['table'], true); - if (!empty($data)) { - $fields = implode(', ', array_keys($data)); - $values = implode(', ', array_values($data)); - - $query = sprintf($query_insertselect, $table_name, $fields, $values, $select_table_name, $where); - } - } - break; - case 'update': - $data = $this->getInstructionFields($instruction['data'], $table['fields']); - $where = $this->getInstructionWhere($instruction['data'], $table['fields']); - if (!empty($data)) { - array_walk($data, array($this, 'buildFieldValue')); - $fields_values = implode(', ', $data); - - $query = sprintf($query_update, $table_name, $fields_values, $where); - } - break; - case 'delete': - $where = $this->getInstructionWhere($instruction['data'], $table['fields']); - $query = sprintf($query_delete, $table_name, $where); - break; - } - if ($query) { - if ($support_transactions && PEAR::isError($res = $this->db->beginNestedTransaction())) { - return $res; - } - - $result = $this->db->exec($query); - if (PEAR::isError($result)) { - return $result; - } - - if ($support_transactions && PEAR::isError($res = $this->db->completeNestedTransaction())) { - return $res; - } - } - } - return $result; - } - - // }}} - // {{{ buildFieldValue() - - /** - * Appends the contents of second argument + '=' to the beginning of first - * argument. - * - * Used with array_walk() in initializeTable() for UPDATEs. - * - * @param string &$element value of array's element - * @param string $key key of array's element - * - * @return void - * - * @access public - * @see MDB2_Schema::initializeTable() - */ - function buildFieldValue(&$element, $key) - { - $element = $key."=$element"; - } - - // }}} - // {{{ getExpression() - - /** - * Generates a string that represents a value that would be associated - * with a column in a DML instruction. - * - * @param array $element multi dimensional array that contains the - * structure of the current DML instruction. - * @param array $fields_definition multi dimensional array that contains the - * definition for current table's fields - * @param string $type type of given field - * - * @return string - * - * @access public - * @see MDB2_Schema::getInstructionFields(), MDB2_Schema::getInstructionWhere() - */ - function getExpression($element, $fields_definition = array(), $type = null) - { - $str = ''; - switch ($element['type']) { - case 'null': - $str .= 'NULL'; - break; - case 'value': - $str .= $this->db->quote($element['data'], $type); - break; - case 'column': - $str .= $this->db->quoteIdentifier($element['data'], true); - break; - case 'function': - $arguments = array(); - if (!empty($element['data']['arguments']) - && is_array($element['data']['arguments']) - ) { - foreach ($element['data']['arguments'] as $v) { - $arguments[] = $this->getExpression($v, $fields_definition); - } - } - if (method_exists($this->db->function, $element['data']['name'])) { - $user_func = array(&$this->db->function, $element['data']['name']); - - $str .= call_user_func_array($user_func, $arguments); - } else { - $str .= $element['data']['name'].'('; - $str .= implode(', ', $arguments); - $str .= ')'; - } - break; - case 'expression': - $type0 = $type1 = null; - if ($element['data']['operants'][0]['type'] == 'column' - && array_key_exists($element['data']['operants'][0]['data'], $fields_definition) - ) { - $type0 = $fields_definition[$element['data']['operants'][0]['data']]['type']; - } - - if ($element['data']['operants'][1]['type'] == 'column' - && array_key_exists($element['data']['operants'][1]['data'], $fields_definition) - ) { - $type1 = $fields_definition[$element['data']['operants'][1]['data']]['type']; - } - - $str .= '('; - $str .= $this->getExpression($element['data']['operants'][0], $fields_definition, $type1); - $str .= $this->getOperator($element['data']['operator']); - $str .= $this->getExpression($element['data']['operants'][1], $fields_definition, $type0); - $str .= ')'; - break; - } - - return $str; - } - - // }}} - // {{{ getOperator() - - /** - * Returns the matching SQL operator - * - * @param string $op parsed descriptive operator - * - * @return string matching SQL operator - * - * @access public - * @static - * @see MDB2_Schema::getExpression() - */ - function getOperator($op) - { - switch ($op) { - case 'PLUS': - return ' + '; - case 'MINUS': - return ' - '; - case 'TIMES': - return ' * '; - case 'DIVIDED': - return ' / '; - case 'EQUAL': - return ' = '; - case 'NOT EQUAL': - return ' != '; - case 'LESS THAN': - return ' < '; - case 'GREATER THAN': - return ' > '; - case 'LESS THAN OR EQUAL': - return ' <= '; - case 'GREATER THAN OR EQUAL': - return ' >= '; - default: - return ' '.$op.' '; - } - } - - // }}} - // {{{ getInstructionFields() - - /** - * Walks the parsed DML instruction array, field by field, - * storing them and their processed values inside a new array. - * - * @param array $instruction multi dimensional array that contains the - * structure of the current DML instruction. - * @param array $fields_definition multi dimensional array that contains the - * definition for current table's fields - * - * @return array array of strings in the form 'field_name' => 'value' - * - * @access public - * @static - * @see MDB2_Schema::initializeTable() - */ - function getInstructionFields($instruction, $fields_definition = array()) - { - $fields = array(); - if (!empty($instruction['field']) && is_array($instruction['field'])) { - foreach ($instruction['field'] as $field) { - $field_name = $this->db->quoteIdentifier($field['name'], true); - - $fields[$field_name] = $this->getExpression($field['group'], $fields_definition); - } - } - return $fields; - } - - // }}} - // {{{ getInstructionWhere() - - /** - * Translates the parsed WHERE expression of a DML instruction - * (array structure) to a SQL WHERE clause (string). - * - * @param array $instruction multi dimensional array that contains the - * structure of the current DML instruction. - * @param array $fields_definition multi dimensional array that contains the - * definition for current table's fields. - * - * @return string SQL WHERE clause - * - * @access public - * @static - * @see MDB2_Schema::initializeTable() - */ - function getInstructionWhere($instruction, $fields_definition = array()) - { - $where = ''; - if (!empty($instruction['where'])) { - $where = 'WHERE '.$this->getExpression($instruction['where'], $fields_definition); - } - return $where; - } - - // }}} - // {{{ createSequence() - - /** - * Create a sequence - * - * @param string $sequence_name name of the sequence to be created - * @param array $sequence multi dimensional array that contains the - * structure and optional data of the table - * @param bool $overwrite if the sequence should be overwritten if it already exists - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function createSequence($sequence_name, $sequence, $overwrite = false) - { - if (!$this->db->supports('sequences')) { - $this->db->debug('Sequences are not supported', __FUNCTION__); - return MDB2_OK; - } - - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NOT_CAPABLE); - $this->db->expectError($errorcodes); - $sequences = $this->db->manager->listSequences(); - $this->db->popExpect(); - if (PEAR::isError($sequences)) { - if (!MDB2::isError($sequences, $errorcodes)) { - return $sequences; - } - } elseif (is_array($sequence) && in_array($sequence_name, $sequences)) { - if (!$overwrite) { - $this->db->debug('Sequence already exists: '.$sequence_name, __FUNCTION__); - return MDB2_OK; - } - - $result = $this->db->manager->dropSequence($sequence_name); - if (PEAR::isError($result)) { - return $result; - } - $this->db->debug('Overwritting sequence: '.$sequence_name, __FUNCTION__); - } - - $start = 1; - $field = ''; - if (!empty($sequence['on'])) { - $table = $sequence['on']['table']; - $field = $sequence['on']['field']; - - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NOT_CAPABLE); - $this->db->expectError($errorcodes); - $tables = $this->db->manager->listTables(); - $this->db->popExpect(); - if (PEAR::isError($tables) && !MDB2::isError($tables, $errorcodes)) { - return $tables; - } - - if (!PEAR::isError($tables) && is_array($tables) && in_array($table, $tables)) { - if ($this->db->supports('summary_functions')) { - $query = "SELECT MAX($field) FROM ".$this->db->quoteIdentifier($table, true); - } else { - $query = "SELECT $field FROM ".$this->db->quoteIdentifier($table, true)." ORDER BY $field DESC"; - } - $start = $this->db->queryOne($query, 'integer'); - if (PEAR::isError($start)) { - return $start; - } - ++$start; - } else { - $this->warnings[] = 'Could not sync sequence: '.$sequence_name; - } - } elseif (!empty($sequence['start']) && is_numeric($sequence['start'])) { - $start = $sequence['start']; - $table = ''; - } - - $result = $this->db->manager->createSequence($sequence_name, $start); - if (PEAR::isError($result)) { - return $result; - } - - return MDB2_OK; - } - - // }}} - // {{{ createDatabase() - - /** - * Create a database space within which may be created database objects - * like tables, indexes and sequences. The implementation of this function - * is highly DBMS specific and may require special permissions to run - * successfully. Consult the documentation or the DBMS drivers that you - * use to be aware of eventual configuration requirements. - * - * @param array $database_definition multi dimensional array that contains the current definition - * @param array $options an array of options to be passed to the - * database specific driver version of - * MDB2_Driver_Manager_Common::createTable(). - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function createDatabase($database_definition, $options = array()) - { - if (!isset($database_definition['name']) || !$database_definition['name']) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'no valid database name specified'); - } - - $create = (isset($database_definition['create']) && $database_definition['create']); - $overwrite = (isset($database_definition['overwrite']) && $database_definition['overwrite']); - - /** - * - * We need to clean up database name before any query to prevent - * database driver from using a inexistent database - * - */ - $previous_database_name = $this->db->setDatabase(''); - - // Lower / Upper case the db name if the portability deems so. - if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { - $func = $this->db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'; - - $db_name = $func($database_definition['name']); - } else { - $db_name = $database_definition['name']; - } - - if ($create) { - - $dbExists = $this->db->databaseExists($db_name); - if (PEAR::isError($dbExists)) { - return $dbExists; - } - - if ($dbExists && $overwrite) { - $this->db->expectError(MDB2_ERROR_CANNOT_DROP); - $result = $this->db->manager->dropDatabase($db_name); - $this->db->popExpect(); - if (PEAR::isError($result) && !MDB2::isError($result, MDB2_ERROR_CANNOT_DROP)) { - return $result; - } - $dbExists = false; - $this->db->debug('Overwritting database: ' . $db_name, __FUNCTION__); - } - - $dbOptions = array(); - if (array_key_exists('charset', $database_definition) - && !empty($database_definition['charset'])) { - $dbOptions['charset'] = $database_definition['charset']; - } - - if ($dbExists) { - $this->db->debug('Database already exists: ' . $db_name, __FUNCTION__); - if (!empty($dbOptions)) { - $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NO_PERMISSION); - $this->db->expectError($errorcodes); - $result = $this->db->manager->alterDatabase($db_name, $dbOptions); - $this->db->popExpect(); - if (PEAR::isError($result) && !MDB2::isError($result, $errorcodes)) { - return $result; - } - } - $create = false; - } else { - $this->db->expectError(MDB2_ERROR_UNSUPPORTED); - $result = $this->db->manager->createDatabase($db_name, $dbOptions); - $this->db->popExpect(); - if (PEAR::isError($result) && !MDB2::isError($result, MDB2_ERROR_UNSUPPORTED)) { - return $result; - } - $this->db->debug('Creating database: ' . $db_name, __FUNCTION__); - } - } - - $this->db->setDatabase($db_name); - if (($support_transactions = $this->db->supports('transactions')) - && PEAR::isError($result = $this->db->beginNestedTransaction()) - ) { - return $result; - } - - $created_objects = 0; - if (isset($database_definition['tables']) - && is_array($database_definition['tables']) - ) { - foreach ($database_definition['tables'] as $table_name => $table) { - $result = $this->createTable($table_name, $table, $overwrite, $options); - if (PEAR::isError($result)) { - break; - } - $created_objects++; - } - } - if (!PEAR::isError($result) - && isset($database_definition['sequences']) - && is_array($database_definition['sequences']) - ) { - foreach ($database_definition['sequences'] as $sequence_name => $sequence) { - $result = $this->createSequence($sequence_name, $sequence, false, $overwrite); - - if (PEAR::isError($result)) { - break; - } - $created_objects++; - } - } - - if ($support_transactions) { - $res = $this->db->completeNestedTransaction(); - if (PEAR::isError($res)) { - $result = $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'Could not end transaction ('. - $res->getMessage().' ('.$res->getUserinfo().'))'); - } - } elseif (PEAR::isError($result) && $created_objects) { - $result = $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'the database was only partially created ('. - $result->getMessage().' ('.$result->getUserinfo().'))'); - } - - $this->db->setDatabase($previous_database_name); - - if (PEAR::isError($result) && $create - && PEAR::isError($result2 = $this->db->manager->dropDatabase($db_name)) - ) { - if (!MDB2::isError($result2, MDB2_ERROR_UNSUPPORTED)) { - return $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'Could not drop the created database after unsuccessful creation attempt ('. - $result2->getMessage().' ('.$result2->getUserinfo().'))'); - } - } - - return $result; - } - - // }}} - // {{{ compareDefinitions() - - /** - * Compare a previous definition with the currently parsed definition - * - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * - * @return array|MDB2_Error array of changes on success, or a error object - * @access public - */ - function compareDefinitions($current_definition, $previous_definition) - { - $changes = array(); - - if (!empty($current_definition['tables']) && is_array($current_definition['tables'])) { - $changes['tables'] = $defined_tables = array(); - foreach ($current_definition['tables'] as $table_name => $table) { - $previous_tables = array(); - if (!empty($previous_definition) && is_array($previous_definition)) { - $previous_tables = $previous_definition['tables']; - } - $change = $this->compareTableDefinitions($table_name, $table, $previous_tables, $defined_tables); - if (PEAR::isError($change)) { - return $change; - } - if (!empty($change)) { - $changes['tables'] = MDB2_Schema::arrayMergeClobber($changes['tables'], $change); - } - } - } - if (!empty($previous_definition['tables']) - && is_array($previous_definition['tables']) - ) { - foreach ($previous_definition['tables'] as $table_name => $table) { - if (empty($defined_tables[$table_name])) { - $changes['tables']['remove'][$table_name] = true; - } - } - } - - if (!empty($current_definition['sequences']) && is_array($current_definition['sequences'])) { - $changes['sequences'] = $defined_sequences = array(); - foreach ($current_definition['sequences'] as $sequence_name => $sequence) { - $previous_sequences = array(); - if (!empty($previous_definition) && is_array($previous_definition)) { - $previous_sequences = $previous_definition['sequences']; - } - - $change = $this->compareSequenceDefinitions($sequence_name, - $sequence, - $previous_sequences, - $defined_sequences); - if (PEAR::isError($change)) { - return $change; - } - if (!empty($change)) { - $changes['sequences'] = MDB2_Schema::arrayMergeClobber($changes['sequences'], $change); - } - } - } - if (!empty($previous_definition['sequences']) - && is_array($previous_definition['sequences']) - ) { - foreach ($previous_definition['sequences'] as $sequence_name => $sequence) { - if (empty($defined_sequences[$sequence_name])) { - $changes['sequences']['remove'][$sequence_name] = true; - } - } - } - - return $changes; - } - - // }}} - // {{{ compareTableFieldsDefinitions() - - /** - * Compare a previous definition with the currently parsed definition - * - * @param string $table_name name of the table - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * - * @return array|MDB2_Error array of changes on success, or a error object - * @access public - */ - function compareTableFieldsDefinitions($table_name, $current_definition, - $previous_definition) - { - $changes = $defined_fields = array(); - - if (is_array($current_definition)) { - foreach ($current_definition as $field_name => $field) { - $was_field_name = $field['was']; - if (!empty($previous_definition[$field_name]) - && ( - (isset($previous_definition[$field_name]['was']) - && $previous_definition[$field_name]['was'] == $was_field_name) - || !isset($previous_definition[$was_field_name]) - )) { - $was_field_name = $field_name; - } - - if (!empty($previous_definition[$was_field_name])) { - if ($was_field_name != $field_name) { - $changes['rename'][$was_field_name] = array('name' => $field_name, 'definition' => $field); - } - - if (!empty($defined_fields[$was_field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'the field "'.$was_field_name. - '" was specified for more than one field of table'); - } - - $defined_fields[$was_field_name] = true; - - $change = $this->db->compareDefinition($field, $previous_definition[$was_field_name]); - if (PEAR::isError($change)) { - return $change; - } - - if (!empty($change)) { - if (array_key_exists('default', $change) - && $change['default'] - && !array_key_exists('default', $field)) { - $field['default'] = null; - } - - $change['definition'] = $field; - - $changes['change'][$field_name] = $change; - } - } else { - if ($field_name != $was_field_name) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'it was specified a previous field name ("'. - $was_field_name.'") for field "'.$field_name.'" of table "'. - $table_name.'" that does not exist'); - } - - $changes['add'][$field_name] = $field; - } - } - } - - if (isset($previous_definition) && is_array($previous_definition)) { - foreach ($previous_definition as $field_previous_name => $field_previous) { - if (empty($defined_fields[$field_previous_name])) { - $changes['remove'][$field_previous_name] = true; - } - } - } - - return $changes; - } - - // }}} - // {{{ compareTableIndexesDefinitions() - - /** - * Compare a previous definition with the currently parsed definition - * - * @param string $table_name name of the table - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * - * @return array|MDB2_Error array of changes on success, or a error object - * @access public - */ - function compareTableIndexesDefinitions($table_name, $current_definition, - $previous_definition) - { - $changes = $defined_indexes = array(); - - if (is_array($current_definition)) { - foreach ($current_definition as $index_name => $index) { - $was_index_name = $index['was']; - if (!empty($previous_definition[$index_name]) - && isset($previous_definition[$index_name]['was']) - && $previous_definition[$index_name]['was'] == $was_index_name - ) { - $was_index_name = $index_name; - } - if (!empty($previous_definition[$was_index_name])) { - $change = array(); - if ($was_index_name != $index_name) { - $change['name'] = $was_index_name; - } - - if (!empty($defined_indexes[$was_index_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'the index "'.$was_index_name.'" was specified for'. - ' more than one index of table "'.$table_name.'"'); - } - $defined_indexes[$was_index_name] = true; - - $previous_unique = array_key_exists('unique', $previous_definition[$was_index_name]) - ? $previous_definition[$was_index_name]['unique'] : false; - - $unique = array_key_exists('unique', $index) ? $index['unique'] : false; - if ($previous_unique != $unique) { - $change['unique'] = $unique; - } - - $previous_primary = array_key_exists('primary', $previous_definition[$was_index_name]) - ? $previous_definition[$was_index_name]['primary'] : false; - - $primary = array_key_exists('primary', $index) ? $index['primary'] : false; - if ($previous_primary != $primary) { - $change['primary'] = $primary; - } - - $defined_fields = array(); - $previous_fields = $previous_definition[$was_index_name]['fields']; - if (!empty($index['fields']) && is_array($index['fields'])) { - foreach ($index['fields'] as $field_name => $field) { - if (!empty($previous_fields[$field_name])) { - $defined_fields[$field_name] = true; - - $previous_sorting = array_key_exists('sorting', $previous_fields[$field_name]) - ? $previous_fields[$field_name]['sorting'] : ''; - - $sorting = array_key_exists('sorting', $field) ? $field['sorting'] : ''; - if ($previous_sorting != $sorting) { - $change['change'] = true; - } - } else { - $change['change'] = true; - } - } - } - if (isset($previous_fields) && is_array($previous_fields)) { - foreach ($previous_fields as $field_name => $field) { - if (empty($defined_fields[$field_name])) { - $change['change'] = true; - } - } - } - if (!empty($change)) { - $changes['change'][$index_name] = $current_definition[$index_name]; - } - } else { - if ($index_name != $was_index_name) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'it was specified a previous index name ("'.$was_index_name. - ') for index "'.$index_name.'" of table "'.$table_name.'" that does not exist'); - } - $changes['add'][$index_name] = $current_definition[$index_name]; - } - } - } - foreach ($previous_definition as $index_previous_name => $index_previous) { - if (empty($defined_indexes[$index_previous_name])) { - $changes['remove'][$index_previous_name] = $index_previous; - } - } - return $changes; - } - - // }}} - // {{{ compareTableDefinitions() - - /** - * Compare a previous definition with the currently parsed definition - * - * @param string $table_name name of the table - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * @param array &$defined_tables table names in the schema - * - * @return array|MDB2_Error array of changes on success, or a error object - * @access public - */ - function compareTableDefinitions($table_name, $current_definition, - $previous_definition, &$defined_tables) - { - $changes = array(); - - if (is_array($current_definition)) { - $was_table_name = $table_name; - if (!empty($current_definition['was'])) { - $was_table_name = $current_definition['was']; - } - if (!empty($previous_definition[$was_table_name])) { - $changes['change'][$was_table_name] = array(); - if ($was_table_name != $table_name) { - $changes['change'][$was_table_name] = array('name' => $table_name); - } - if (!empty($defined_tables[$was_table_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'the table "'.$was_table_name. - '" was specified for more than one table of the database'); - } - $defined_tables[$was_table_name] = true; - if (!empty($current_definition['fields']) && is_array($current_definition['fields'])) { - $previous_fields = array(); - if (isset($previous_definition[$was_table_name]['fields']) - && is_array($previous_definition[$was_table_name]['fields'])) { - $previous_fields = $previous_definition[$was_table_name]['fields']; - } - - $change = $this->compareTableFieldsDefinitions($table_name, - $current_definition['fields'], - $previous_fields); - - if (PEAR::isError($change)) { - return $change; - } - if (!empty($change)) { - $changes['change'][$was_table_name] = - MDB2_Schema::arrayMergeClobber($changes['change'][$was_table_name], $change); - } - } - if (!empty($current_definition['indexes']) && is_array($current_definition['indexes'])) { - $previous_indexes = array(); - if (isset($previous_definition[$was_table_name]['indexes']) - && is_array($previous_definition[$was_table_name]['indexes'])) { - $previous_indexes = $previous_definition[$was_table_name]['indexes']; - } - $change = $this->compareTableIndexesDefinitions($table_name, - $current_definition['indexes'], - $previous_indexes); - - if (PEAR::isError($change)) { - return $change; - } - if (!empty($change)) { - $changes['change'][$was_table_name]['indexes'] = $change; - } - } - if (empty($changes['change'][$was_table_name])) { - unset($changes['change'][$was_table_name]); - } - if (empty($changes['change'])) { - unset($changes['change']); - } - } else { - if ($table_name != $was_table_name) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'it was specified a previous table name ("'.$was_table_name. - '") for table "'.$table_name.'" that does not exist'); - } - $changes['add'][$table_name] = true; - } - } - - return $changes; - } - - // }}} - // {{{ compareSequenceDefinitions() - - /** - * Compare a previous definition with the currently parsed definition - * - * @param string $sequence_name name of the sequence - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * @param array &$defined_sequences names in the schema - * - * @return array|MDB2_Error array of changes on success, or a error object - * @access public - */ - function compareSequenceDefinitions($sequence_name, $current_definition, - $previous_definition, &$defined_sequences) - { - $changes = array(); - - if (is_array($current_definition)) { - $was_sequence_name = $sequence_name; - if (!empty($previous_definition[$sequence_name]) - && isset($previous_definition[$sequence_name]['was']) - && $previous_definition[$sequence_name]['was'] == $was_sequence_name - ) { - $was_sequence_name = $sequence_name; - } elseif (!empty($current_definition['was'])) { - $was_sequence_name = $current_definition['was']; - } - if (!empty($previous_definition[$was_sequence_name])) { - if ($was_sequence_name != $sequence_name) { - $changes['change'][$was_sequence_name]['name'] = $sequence_name; - } - - if (!empty($defined_sequences[$was_sequence_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'the sequence "'.$was_sequence_name.'" was specified as base'. - ' of more than of sequence of the database'); - } - - $defined_sequences[$was_sequence_name] = true; - - $change = array(); - if (!empty($current_definition['start']) - && isset($previous_definition[$was_sequence_name]['start']) - && $current_definition['start'] != $previous_definition[$was_sequence_name]['start'] - ) { - $change['start'] = $previous_definition[$sequence_name]['start']; - } - if (isset($current_definition['on']['table']) - && isset($previous_definition[$was_sequence_name]['on']['table']) - && $current_definition['on']['table'] != $previous_definition[$was_sequence_name]['on']['table'] - && isset($current_definition['on']['field']) - && isset($previous_definition[$was_sequence_name]['on']['field']) - && $current_definition['on']['field'] != $previous_definition[$was_sequence_name]['on']['field'] - ) { - $change['on'] = $current_definition['on']; - } - if (!empty($change)) { - $changes['change'][$was_sequence_name][$sequence_name] = $change; - } - } else { - if ($sequence_name != $was_sequence_name) { - return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, - 'it was specified a previous sequence name ("'.$was_sequence_name. - '") for sequence "'.$sequence_name.'" that does not exist'); - } - $changes['add'][$sequence_name] = true; - } - } - return $changes; - } - // }}} - // {{{ verifyAlterDatabase() - - /** - * Verify that the changes requested are supported - * - * @param array $changes associative array that contains the definition of the changes - * that are meant to be applied to the database structure. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function verifyAlterDatabase($changes) - { - if (!empty($changes['tables']['change']) && is_array($changes['tables']['change'])) { - foreach ($changes['tables']['change'] as $table_name => $table) { - if (!empty($table['indexes']) && is_array($table['indexes'])) { - if (!$this->db->supports('indexes')) { - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - 'indexes are not supported'); - } - $table_changes = count($table['indexes']); - if (!empty($table['indexes']['add'])) { - $table_changes--; - } - if (!empty($table['indexes']['remove'])) { - $table_changes--; - } - if (!empty($table['indexes']['change'])) { - $table_changes--; - } - if ($table_changes) { - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - 'index alteration not yet supported: '.implode(', ', array_keys($table['indexes']))); - } - } - unset($table['indexes']); - $result = $this->db->manager->alterTable($table_name, $table, true); - if (PEAR::isError($result)) { - return $result; - } - } - } - if (!empty($changes['sequences']) && is_array($changes['sequences'])) { - if (!$this->db->supports('sequences')) { - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - 'sequences are not supported'); - } - $sequence_changes = count($changes['sequences']); - if (!empty($changes['sequences']['add'])) { - $sequence_changes--; - } - if (!empty($changes['sequences']['remove'])) { - $sequence_changes--; - } - if (!empty($changes['sequences']['change'])) { - $sequence_changes--; - } - if ($sequence_changes) { - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - 'sequence alteration not yet supported: '.implode(', ', array_keys($changes['sequences']))); - } - } - return MDB2_OK; - } - - // }}} - // {{{ alterDatabaseIndexes() - - /** - * Execute the necessary actions to implement the requested changes - * in the indexes inside a database structure. - * - * @param string $table_name name of the table - * @param array $changes associative array that contains the definition of the changes - * that are meant to be applied to the database structure. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function alterDatabaseIndexes($table_name, $changes) - { - $alterations = 0; - if (empty($changes)) { - return $alterations; - } - - if (!empty($changes['remove']) && is_array($changes['remove'])) { - foreach ($changes['remove'] as $index_name => $index) { - $this->db->expectError(MDB2_ERROR_NOT_FOUND); - if (!empty($index['primary']) || !empty($index['unique'])) { - $result = $this->db->manager->dropConstraint($table_name, $index_name, !empty($index['primary'])); - } else { - $result = $this->db->manager->dropIndex($table_name, $index_name); - } - $this->db->popExpect(); - if (PEAR::isError($result) && !MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { - return $result; - } - $alterations++; - } - } - if (!empty($changes['change']) && is_array($changes['change'])) { - foreach ($changes['change'] as $index_name => $index) { - /** - * Drop existing index/constraint first. - * Since $changes doesn't tell us whether it's an index or a constraint before the change, - * we have to find out and call the appropriate method. - */ - if (in_array($index_name, $this->db->manager->listTableIndexes($table_name))) { - $result = $this->db->manager->dropIndex($table_name, $index_name); - } elseif (in_array($index_name, $this->db->manager->listTableConstraints($table_name))) { - $result = $this->db->manager->dropConstraint($table_name, $index_name); - } - if (!empty($result) && PEAR::isError($result)) { - return $result; - } - - if (!empty($index['primary']) || !empty($index['unique'])) { - $result = $this->db->manager->createConstraint($table_name, $index_name, $index); - } else { - $result = $this->db->manager->createIndex($table_name, $index_name, $index); - } - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - if (!empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $index_name => $index) { - if (!empty($index['primary']) || !empty($index['unique'])) { - $result = $this->db->manager->createConstraint($table_name, $index_name, $index); - } else { - $result = $this->db->manager->createIndex($table_name, $index_name, $index); - } - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - return $alterations; - } - - // }}} - // {{{ alterDatabaseTables() - - /** - * Execute the necessary actions to implement the requested changes - * in the tables inside a database structure. - * - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * @param array $changes associative array that contains the definition of the changes - * that are meant to be applied to the database structure. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function alterDatabaseTables($current_definition, $previous_definition, $changes) - { - /* FIXME: tables marked to be added are initialized by createTable(), others don't */ - $alterations = 0; - if (empty($changes)) { - return $alterations; - } - - if (!empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $table_name => $table) { - $result = $this->createTable($table_name, $current_definition[$table_name]); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - if ($this->options['drop_obsolete_objects'] - && !empty($changes['remove']) - && is_array($changes['remove']) - ) { - foreach ($changes['remove'] as $table_name => $table) { - $result = $this->db->manager->dropTable($table_name); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - if (!empty($changes['change']) && is_array($changes['change'])) { - foreach ($changes['change'] as $table_name => $table) { - $indexes = array(); - if (!empty($table['indexes'])) { - $indexes = $table['indexes']; - unset($table['indexes']); - } - if (!empty($indexes['remove'])) { - $result = $this->alterDatabaseIndexes($table_name, array('remove' => $indexes['remove'])); - if (PEAR::isError($result)) { - return $result; - } - unset($indexes['remove']); - $alterations += $result; - } - $result = $this->db->manager->alterTable($table_name, $table, false); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - - // table may be renamed at this point - if (!empty($table['name'])) { - $table_name = $table['name']; - } - - if (!empty($indexes)) { - $result = $this->alterDatabaseIndexes($table_name, $indexes); - if (PEAR::isError($result)) { - return $result; - } - $alterations += $result; - } - } - } - - return $alterations; - } - - // }}} - // {{{ alterDatabaseSequences() - - /** - * Execute the necessary actions to implement the requested changes - * in the sequences inside a database structure. - * - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * @param array $changes associative array that contains the definition of the changes - * that are meant to be applied to the database structure. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function alterDatabaseSequences($current_definition, $previous_definition, $changes) - { - $alterations = 0; - if (empty($changes)) { - return $alterations; - } - - if (!empty($changes['add']) && is_array($changes['add'])) { - foreach ($changes['add'] as $sequence_name => $sequence) { - $result = $this->createSequence($sequence_name, $current_definition[$sequence_name]); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - if ($this->options['drop_obsolete_objects'] - && !empty($changes['remove']) - && is_array($changes['remove']) - ) { - foreach ($changes['remove'] as $sequence_name => $sequence) { - $result = $this->db->manager->dropSequence($sequence_name); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - if (!empty($changes['change']) && is_array($changes['change'])) { - foreach ($changes['change'] as $sequence_name => $sequence) { - $result = $this->db->manager->dropSequence($previous_definition[$sequence_name]['was']); - if (PEAR::isError($result)) { - return $result; - } - $result = $this->createSequence($sequence_name, $sequence); - if (PEAR::isError($result)) { - return $result; - } - $alterations++; - } - } - - return $alterations; - } - - // }}} - // {{{ alterDatabase() - - /** - * Execute the necessary actions to implement the requested changes - * in a database structure. - * - * @param array $current_definition multi dimensional array that contains the current definition - * @param array $previous_definition multi dimensional array that contains the previous definition - * @param array $changes associative array that contains the definition of the changes - * that are meant to be applied to the database structure. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function alterDatabase($current_definition, $previous_definition, $changes) - { - $alterations = 0; - if (empty($changes)) { - return $alterations; - } - - $result = $this->verifyAlterDatabase($changes); - if (PEAR::isError($result)) { - return $result; - } - - if (!empty($current_definition['name'])) { - $previous_database_name = $this->db->setDatabase($current_definition['name']); - } - - if (($support_transactions = $this->db->supports('transactions')) - && PEAR::isError($result = $this->db->beginNestedTransaction()) - ) { - return $result; - } - - if (!empty($changes['tables']) && !empty($current_definition['tables'])) { - $current_tables = isset($current_definition['tables']) ? $current_definition['tables'] : array(); - $previous_tables = isset($previous_definition['tables']) ? $previous_definition['tables'] : array(); - - $result = $this->alterDatabaseTables($current_tables, $previous_tables, $changes['tables']); - if (is_numeric($result)) { - $alterations += $result; - } - } - - if (!PEAR::isError($result) && !empty($changes['sequences'])) { - $current_sequences = isset($current_definition['sequences']) ? $current_definition['sequences'] : array(); - $previous_sequences = isset($previous_definition['sequences']) ? $previous_definition['sequences'] : array(); - - $result = $this->alterDatabaseSequences($current_sequences, $previous_sequences, $changes['sequences']); - if (is_numeric($result)) { - $alterations += $result; - } - } - - if ($support_transactions) { - $res = $this->db->completeNestedTransaction(); - if (PEAR::isError($res)) { - $result = $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'Could not end transaction ('. - $res->getMessage().' ('.$res->getUserinfo().'))'); - } - } elseif (PEAR::isError($result) && $alterations) { - $result = $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'the requested database alterations were only partially implemented ('. - $result->getMessage().' ('.$result->getUserinfo().'))'); - } - - if (isset($previous_database_name)) { - $this->db->setDatabase($previous_database_name); - } - return $result; - } - - // }}} - // {{{ dumpDatabaseChanges() - - /** - * Dump the changes between two database definitions. - * - * @param array $changes associative array that specifies the list of database - * definitions changes as returned by the _compareDefinitions - * manager class function. - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function dumpDatabaseChanges($changes) - { - if (!empty($changes['tables'])) { - if (!empty($changes['tables']['add']) && is_array($changes['tables']['add'])) { - foreach ($changes['tables']['add'] as $table_name => $table) { - $this->db->debug("$table_name:", __FUNCTION__); - $this->db->debug("\tAdded table '$table_name'", __FUNCTION__); - } - } - - if (!empty($changes['tables']['remove']) && is_array($changes['tables']['remove'])) { - if ($this->options['drop_obsolete_objects']) { - foreach ($changes['tables']['remove'] as $table_name => $table) { - $this->db->debug("$table_name:", __FUNCTION__); - $this->db->debug("\tRemoved table '$table_name'", __FUNCTION__); - } - } else { - foreach ($changes['tables']['remove'] as $table_name => $table) { - $this->db->debug("\tObsolete table '$table_name' left as is", __FUNCTION__); - } - } - } - - if (!empty($changes['tables']['change']) && is_array($changes['tables']['change'])) { - foreach ($changes['tables']['change'] as $table_name => $table) { - if (array_key_exists('name', $table)) { - $this->db->debug("\tRenamed table '$table_name' to '".$table['name']."'", __FUNCTION__); - } - if (!empty($table['add']) && is_array($table['add'])) { - foreach ($table['add'] as $field_name => $field) { - $this->db->debug("\tAdded field '".$field_name."'", __FUNCTION__); - } - } - if (!empty($table['remove']) && is_array($table['remove'])) { - foreach ($table['remove'] as $field_name => $field) { - $this->db->debug("\tRemoved field '".$field_name."'", __FUNCTION__); - } - } - if (!empty($table['rename']) && is_array($table['rename'])) { - foreach ($table['rename'] as $field_name => $field) { - $this->db->debug("\tRenamed field '".$field_name."' to '".$field['name']."'", __FUNCTION__); - } - } - if (!empty($table['change']) && is_array($table['change'])) { - foreach ($table['change'] as $field_name => $field) { - $field = $field['definition']; - if (array_key_exists('type', $field)) { - $this->db->debug("\tChanged field '$field_name' type to '".$field['type']."'", __FUNCTION__); - } - - if (array_key_exists('unsigned', $field)) { - $this->db->debug("\tChanged field '$field_name' type to '". - (!empty($field['unsigned']) && $field['unsigned'] ? '' : 'not ')."unsigned'", - __FUNCTION__); - } - - if (array_key_exists('length', $field)) { - $this->db->debug("\tChanged field '$field_name' length to '". - (!empty($field['length']) ? $field['length']: 'no length')."'", __FUNCTION__); - } - if (array_key_exists('default', $field)) { - $this->db->debug("\tChanged field '$field_name' default to ". - (isset($field['default']) ? "'".$field['default']."'" : 'NULL'), __FUNCTION__); - } - - if (array_key_exists('notnull', $field)) { - $this->db->debug("\tChanged field '$field_name' notnull to ". - (!empty($field['notnull']) && $field['notnull'] ? 'true' : 'false'), - __FUNCTION__); - } - } - } - if (!empty($table['indexes']) && is_array($table['indexes'])) { - if (!empty($table['indexes']['add']) && is_array($table['indexes']['add'])) { - foreach ($table['indexes']['add'] as $index_name => $index) { - $this->db->debug("\tAdded index '".$index_name. - "' of table '$table_name'", __FUNCTION__); - } - } - if (!empty($table['indexes']['remove']) && is_array($table['indexes']['remove'])) { - foreach ($table['indexes']['remove'] as $index_name => $index) { - $this->db->debug("\tRemoved index '".$index_name. - "' of table '$table_name'", __FUNCTION__); - } - } - if (!empty($table['indexes']['change']) && is_array($table['indexes']['change'])) { - foreach ($table['indexes']['change'] as $index_name => $index) { - if (array_key_exists('name', $index)) { - $this->db->debug("\tRenamed index '".$index_name."' to '".$index['name']. - "' on table '$table_name'", __FUNCTION__); - } - if (array_key_exists('unique', $index)) { - $this->db->debug("\tChanged index '".$index_name."' unique to '". - !empty($index['unique'])."' on table '$table_name'", __FUNCTION__); - } - if (array_key_exists('primary', $index)) { - $this->db->debug("\tChanged index '".$index_name."' primary to '". - !empty($index['primary'])."' on table '$table_name'", __FUNCTION__); - } - if (array_key_exists('change', $index)) { - $this->db->debug("\tChanged index '".$index_name. - "' on table '$table_name'", __FUNCTION__); - } - } - } - } - } - } - } - if (!empty($changes['sequences'])) { - if (!empty($changes['sequences']['add']) && is_array($changes['sequences']['add'])) { - foreach ($changes['sequences']['add'] as $sequence_name => $sequence) { - $this->db->debug("$sequence_name:", __FUNCTION__); - $this->db->debug("\tAdded sequence '$sequence_name'", __FUNCTION__); - } - } - if (!empty($changes['sequences']['remove']) && is_array($changes['sequences']['remove'])) { - if ($this->options['drop_obsolete_objects']) { - foreach ($changes['sequences']['remove'] as $sequence_name => $sequence) { - $this->db->debug("$sequence_name:", __FUNCTION__); - $this->db->debug("\tRemoved sequence '$sequence_name'", __FUNCTION__); - } - } else { - foreach ($changes['sequences']['remove'] as $sequence_name => $sequence) { - $this->db->debug("\tObsolete sequence '$sequence_name' left as is", __FUNCTION__); - } - } - } - if (!empty($changes['sequences']['change']) && is_array($changes['sequences']['change'])) { - foreach ($changes['sequences']['change'] as $sequence_name => $sequence) { - if (array_key_exists('name', $sequence)) { - $this->db->debug("\tRenamed sequence '$sequence_name' to '". - $sequence['name']."'", __FUNCTION__); - } - if (!empty($sequence['change']) && is_array($sequence['change'])) { - foreach ($sequence['change'] as $sequence_name => $sequence) { - if (array_key_exists('start', $sequence)) { - $this->db->debug("\tChanged sequence '$sequence_name' start to '". - $sequence['start']."'", __FUNCTION__); - } - } - } - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ dumpDatabase() - - /** - * Dump a previously parsed database structure in the Metabase schema - * XML based format suitable for the Metabase parser. This function - * may optionally dump the database definition with initialization - * commands that specify the data that is currently present in the tables. - * - * @param array $database_definition multi dimensional array that contains the current definition - * @param array $arguments associative array that takes pairs of tag - * names and values that define dump options. - *
    array (
    -     *                     'output_mode'    =>    String
    -     *                         'file' :   dump into a file
    -     *                         default:   dump using a function
    -     *                     'output'        =>    String
    -     *                         depending on the 'Output_Mode'
    -     *                                  name of the file
    -     *                                  name of the function
    -     *                     'end_of_line'        =>    String
    -     *                         end of line delimiter that should be used
    -     *                         default: "\n"
    -     *                 );
    - * @param int $dump Int that determines what data to dump - * + MDB2_SCHEMA_DUMP_ALL : the entire db - * + MDB2_SCHEMA_DUMP_STRUCTURE : only the structure of the db - * + MDB2_SCHEMA_DUMP_CONTENT : only the content of the db - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function dumpDatabase($database_definition, $arguments, $dump = MDB2_SCHEMA_DUMP_ALL) - { - $class_name = $this->options['writer']; - - $result = MDB2::loadClass($class_name, $this->db->getOption('debug')); - if (PEAR::isError($result)) { - return $result; - } - - // get initialization data - if (isset($database_definition['tables']) && is_array($database_definition['tables']) - && $dump == MDB2_SCHEMA_DUMP_ALL || $dump == MDB2_SCHEMA_DUMP_CONTENT - ) { - foreach ($database_definition['tables'] as $table_name => $table) { - $fields = array(); - $fieldsq = array(); - foreach ($table['fields'] as $field_name => $field) { - $fields[$field_name] = $field['type']; - - $fieldsq[] = $this->db->quoteIdentifier($field_name, true); - } - - $query = 'SELECT '.implode(', ', $fieldsq).' FROM '; - $query .= $this->db->quoteIdentifier($table_name, true); - - $data = $this->db->queryAll($query, $fields, MDB2_FETCHMODE_ASSOC); - - if (PEAR::isError($data)) { - return $data; - } - - if (!empty($data)) { - $initialization = array(); - $lob_buffer_length = $this->db->getOption('lob_buffer_length'); - foreach ($data as $row) { - $rows = array(); - foreach ($row as $key => $lob) { - if (is_resource($lob)) { - $value = ''; - while (!feof($lob)) { - $value .= fread($lob, $lob_buffer_length); - } - $row[$key] = $value; - } - $rows[] = array('name' => $key, 'group' => array('type' => 'value', 'data' => $row[$key])); - } - $initialization[] = array('type' => 'insert', 'data' => array('field' => $rows)); - } - $database_definition['tables'][$table_name]['initialization'] = $initialization; - } - } - } - - $writer = new $class_name($this->options['valid_types']); - return $writer->dumpDatabase($database_definition, $arguments, $dump); - } - - // }}} - // {{{ writeInitialization() - - /** - * Write initialization and sequences - * - * @param string|array $data data file or data array - * @param string|array $structure structure file or array - * @param array $variables associative array that is passed to the argument - * of the same name to the parseDatabaseDefinitionFile function. (there third - * param) - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function writeInitialization($data, $structure = false, $variables = array()) - { - if ($structure) { - $structure = $this->parseDatabaseDefinition($structure, false, $variables); - if (PEAR::isError($structure)) { - return $structure; - } - } - - $data = $this->parseDatabaseDefinition($data, false, $variables, false, $structure); - if (PEAR::isError($data)) { - return $data; - } - - $previous_database_name = null; - if (!empty($data['name'])) { - $previous_database_name = $this->db->setDatabase($data['name']); - } elseif (!empty($structure['name'])) { - $previous_database_name = $this->db->setDatabase($structure['name']); - } - - if (!empty($data['tables']) && is_array($data['tables'])) { - foreach ($data['tables'] as $table_name => $table) { - if (empty($table['initialization'])) { - continue; - } - $result = $this->initializeTable($table_name, $table); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (!empty($structure['sequences']) && is_array($structure['sequences'])) { - foreach ($structure['sequences'] as $sequence_name => $sequence) { - if (isset($data['sequences'][$sequence_name]) - || !isset($sequence['on']['table']) - || !isset($data['tables'][$sequence['on']['table']]) - ) { - continue; - } - $result = $this->createSequence($sequence_name, $sequence, true); - if (PEAR::isError($result)) { - return $result; - } - } - } - if (!empty($data['sequences']) && is_array($data['sequences'])) { - foreach ($data['sequences'] as $sequence_name => $sequence) { - $result = $this->createSequence($sequence_name, $sequence, true); - if (PEAR::isError($result)) { - return $result; - } - } - } - - if (isset($previous_database_name)) { - $this->db->setDatabase($previous_database_name); - } - - return MDB2_OK; - } - - // }}} - // {{{ updateDatabase() - - /** - * Compare the correspondent files of two versions of a database schema - * definition: the previously installed and the one that defines the schema - * that is meant to update the database. - * If the specified previous definition file does not exist, this function - * will create the database from the definition specified in the current - * schema file. - * If both files exist, the function assumes that the database was previously - * installed based on the previous schema file and will update it by just - * applying the changes. - * If this function succeeds, the contents of the current schema file are - * copied to replace the previous schema file contents. Any subsequent schema - * changes should only be done on the file specified by the $current_schema_file - * to let this function make a consistent evaluation of the exact changes that - * need to be applied. - * - * @param string|array $current_schema filename or array of the updated database schema definition. - * @param string|array $previous_schema filename or array of the previously installed database schema definition. - * @param array $variables associative array that is passed to the argument of the same - * name to the parseDatabaseDefinitionFile function. (there third param) - * @param bool $disable_query determines if the disable_query option should be set to true - * for the alterDatabase() or createDatabase() call - * @param bool $overwrite_old_schema_file Overwrite? - * - * @return bool|MDB2_Error MDB2_OK or error object - * @access public - */ - function updateDatabase($current_schema, $previous_schema = false, - $variables = array(), $disable_query = false, - $overwrite_old_schema_file = false) - { - $current_definition = $this->parseDatabaseDefinition($current_schema, false, $variables, - $this->options['fail_on_invalid_names']); - - if (PEAR::isError($current_definition)) { - return $current_definition; - } - - $previous_definition = false; - if ($previous_schema) { - $previous_definition = $this->parseDatabaseDefinition($previous_schema, true, $variables, - $this->options['fail_on_invalid_names']); - if (PEAR::isError($previous_definition)) { - return $previous_definition; - } - } - - if ($previous_definition) { - $dbExists = $this->db->databaseExists($current_definition['name']); - if (PEAR::isError($dbExists)) { - return $dbExists; - } - - if (!$dbExists) { - return $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'database to update does not exist: '.$current_definition['name']); - } - - $changes = $this->compareDefinitions($current_definition, $previous_definition); - if (PEAR::isError($changes)) { - return $changes; - } - - if (is_array($changes)) { - $this->db->setOption('disable_query', $disable_query); - $result = $this->alterDatabase($current_definition, $previous_definition, $changes); - $this->db->setOption('disable_query', false); - if (PEAR::isError($result)) { - return $result; - } - $copy = true; - if ($this->db->options['debug']) { - $result = $this->dumpDatabaseChanges($changes); - if (PEAR::isError($result)) { - return $result; - } - } - } - } else { - $this->db->setOption('disable_query', $disable_query); - $result = $this->createDatabase($current_definition); - $this->db->setOption('disable_query', false); - if (PEAR::isError($result)) { - return $result; - } - } - - if ($overwrite_old_schema_file - && !$disable_query - && is_string($previous_schema) && is_string($current_schema) - && !copy($current_schema, $previous_schema)) { - - return $this->raiseError(MDB2_SCHEMA_ERROR, null, null, - 'Could not copy the new database definition file to the current file'); - } - - return MDB2_OK; - } - // }}} - // {{{ errorMessage() - - /** - * Return a textual error message for a MDB2 error code - * - * @param int|array $value integer error code, null to get the - * current error code-message map, - * or an array with a new error code-message map - * - * @return string error message, or false if the error code was not recognized - * @access public - */ - function errorMessage($value = null) - { - static $errorMessages; - if (is_array($value)) { - $errorMessages = $value; - return MDB2_OK; - } elseif (!isset($errorMessages)) { - $errorMessages = array( - MDB2_SCHEMA_ERROR => 'unknown error', - MDB2_SCHEMA_ERROR_PARSE => 'schema parse error', - MDB2_SCHEMA_ERROR_VALIDATE => 'schema validation error', - MDB2_SCHEMA_ERROR_INVALID => 'invalid', - MDB2_SCHEMA_ERROR_UNSUPPORTED => 'not supported', - MDB2_SCHEMA_ERROR_WRITER => 'schema writer error', - ); - } - - if (is_null($value)) { - return $errorMessages; - } - - if (PEAR::isError($value)) { - $value = $value->getCode(); - } - - return !empty($errorMessages[$value]) ? - $errorMessages[$value] : $errorMessages[MDB2_SCHEMA_ERROR]; - } - - // }}} - // {{{ raiseError() - - /** - * This method is used to communicate an error and invoke error - * callbacks etc. Basically a wrapper for PEAR::raiseError - * without the message string. - * - * @param int|PEAR_Error $code integer error code or and PEAR_Error instance - * @param int $mode error mode, see PEAR_Error docs - * error level (E_USER_NOTICE etc). If error mode is - * PEAR_ERROR_CALLBACK, this is the callback function, - * either as a function name, or as an array of an - * object and method name. For other error modes this - * parameter is ignored. - * @param array $options Options, depending on the mode, @see PEAR::setErrorHandling - * @param string $userinfo Extra debug information. Defaults to the last - * query and native error code. - * - * @return object a PEAR error object - * @access public - * @see PEAR_Error - */ - static function &raiseError($code = null, $mode = null, $options = null, $userinfo = null, $dummy1 = null, $dummy2 = null, $dummy3 = false) - { - $err = PEAR::raiseError(null, $code, $mode, $options, - $userinfo, 'MDB2_Schema_Error', true); - return $err; - } - - // }}} - // {{{ isError() - - /** - * Tell whether a value is an MDB2_Schema error. - * - * @param mixed $data the value to test - * @param int $code if $data is an error object, return true only if $code is - * a string and $db->getMessage() == $code or - * $code is an integer and $db->getCode() == $code - * - * @return bool true if parameter is an error - * @access public - */ - static function isError($data, $code = null) - { - if (is_a($data, 'MDB2_Schema_Error')) { - if (is_null($code)) { - return true; - } elseif (is_string($code)) { - return $data->getMessage() === $code; - } else { - $code = (array)$code; - return in_array($data->getCode(), $code); - } - } - return false; - } - - // }}} -} - -/** - * MDB2_Schema_Error implements a class for reporting portable database error - * messages. - * - * @category Database - * @package MDB2_Schema - * @author Stig Bakken - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Error extends PEAR_Error -{ - /** - * MDB2_Schema_Error constructor. - * - * @param mixed $code error code, or string with error message. - * @param int $mode what 'error mode' to operate in - * @param int $level what error level to use for $mode & PEAR_ERROR_TRIGGER - * @param mixed $debuginfo additional debug info, such as the last query - * - * @access public - */ - function MDB2_Schema_Error($code = MDB2_SCHEMA_ERROR, $mode = PEAR_ERROR_RETURN, - $level = E_USER_NOTICE, $debuginfo = null) - { - $this->PEAR_Error('MDB2_Schema Error: ' . MDB2_Schema::errorMessage($code), $code, - $mode, $level, $debuginfo); - } -} diff --git a/3rdparty/MDB2/Schema/Parser.php b/3rdparty/MDB2/Schema/Parser.php deleted file mode 100644 index 3c4345661b..0000000000 --- a/3rdparty/MDB2/Schema/Parser.php +++ /dev/null @@ -1,876 +0,0 @@ - - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -require_once 'XML/Parser.php'; -require_once 'MDB2/Schema/Validate.php'; - -/** - * Parses an XML schema file - * - * @category Database - * @package MDB2_Schema - * @author Christian Dickmann - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Parser extends XML_Parser -{ - var $database_definition = array(); - - var $elements = array(); - - var $element = ''; - - var $count = 0; - - var $table = array(); - - var $table_name = ''; - - var $field = array(); - - var $field_name = ''; - - var $init = array(); - - var $init_function = array(); - - var $init_expression = array(); - - var $init_field = array(); - - var $index = array(); - - var $index_name = ''; - - var $constraint = array(); - - var $constraint_name = ''; - - var $var_mode = false; - - var $variables = array(); - - var $sequence = array(); - - var $sequence_name = ''; - - var $error; - - var $structure = false; - - var $val; - - /** - * PHP 5 constructor - * - * @param array $variables mixed array with user defined schema - * variables - * @param bool $fail_on_invalid_names array with reserved words per RDBMS - * @param array $structure multi dimensional array with - * database schema and data - * @param array $valid_types information of all valid fields - * types - * @param bool $force_defaults if true sets a default value to - * field when not explicit - * @param int $max_identifiers_length maximum allowed size for entities - * name - * - * @return void - * - * @access public - * @static - */ - function __construct($variables, $fail_on_invalid_names = true, - $structure = false, $valid_types = array(), $force_defaults = true, - $max_identifiers_length = null - ) { - // force ISO-8859-1 due to different defaults for PHP4 and PHP5 - // todo: this probably needs to be investigated some more andcleaned up - parent::__construct('ISO-8859-1'); - - $this->variables = $variables; - $this->structure = $structure; - $this->val = new MDB2_Schema_Validate( - $fail_on_invalid_names, - $valid_types, - $force_defaults, - $max_identifiers_length - ); - } - - /** - * Triggered when reading a XML open tag - * - * @param resource $xp xml parser resource - * @param string $element element name - * @param array $attribs attributes - * - * @return void - * @access private - * @static - */ - function startHandler($xp, $element, &$attribs) - { - if (strtolower($element) == 'variable') { - $this->var_mode = true; - return; - } - - $this->elements[$this->count++] = strtolower($element); - - $this->element = implode('-', $this->elements); - - switch ($this->element) { - /* Initialization */ - case 'database-table-initialization': - $this->table['initialization'] = array(); - break; - - /* Insert */ - /* insert: field+ */ - case 'database-table-initialization-insert': - $this->init = array('type' => 'insert', 'data' => array('field' => array())); - break; - /* insert-select: field+, table, where? */ - case 'database-table-initialization-insert-select': - $this->init['data']['table'] = ''; - break; - - /* Update */ - /* update: field+, where? */ - case 'database-table-initialization-update': - $this->init = array('type' => 'update', 'data' => array('field' => array())); - break; - - /* Delete */ - /* delete: where */ - case 'database-table-initialization-delete': - $this->init = array('type' => 'delete', 'data' => array('where' => array())); - break; - - /* Insert and Update */ - case 'database-table-initialization-insert-field': - case 'database-table-initialization-insert-select-field': - case 'database-table-initialization-update-field': - $this->init_field = array('name' => '', 'group' => array()); - break; - case 'database-table-initialization-insert-field-value': - case 'database-table-initialization-insert-select-field-value': - case 'database-table-initialization-update-field-value': - /* if value tag is empty cdataHandler is not called so we must force value element creation here */ - $this->init_field['group'] = array('type' => 'value', 'data' => ''); - break; - case 'database-table-initialization-insert-field-null': - case 'database-table-initialization-insert-select-field-null': - case 'database-table-initialization-update-field-null': - $this->init_field['group'] = array('type' => 'null'); - break; - case 'database-table-initialization-insert-field-function': - case 'database-table-initialization-insert-select-field-function': - case 'database-table-initialization-update-field-function': - $this->init_function = array('name' => ''); - break; - case 'database-table-initialization-insert-field-expression': - case 'database-table-initialization-insert-select-field-expression': - case 'database-table-initialization-update-field-expression': - $this->init_expression = array(); - break; - - /* All */ - case 'database-table-initialization-insert-select-where': - case 'database-table-initialization-update-where': - case 'database-table-initialization-delete-where': - $this->init['data']['where'] = array('type' => '', 'data' => array()); - break; - case 'database-table-initialization-insert-select-where-expression': - case 'database-table-initialization-update-where-expression': - case 'database-table-initialization-delete-where-expression': - $this->init_expression = array(); - break; - - /* One level simulation of expression-function recursion */ - case 'database-table-initialization-insert-field-expression-function': - case 'database-table-initialization-insert-select-field-expression-function': - case 'database-table-initialization-insert-select-where-expression-function': - case 'database-table-initialization-update-field-expression-function': - case 'database-table-initialization-update-where-expression-function': - case 'database-table-initialization-delete-where-expression-function': - $this->init_function = array('name' => ''); - break; - - /* One level simulation of function-expression recursion */ - case 'database-table-initialization-insert-field-function-expression': - case 'database-table-initialization-insert-select-field-function-expression': - case 'database-table-initialization-insert-select-where-function-expression': - case 'database-table-initialization-update-field-function-expression': - case 'database-table-initialization-update-where-function-expression': - case 'database-table-initialization-delete-where-function-expression': - $this->init_expression = array(); - break; - - /* Definition */ - case 'database': - $this->database_definition = array( - 'name' => '', - 'create' => '', - 'overwrite' => '', - 'charset' => '', - 'description' => '', - 'comments' => '', - 'tables' => array(), - 'sequences' => array() - ); - break; - case 'database-table': - $this->table_name = ''; - - $this->table = array( - 'was' => '', - 'description' => '', - 'comments' => '', - 'fields' => array(), - 'indexes' => array(), - 'constraints' => array(), - 'initialization' => array() - ); - break; - case 'database-table-declaration-field': - case 'database-table-declaration-foreign-field': - case 'database-table-declaration-foreign-references-field': - $this->field_name = ''; - - $this->field = array(); - break; - case 'database-table-declaration-index-field': - $this->field_name = ''; - - $this->field = array('sorting' => '', 'length' => ''); - break; - /* force field attributes to be initialized when the tag is empty in the XML */ - case 'database-table-declaration-field-was': - $this->field['was'] = ''; - break; - case 'database-table-declaration-field-type': - $this->field['type'] = ''; - break; - case 'database-table-declaration-field-fixed': - $this->field['fixed'] = ''; - break; - case 'database-table-declaration-field-default': - $this->field['default'] = ''; - break; - case 'database-table-declaration-field-notnull': - $this->field['notnull'] = ''; - break; - case 'database-table-declaration-field-autoincrement': - $this->field['autoincrement'] = ''; - break; - case 'database-table-declaration-field-unsigned': - $this->field['unsigned'] = ''; - break; - case 'database-table-declaration-field-length': - $this->field['length'] = ''; - break; - case 'database-table-declaration-field-description': - $this->field['description'] = ''; - break; - case 'database-table-declaration-field-comments': - $this->field['comments'] = ''; - break; - case 'database-table-declaration-index': - $this->index_name = ''; - - $this->index = array( - 'was' => '', - 'unique' =>'', - 'primary' => '', - 'fields' => array() - ); - break; - case 'database-table-declaration-foreign': - $this->constraint_name = ''; - - $this->constraint = array( - 'was' => '', - 'match' => '', - 'ondelete' => '', - 'onupdate' => '', - 'deferrable' => '', - 'initiallydeferred' => '', - 'foreign' => true, - 'fields' => array(), - 'references' => array('table' => '', 'fields' => array()) - ); - break; - case 'database-sequence': - $this->sequence_name = ''; - - $this->sequence = array( - 'was' => '', - 'start' => '', - 'description' => '', - 'comments' => '', - ); - break; - } - } - - /** - * Triggered when reading a XML close tag - * - * @param resource $xp xml parser resource - * @param string $element element name - * - * @return void - * @access private - * @static - */ - function endHandler($xp, $element) - { - if (strtolower($element) == 'variable') { - $this->var_mode = false; - return; - } - - switch ($this->element) { - /* Initialization */ - - /* Insert */ - case 'database-table-initialization-insert-select': - $this->init['data'] = array('select' => $this->init['data']); - break; - - /* Insert and Delete */ - case 'database-table-initialization-insert-field': - case 'database-table-initialization-insert-select-field': - case 'database-table-initialization-update-field': - $result = $this->val->validateDataField($this->table['fields'], $this->init['data']['field'], $this->init_field); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->init['data']['field'][] = $this->init_field; - } - break; - case 'database-table-initialization-insert-field-function': - case 'database-table-initialization-insert-select-field-function': - case 'database-table-initialization-update-field-function': - $this->init_field['group'] = array('type' => 'function', 'data' => $this->init_function); - break; - case 'database-table-initialization-insert-field-expression': - case 'database-table-initialization-insert-select-field-expression': - case 'database-table-initialization-update-field-expression': - $this->init_field['group'] = array('type' => 'expression', 'data' => $this->init_expression); - break; - - /* All */ - case 'database-table-initialization-insert-select-where-expression': - case 'database-table-initialization-update-where-expression': - case 'database-table-initialization-delete-where-expression': - $this->init['data']['where']['type'] = 'expression'; - $this->init['data']['where']['data'] = $this->init_expression; - break; - case 'database-table-initialization-insert': - case 'database-table-initialization-delete': - case 'database-table-initialization-update': - $this->table['initialization'][] = $this->init; - break; - - /* One level simulation of expression-function recursion */ - case 'database-table-initialization-insert-field-expression-function': - case 'database-table-initialization-insert-select-field-expression-function': - case 'database-table-initialization-insert-select-where-expression-function': - case 'database-table-initialization-update-field-expression-function': - case 'database-table-initialization-update-where-expression-function': - case 'database-table-initialization-delete-where-expression-function': - $this->init_expression['operants'][] = array('type' => 'function', 'data' => $this->init_function); - break; - - /* One level simulation of function-expression recursion */ - case 'database-table-initialization-insert-field-function-expression': - case 'database-table-initialization-insert-select-field-function-expression': - case 'database-table-initialization-insert-select-where-function-expression': - case 'database-table-initialization-update-field-function-expression': - case 'database-table-initialization-update-where-function-expression': - case 'database-table-initialization-delete-where-function-expression': - $this->init_function['arguments'][] = array('type' => 'expression', 'data' => $this->init_expression); - break; - - /* Table definition */ - case 'database-table': - $result = $this->val->validateTable($this->database_definition['tables'], $this->table, $this->table_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->database_definition['tables'][$this->table_name] = $this->table; - } - break; - case 'database-table-name': - if (isset($this->structure['tables'][$this->table_name])) { - $this->table = $this->structure['tables'][$this->table_name]; - } - break; - - /* Field declaration */ - case 'database-table-declaration-field': - $result = $this->val->validateField($this->table['fields'], $this->field, $this->field_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->table['fields'][$this->field_name] = $this->field; - } - break; - - /* Index declaration */ - case 'database-table-declaration-index': - $result = $this->val->validateIndex($this->table['indexes'], $this->index, $this->index_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->table['indexes'][$this->index_name] = $this->index; - } - break; - case 'database-table-declaration-index-field': - $result = $this->val->validateIndexField($this->index['fields'], $this->field, $this->field_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->index['fields'][$this->field_name] = $this->field; - } - break; - - /* Foreign Key declaration */ - case 'database-table-declaration-foreign': - $result = $this->val->validateConstraint($this->table['constraints'], $this->constraint, $this->constraint_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->table['constraints'][$this->constraint_name] = $this->constraint; - } - break; - case 'database-table-declaration-foreign-field': - $result = $this->val->validateConstraintField($this->constraint['fields'], $this->field_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->constraint['fields'][$this->field_name] = ''; - } - break; - case 'database-table-declaration-foreign-references-field': - $result = $this->val->validateConstraintReferencedField($this->constraint['references']['fields'], $this->field_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->constraint['references']['fields'][$this->field_name] = ''; - } - break; - - /* Sequence declaration */ - case 'database-sequence': - $result = $this->val->validateSequence($this->database_definition['sequences'], $this->sequence, $this->sequence_name); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } else { - $this->database_definition['sequences'][$this->sequence_name] = $this->sequence; - } - break; - - /* End of File */ - case 'database': - $result = $this->val->validateDatabase($this->database_definition); - if (PEAR::isError($result)) { - $this->raiseError($result->getUserinfo(), 0, $xp, $result->getCode()); - } - break; - } - - unset($this->elements[--$this->count]); - $this->element = implode('-', $this->elements); - } - - /** - * Pushes a MDB2_Schema_Error into stack and returns it - * - * @param string $msg textual message - * @param int $xmlecode PHP's XML parser error code - * @param resource $xp xml parser resource - * @param int $ecode MDB2_Schema's error code - * - * @return object - * @access private - * @static - */ - static function &raiseError($msg = null, $xmlecode = 0, $xp = null, $ecode = MDB2_SCHEMA_ERROR_PARSE, $userinfo = null, - $error_class = null, - $skipmsg = false) - { - if (is_null($this->error)) { - $error = ''; - if (is_resource($msg)) { - $error .= 'Parser error: '.xml_error_string(xml_get_error_code($msg)); - $xp = $msg; - } else { - $error .= 'Parser error: '.$msg; - if (!is_resource($xp)) { - $xp = $this->parser; - } - } - - if ($error_string = xml_error_string($xmlecode)) { - $error .= ' - '.$error_string; - } - - if (is_resource($xp)) { - $byte = @xml_get_current_byte_index($xp); - $line = @xml_get_current_line_number($xp); - $column = @xml_get_current_column_number($xp); - $error .= " - Byte: $byte; Line: $line; Col: $column"; - } - - $error .= "\n"; - - $this->error = MDB2_Schema::raiseError($ecode, null, null, $error); - } - return $this->error; - } - - /** - * Triggered when reading data in a XML element (text between tags) - * - * @param resource $xp xml parser resource - * @param string $data text - * - * @return void - * @access private - * @static - */ - function cdataHandler($xp, $data) - { - if ($this->var_mode == true) { - if (!isset($this->variables[$data])) { - $this->raiseError('variable "'.$data.'" not found', null, $xp); - return; - } - $data = $this->variables[$data]; - } - - switch ($this->element) { - /* Initialization */ - - /* Insert */ - case 'database-table-initialization-insert-select-table': - $this->init['data']['table'] = $data; - break; - - /* Insert and Update */ - case 'database-table-initialization-insert-field-name': - case 'database-table-initialization-insert-select-field-name': - case 'database-table-initialization-update-field-name': - $this->init_field['name'] .= $data; - break; - case 'database-table-initialization-insert-field-value': - case 'database-table-initialization-insert-select-field-value': - case 'database-table-initialization-update-field-value': - $this->init_field['group']['data'] .= $data; - break; - case 'database-table-initialization-insert-field-function-name': - case 'database-table-initialization-insert-select-field-function-name': - case 'database-table-initialization-update-field-function-name': - $this->init_function['name'] .= $data; - break; - case 'database-table-initialization-insert-field-function-value': - case 'database-table-initialization-insert-select-field-function-value': - case 'database-table-initialization-update-field-function-value': - $this->init_function['arguments'][] = array('type' => 'value', 'data' => $data); - break; - case 'database-table-initialization-insert-field-function-column': - case 'database-table-initialization-insert-select-field-function-column': - case 'database-table-initialization-update-field-function-column': - $this->init_function['arguments'][] = array('type' => 'column', 'data' => $data); - break; - case 'database-table-initialization-insert-field-column': - case 'database-table-initialization-insert-select-field-column': - case 'database-table-initialization-update-field-column': - $this->init_field['group'] = array('type' => 'column', 'data' => $data); - break; - - /* All */ - case 'database-table-initialization-insert-field-expression-operator': - case 'database-table-initialization-insert-select-field-expression-operator': - case 'database-table-initialization-insert-select-where-expression-operator': - case 'database-table-initialization-update-field-expression-operator': - case 'database-table-initialization-update-where-expression-operator': - case 'database-table-initialization-delete-where-expression-operator': - $this->init_expression['operator'] = $data; - break; - case 'database-table-initialization-insert-field-expression-value': - case 'database-table-initialization-insert-select-field-expression-value': - case 'database-table-initialization-insert-select-where-expression-value': - case 'database-table-initialization-update-field-expression-value': - case 'database-table-initialization-update-where-expression-value': - case 'database-table-initialization-delete-where-expression-value': - $this->init_expression['operants'][] = array('type' => 'value', 'data' => $data); - break; - case 'database-table-initialization-insert-field-expression-column': - case 'database-table-initialization-insert-select-field-expression-column': - case 'database-table-initialization-insert-select-where-expression-column': - case 'database-table-initialization-update-field-expression-column': - case 'database-table-initialization-update-where-expression-column': - case 'database-table-initialization-delete-where-expression-column': - $this->init_expression['operants'][] = array('type' => 'column', 'data' => $data); - break; - - case 'database-table-initialization-insert-field-function-function': - case 'database-table-initialization-insert-field-function-expression': - case 'database-table-initialization-insert-field-expression-expression': - case 'database-table-initialization-update-field-function-function': - case 'database-table-initialization-update-field-function-expression': - case 'database-table-initialization-update-field-expression-expression': - case 'database-table-initialization-update-where-expression-expression': - case 'database-table-initialization-delete-where-expression-expression': - /* Recursion to be implemented yet */ - break; - - /* One level simulation of expression-function recursion */ - case 'database-table-initialization-insert-field-expression-function-name': - case 'database-table-initialization-insert-select-field-expression-function-name': - case 'database-table-initialization-insert-select-where-expression-function-name': - case 'database-table-initialization-update-field-expression-function-name': - case 'database-table-initialization-update-where-expression-function-name': - case 'database-table-initialization-delete-where-expression-function-name': - $this->init_function['name'] .= $data; - break; - case 'database-table-initialization-insert-field-expression-function-value': - case 'database-table-initialization-insert-select-field-expression-function-value': - case 'database-table-initialization-insert-select-where-expression-function-value': - case 'database-table-initialization-update-field-expression-function-value': - case 'database-table-initialization-update-where-expression-function-value': - case 'database-table-initialization-delete-where-expression-function-value': - $this->init_function['arguments'][] = array('type' => 'value', 'data' => $data); - break; - case 'database-table-initialization-insert-field-expression-function-column': - case 'database-table-initialization-insert-select-field-expression-function-column': - case 'database-table-initialization-insert-select-where-expression-function-column': - case 'database-table-initialization-update-field-expression-function-column': - case 'database-table-initialization-update-where-expression-function-column': - case 'database-table-initialization-delete-where-expression-function-column': - $this->init_function['arguments'][] = array('type' => 'column', 'data' => $data); - break; - - /* One level simulation of function-expression recursion */ - case 'database-table-initialization-insert-field-function-expression-operator': - case 'database-table-initialization-insert-select-field-function-expression-operator': - case 'database-table-initialization-update-field-function-expression-operator': - $this->init_expression['operator'] = $data; - break; - case 'database-table-initialization-insert-field-function-expression-value': - case 'database-table-initialization-insert-select-field-function-expression-value': - case 'database-table-initialization-update-field-function-expression-value': - $this->init_expression['operants'][] = array('type' => 'value', 'data' => $data); - break; - case 'database-table-initialization-insert-field-function-expression-column': - case 'database-table-initialization-insert-select-field-function-expression-column': - case 'database-table-initialization-update-field-function-expression-column': - $this->init_expression['operants'][] = array('type' => 'column', 'data' => $data); - break; - - /* Database */ - case 'database-name': - $this->database_definition['name'] .= $data; - break; - case 'database-create': - $this->database_definition['create'] .= $data; - break; - case 'database-overwrite': - $this->database_definition['overwrite'] .= $data; - break; - case 'database-charset': - $this->database_definition['charset'] .= $data; - break; - case 'database-description': - $this->database_definition['description'] .= $data; - break; - case 'database-comments': - $this->database_definition['comments'] .= $data; - break; - - /* Table declaration */ - case 'database-table-name': - $this->table_name .= $data; - break; - case 'database-table-was': - $this->table['was'] .= $data; - break; - case 'database-table-description': - $this->table['description'] .= $data; - break; - case 'database-table-comments': - $this->table['comments'] .= $data; - break; - - /* Field declaration */ - case 'database-table-declaration-field-name': - $this->field_name .= $data; - break; - case 'database-table-declaration-field-was': - $this->field['was'] .= $data; - break; - case 'database-table-declaration-field-type': - $this->field['type'] .= $data; - break; - case 'database-table-declaration-field-fixed': - $this->field['fixed'] .= $data; - break; - case 'database-table-declaration-field-default': - $this->field['default'] .= $data; - break; - case 'database-table-declaration-field-notnull': - $this->field['notnull'] .= $data; - break; - case 'database-table-declaration-field-autoincrement': - $this->field['autoincrement'] .= $data; - break; - case 'database-table-declaration-field-unsigned': - $this->field['unsigned'] .= $data; - break; - case 'database-table-declaration-field-length': - $this->field['length'] .= $data; - break; - case 'database-table-declaration-field-description': - $this->field['description'] .= $data; - break; - case 'database-table-declaration-field-comments': - $this->field['comments'] .= $data; - break; - - /* Index declaration */ - case 'database-table-declaration-index-name': - $this->index_name .= $data; - break; - case 'database-table-declaration-index-was': - $this->index['was'] .= $data; - break; - case 'database-table-declaration-index-unique': - $this->index['unique'] .= $data; - break; - case 'database-table-declaration-index-primary': - $this->index['primary'] .= $data; - break; - case 'database-table-declaration-index-field-name': - $this->field_name .= $data; - break; - case 'database-table-declaration-index-field-sorting': - $this->field['sorting'] .= $data; - break; - /* Add by Leoncx */ - case 'database-table-declaration-index-field-length': - $this->field['length'] .= $data; - break; - - /* Foreign Key declaration */ - case 'database-table-declaration-foreign-name': - $this->constraint_name .= $data; - break; - case 'database-table-declaration-foreign-was': - $this->constraint['was'] .= $data; - break; - case 'database-table-declaration-foreign-match': - $this->constraint['match'] .= $data; - break; - case 'database-table-declaration-foreign-ondelete': - $this->constraint['ondelete'] .= $data; - break; - case 'database-table-declaration-foreign-onupdate': - $this->constraint['onupdate'] .= $data; - break; - case 'database-table-declaration-foreign-deferrable': - $this->constraint['deferrable'] .= $data; - break; - case 'database-table-declaration-foreign-initiallydeferred': - $this->constraint['initiallydeferred'] .= $data; - break; - case 'database-table-declaration-foreign-field': - $this->field_name .= $data; - break; - case 'database-table-declaration-foreign-references-table': - $this->constraint['references']['table'] .= $data; - break; - case 'database-table-declaration-foreign-references-field': - $this->field_name .= $data; - break; - - /* Sequence declaration */ - case 'database-sequence-name': - $this->sequence_name .= $data; - break; - case 'database-sequence-was': - $this->sequence['was'] .= $data; - break; - case 'database-sequence-start': - $this->sequence['start'] .= $data; - break; - case 'database-sequence-description': - $this->sequence['description'] .= $data; - break; - case 'database-sequence-comments': - $this->sequence['comments'] .= $data; - break; - case 'database-sequence-on': - $this->sequence['on'] = array('table' => '', 'field' => ''); - break; - case 'database-sequence-on-table': - $this->sequence['on']['table'] .= $data; - break; - case 'database-sequence-on-field': - $this->sequence['on']['field'] .= $data; - break; - } - } -} diff --git a/3rdparty/MDB2/Schema/Parser2.php b/3rdparty/MDB2/Schema/Parser2.php deleted file mode 100644 index f27dffbabf..0000000000 --- a/3rdparty/MDB2/Schema/Parser2.php +++ /dev/null @@ -1,802 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -require_once 'XML/Unserializer.php'; -require_once 'MDB2/Schema/Validate.php'; - -/** - * Parses an XML schema file - * - * @category Database - * @package MDB2_Schema - * @author Lukas Smith - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Parser2 extends XML_Unserializer -{ - var $database_definition = array(); - - var $database_loaded = array(); - - var $variables = array(); - - var $error; - - var $structure = false; - - var $val; - - var $options = array(); - - var $table = array(); - - var $table_name = ''; - - var $field = array(); - - var $field_name = ''; - - var $index = array(); - - var $index_name = ''; - - var $constraint = array(); - - var $constraint_name = ''; - - var $sequence = array(); - - var $sequence_name = ''; - - var $init = array(); - - /** - * PHP 5 constructor - * - * @param array $variables mixed array with user defined schema - * variables - * @param bool $fail_on_invalid_names array with reserved words per RDBMS - * @param array $structure multi dimensional array with - * database schema and data - * @param array $valid_types information of all valid fields - * types - * @param bool $force_defaults if true sets a default value to - * field when not explicit - * @param int $max_identifiers_length maximum allowed size for entities - * name - * - * @return void - * - * @access public - * @static - */ - function __construct($variables, $fail_on_invalid_names = true, - $structure = false, $valid_types = array(), $force_defaults = true, - $max_identifiers_length = null - ) { - // force ISO-8859-1 due to different defaults for PHP4 and PHP5 - // todo: this probably needs to be investigated some more and cleaned up - $this->options['encoding'] = 'ISO-8859-1'; - - $this->options['XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE'] = true; - $this->options['XML_UNSERIALIZER_OPTION_ATTRIBUTES_ARRAYKEY'] = false; - - $this->options['forceEnum'] = array('table', 'field', 'index', 'foreign', 'insert', 'update', 'delete', 'sequence'); - - /* - * todo: find a way to force the following items not to be parsed as arrays - * as it cause problems in functions with multiple arguments - */ - //$this->options['forceNEnum'] = array('value', 'column'); - $this->variables = $variables; - $this->structure = $structure; - - $this->val = new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults); - parent::XML_Unserializer($this->options); - } - - /** - * Main method. Parses XML Schema File. - * - * @return bool|error object - * - * @access public - */ - function parse() - { - $result = $this->unserialize($this->filename, true); - - if (PEAR::isError($result)) { - return $result; - } else { - $this->database_loaded = $this->getUnserializedData(); - return $this->fixDatabaseKeys($this->database_loaded); - } - } - - /** - * Do the necessary stuff to set the input XML schema file - * - * @param string $filename full path to schema file - * - * @return boolean MDB2_OK on success - * - * @access public - */ - function setInputFile($filename) - { - $this->filename = $filename; - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at database level. - * - * @param array $database multi dimensional array with database definition - * and data. - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixDatabaseKeys($database) - { - $this->database_definition = array( - 'name' => '', - 'create' => '', - 'overwrite' => '', - 'charset' => '', - 'description' => '', - 'comments' => '', - 'tables' => array(), - 'sequences' => array() - ); - - if (!empty($database['name'])) { - $this->database_definition['name'] = $database['name']; - } - if (!empty($database['create'])) { - $this->database_definition['create'] = $database['create']; - } - if (!empty($database['overwrite'])) { - $this->database_definition['overwrite'] = $database['overwrite']; - } - if (!empty($database['charset'])) { - $this->database_definition['charset'] = $database['charset']; - } - if (!empty($database['description'])) { - $this->database_definition['description'] = $database['description']; - } - if (!empty($database['comments'])) { - $this->database_definition['comments'] = $database['comments']; - } - - if (!empty($database['table']) && is_array($database['table'])) { - foreach ($database['table'] as $table) { - $this->fixTableKeys($table); - } - } - - if (!empty($database['sequence']) && is_array($database['sequence'])) { - foreach ($database['sequence'] as $sequence) { - $this->fixSequenceKeys($sequence); - } - } - - $result = $this->val->validateDatabase($this->database_definition); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } - - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at table level. - * - * @param array $table multi dimensional array with table definition - * and data. - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableKeys($table) - { - $this->table = array( - 'was' => '', - 'description' => '', - 'comments' => '', - 'fields' => array(), - 'indexes' => array(), - 'constraints' => array(), - 'initialization' => array() - ); - - if (!empty($table['name'])) { - $this->table_name = $table['name']; - } else { - $this->table_name = ''; - } - if (!empty($table['was'])) { - $this->table['was'] = $table['was']; - } - if (!empty($table['description'])) { - $this->table['description'] = $table['description']; - } - if (!empty($table['comments'])) { - $this->table['comments'] = $table['comments']; - } - - if (!empty($table['declaration']) && is_array($table['declaration'])) { - if (!empty($table['declaration']['field']) && is_array($table['declaration']['field'])) { - foreach ($table['declaration']['field'] as $field) { - $this->fixTableFieldKeys($field); - } - } - - if (!empty($table['declaration']['index']) && is_array($table['declaration']['index'])) { - foreach ($table['declaration']['index'] as $index) { - $this->fixTableIndexKeys($index); - } - } - - if (!empty($table['declaration']['foreign']) && is_array($table['declaration']['foreign'])) { - foreach ($table['declaration']['foreign'] as $constraint) { - $this->fixTableConstraintKeys($constraint); - } - } - } - - if (!empty($table['initialization']) && is_array($table['initialization'])) { - if (!empty($table['initialization']['insert']) && is_array($table['initialization']['insert'])) { - foreach ($table['initialization']['insert'] as $init) { - $this->fixTableInitializationKeys($init, 'insert'); - } - } - if (!empty($table['initialization']['update']) && is_array($table['initialization']['update'])) { - foreach ($table['initialization']['update'] as $init) { - $this->fixTableInitializationKeys($init, 'update'); - } - } - if (!empty($table['initialization']['delete']) && is_array($table['initialization']['delete'])) { - foreach ($table['initialization']['delete'] as $init) { - $this->fixTableInitializationKeys($init, 'delete'); - } - } - } - - $result = $this->val->validateTable($this->database_definition['tables'], $this->table, $this->table_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } else { - $this->database_definition['tables'][$this->table_name] = $this->table; - } - - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at table field level. - * - * @param array $field array with table field definition - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableFieldKeys($field) - { - $this->field = array(); - if (!empty($field['name'])) { - $this->field_name = $field['name']; - } else { - $this->field_name = ''; - } - if (!empty($field['was'])) { - $this->field['was'] = $field['was']; - } - if (!empty($field['type'])) { - $this->field['type'] = $field['type']; - } - if (!empty($field['fixed'])) { - $this->field['fixed'] = $field['fixed']; - } - if (isset($field['default'])) { - $this->field['default'] = $field['default']; - } - if (!empty($field['notnull'])) { - $this->field['notnull'] = $field['notnull']; - } - if (!empty($field['autoincrement'])) { - $this->field['autoincrement'] = $field['autoincrement']; - } - if (!empty($field['unsigned'])) { - $this->field['unsigned'] = $field['unsigned']; - } - if (!empty($field['length'])) { - $this->field['length'] = $field['length']; - } - if (!empty($field['description'])) { - $this->field['description'] = $field['description']; - } - if (!empty($field['comments'])) { - $this->field['comments'] = $field['comments']; - } - - $result = $this->val->validateField($this->table['fields'], $this->field, $this->field_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } else { - $this->table['fields'][$this->field_name] = $this->field; - } - - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at table index level. - * - * @param array $index array with table index definition - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableIndexKeys($index) - { - $this->index = array( - 'was' => '', - 'unique' =>'', - 'primary' => '', - 'fields' => array() - ); - - if (!empty($index['name'])) { - $this->index_name = $index['name']; - } else { - $this->index_name = ''; - } - if (!empty($index['was'])) { - $this->index['was'] = $index['was']; - } - if (!empty($index['unique'])) { - $this->index['unique'] = $index['unique']; - } - if (!empty($index['primary'])) { - $this->index['primary'] = $index['primary']; - } - if (!empty($index['field'])) { - foreach ($index['field'] as $field) { - if (!empty($field['name'])) { - $this->field_name = $field['name']; - } else { - $this->field_name = ''; - } - $this->field = array( - 'sorting' => '', - 'length' => '' - ); - - if (!empty($field['sorting'])) { - $this->field['sorting'] = $field['sorting']; - } - if (!empty($field['length'])) { - $this->field['length'] = $field['length']; - } - - $result = $this->val->validateIndexField($this->index['fields'], $this->field, $this->field_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } - - $this->index['fields'][$this->field_name] = $this->field; - } - } - - $result = $this->val->validateIndex($this->table['indexes'], $this->index, $this->index_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } else { - $this->table['indexes'][$this->index_name] = $this->index; - } - - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at table constraint level. - * - * @param array $constraint array with table index definition - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableConstraintKeys($constraint) - { - $this->constraint = array( - 'was' => '', - 'match' => '', - 'ondelete' => '', - 'onupdate' => '', - 'deferrable' => '', - 'initiallydeferred' => '', - 'foreign' => true, - 'fields' => array(), - 'references' => array('table' => '', 'fields' => array()) - ); - - if (!empty($constraint['name'])) { - $this->constraint_name = $constraint['name']; - } else { - $this->constraint_name = ''; - } - if (!empty($constraint['was'])) { - $this->constraint['was'] = $constraint['was']; - } - if (!empty($constraint['match'])) { - $this->constraint['match'] = $constraint['match']; - } - if (!empty($constraint['ondelete'])) { - $this->constraint['ondelete'] = $constraint['ondelete']; - } - if (!empty($constraint['onupdate'])) { - $this->constraint['onupdate'] = $constraint['onupdate']; - } - if (!empty($constraint['deferrable'])) { - $this->constraint['deferrable'] = $constraint['deferrable']; - } - if (!empty($constraint['initiallydeferred'])) { - $this->constraint['initiallydeferred'] = $constraint['initiallydeferred']; - } - if (!empty($constraint['field']) && is_array($constraint['field'])) { - foreach ($constraint['field'] as $field) { - $result = $this->val->validateConstraintField($this->constraint['fields'], $field); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } - - $this->constraint['fields'][$field] = ''; - } - } - - if (!empty($constraint['references']) && is_array($constraint['references'])) { - /** - * As we forced 'table' to be enumerated - * we have to fix it on the foreign-references-table context - */ - if (!empty($constraint['references']['table']) && is_array($constraint['references']['table'])) { - $this->constraint['references']['table'] = $constraint['references']['table'][0]; - } - - if (!empty($constraint['references']['field']) && is_array($constraint['references']['field'])) { - foreach ($constraint['references']['field'] as $field) { - $result = $this->val->validateConstraintReferencedField($this->constraint['references']['fields'], $field); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } - - $this->constraint['references']['fields'][$field] = ''; - } - } - } - - $result = $this->val->validateConstraint($this->table['constraints'], $this->constraint, $this->constraint_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } else { - $this->table['constraints'][$this->constraint_name] = $this->constraint; - } - - return MDB2_OK; - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at table data level. - * - * @param array $element multi dimensional array with query definition - * @param string $type whether its a insert|update|delete query - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableInitializationKeys($element, $type = '') - { - if (!empty($element['select']) && is_array($element['select'])) { - $this->fixTableInitializationDataKeys($element['select']); - $this->init = array( 'select' => $this->init ); - } else { - $this->fixTableInitializationDataKeys($element); - } - - $this->table['initialization'][] = array( 'type' => $type, 'data' => $this->init ); - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works deeper at the table initialization level (data). At this - * point we are look at one of the below: - * - * - * {field}+ - * - * - * - * - * - * {field}+ - * - * {expression} - * ? - * - * - * - * - * {expression} - * - * - * - * @param array $element multi dimensional array with query definition - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixTableInitializationDataKeys($element) - { - $this->init = array(); - if (!empty($element['field']) && is_array($element['field'])) { - foreach ($element['field'] as $field) { - $name = $field['name']; - unset($field['name']); - - $this->setExpression($field); - $this->init['field'][] = array( 'name' => $name, 'group' => $field ); - } - } - /** - * As we forced 'table' to be enumerated - * we have to fix it on the insert-select context - */ - if (!empty($element['table']) && is_array($element['table'])) { - $this->init['table'] = $element['table'][0]; - } - if (!empty($element['where']) && is_array($element['where'])) { - $this->init['where'] = $element['where']; - $this->setExpression($this->init['where']); - } - } - - /** - * Recursively diggs into an "expression" element. According to our - * documentation an "expression" element is of the kind: - * - * - * or or or {function} or {expression} - * - * or or or {function} or {expression} - * - * - * @param array &$arr reference to current element definition - * - * @return void - * - * @access private - */ - function setExpression(&$arr) - { - $element = each($arr); - - $arr = array( 'type' => $element['key'] ); - - $element = $element['value']; - - switch ($arr['type']) { - case 'null': - break; - case 'value': - case 'column': - $arr['data'] = $element; - break; - case 'function': - if (!empty($element) - && is_array($element) - ) { - $arr['data'] = array( 'name' => $element['name'] ); - unset($element['name']); - - foreach ($element as $type => $value) { - if (!empty($value)) { - if (is_array($value)) { - foreach ($value as $argument) { - $argument = array( $type => $argument ); - $this->setExpression($argument); - $arr['data']['arguments'][] = $argument; - } - } else { - $arr['data']['arguments'][] = array( 'type' => $type, 'data' => $value ); - } - } - } - } - break; - case 'expression': - $arr['data'] = array( 'operants' => array(), 'operator' => $element['operator'] ); - unset($element['operator']); - - foreach ($element as $k => $v) { - $argument = array( $k => $v ); - $this->setExpression($argument); - $arr['data']['operants'][] = $argument; - } - break; - } - } - - /** - * Enforce the default values for mandatory keys and ensure everything goes - * always in the same order (simulates the behaviour of the original - * parser). Works at database sequences level. A "sequence" element looks - * like: - * - * - * - * ? - * ? - * ? - * ? - * - * - * - * ? - * - * - * @param array $sequence multi dimensional array with sequence definition - * - * @return bool|error MDB2_OK on success or error object - * - * @access private - */ - function fixSequenceKeys($sequence) - { - $this->sequence = array( - 'was' => '', - 'start' => '', - 'description' => '', - 'comments' => '', - ); - - if (!empty($sequence['name'])) { - $this->sequence_name = $sequence['name']; - } else { - $this->sequence_name = ''; - } - if (!empty($sequence['was'])) { - $this->sequence['was'] = $sequence['was']; - } - if (!empty($sequence['start'])) { - $this->sequence['start'] = $sequence['start']; - } - if (!empty($sequence['description'])) { - $this->sequence['description'] = $sequence['description']; - } - if (!empty($sequence['comments'])) { - $this->sequence['comments'] = $sequence['comments']; - } - if (!empty($sequence['on']) && is_array($sequence['on'])) { - /** - * As we forced 'table' to be enumerated - * we have to fix it on the sequence-on-table context - */ - if (!empty($sequence['on']['table']) && is_array($sequence['on']['table'])) { - $this->sequence['on']['table'] = $sequence['on']['table'][0]; - } - - /** - * As we forced 'field' to be enumerated - * we have to fix it on the sequence-on-field context - */ - if (!empty($sequence['on']['field']) && is_array($sequence['on']['field'])) { - $this->sequence['on']['field'] = $sequence['on']['field'][0]; - } - } - - $result = $this->val->validateSequence($this->database_definition['sequences'], $this->sequence, $this->sequence_name); - if (PEAR::isError($result)) { - return $this->raiseError($result->getUserinfo()); - } else { - $this->database_definition['sequences'][$this->sequence_name] = $this->sequence; - } - - return MDB2_OK; - } - - /** - * Pushes a MDB2_Schema_Error into stack and returns it - * - * @param string $msg textual message - * @param int $ecode MDB2_Schema's error code - * - * @return object - * @access private - * @static - */ - function &raiseError($msg = null, $ecode = MDB2_SCHEMA_ERROR_PARSE) - { - if (is_null($this->error)) { - $error = 'Parser error: '.$msg."\n"; - - $this->error = MDB2_Schema::raiseError($ecode, null, null, $error); - } - return $this->error; - } -} diff --git a/3rdparty/MDB2/Schema/Reserved/ibase.php b/3rdparty/MDB2/Schema/Reserved/ibase.php deleted file mode 100644 index d797822a4b..0000000000 --- a/3rdparty/MDB2/Schema/Reserved/ibase.php +++ /dev/null @@ -1,437 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ -// {{{ $GLOBALS['_MDB2_Schema_Reserved']['ibase'] -/** - * Has a list of reserved words of Interbase/Firebird - * - * @package MDB2_Schema - * @category Database - * @access protected - * @author Lorenzo Alberton - */ -$GLOBALS['_MDB2_Schema_Reserved']['ibase'] = array( - 'ABS', - 'ABSOLUTE', - 'ACTION', - 'ACTIVE', - 'ADD', - 'ADMIN', - 'AFTER', - 'ALL', - 'ALLOCATE', - 'ALTER', - 'AND', - 'ANY', - 'ARE', - 'AS', - 'ASC', - 'ASCENDING', - 'ASSERTION', - 'AT', - 'AUTHORIZATION', - 'AUTO', - 'AUTODDL', - 'AVG', - 'BACKUP', - 'BASE_NAME', - 'BASED', - 'BASENAME', - 'BEFORE', - 'BEGIN', - 'BETWEEN', - 'BIGINT', - 'BIT', - 'BIT_LENGTH', - 'BLOB', - 'BLOCK', - 'BLOBEDIT', - 'BOOLEAN', - 'BOTH', - 'BOTH', - 'BREAK', - 'BUFFER', - 'BY', - 'CACHE', - 'CASCADE', - 'CASCADED', - 'CASE', - 'CASE', - 'CAST', - 'CATALOG', - 'CHAR', - 'CHAR_LENGTH', - 'CHARACTER', - 'CHARACTER_LENGTH', - 'CHECK', - 'CHECK_POINT_LEN', - 'CHECK_POINT_LENGTH', - 'CLOSE', - 'COALESCE', - 'COLLATE', - 'COLLATION', - 'COLUMN', - 'COMMENT', - 'COMMIT', - 'COMMITTED', - 'COMPILETIME', - 'COMPUTED', - 'CONDITIONAL', - 'CONNECT', - 'CONNECTION', - 'CONSTRAINT', - 'CONSTRAINTS', - 'CONTAINING', - 'CONTINUE', - 'CONVERT', - 'CORRESPONDING', - 'COUNT', - 'CREATE', - 'CROSS', - 'CSTRING', - 'CURRENT', - 'CURRENT_CONNECTION', - 'CURRENT_DATE', - 'CURRENT_ROLE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_TRANSACTION', - 'CURRENT_USER', - 'DATABASE', - 'DATE', - 'DAY', - 'DB_KEY', - 'DEALLOCATE', - 'DEBUG', - 'DEC', - 'DECIMAL', - 'DECLARE', - 'DEFAULT', - 'DEFERRABLE', - 'DEFERRED', - 'DELETE', - 'DELETING', - 'DESC', - 'DESCENDING', - 'DESCRIBE', - 'DESCRIPTOR', - 'DIAGNOSTICS', - 'DIFFERENCE', - 'DISCONNECT', - 'DISPLAY', - 'DISTINCT', - 'DO', - 'DOMAIN', - 'DOUBLE', - 'DROP', - 'ECHO', - 'EDIT', - 'ELSE', - 'END', - 'END-EXEC', - 'ENTRY_POINT', - 'ESCAPE', - 'EVENT', - 'EXCEPT', - 'EXCEPTION', - 'EXEC', - 'EXECUTE', - 'EXISTS', - 'EXIT', - 'EXTERN', - 'EXTERNAL', - 'EXTRACT', - 'FALSE', - 'FETCH', - 'FILE', - 'FILTER', - 'FIRST', - 'FLOAT', - 'FOR', - 'FOREIGN', - 'FOUND', - 'FREE_IT', - 'FROM', - 'FULL', - 'FUNCTION', - 'GDSCODE', - 'GEN_ID', - 'GENERATOR', - 'GET', - 'GLOBAL', - 'GO', - 'GOTO', - 'GRANT', - 'GROUP', - 'GROUP_COMMIT_WAIT', - 'GROUP_COMMIT_WAIT_TIME', - 'HAVING', - 'HELP', - 'HOUR', - 'IDENTITY', - 'IF', - 'IIF', - 'IMMEDIATE', - 'IN', - 'INACTIVE', - 'INDEX', - 'INDICATOR', - 'INIT', - 'INITIALLY', - 'INNER', - 'INPUT', - 'INPUT_TYPE', - 'INSENSITIVE', - 'INSERT', - 'INSERTING', - 'INT', - 'INTEGER', - 'INTERSECT', - 'INTERVAL', - 'INTO', - 'IS', - 'ISOLATION', - 'ISQL', - 'JOIN', - 'KEY', - 'LANGUAGE', - 'LAST', - 'LC_MESSAGES', - 'LC_TYPE', - 'LEADING', - 'LEADING', - 'LEADING', - 'LEAVE', - 'LEFT', - 'LENGTH', - 'LEV', - 'LEVEL', - 'LIKE', - 'LOCAL', - 'LOCK', - 'LOG_BUF_SIZE', - 'LOG_BUFFER_SIZE', - 'LOGFILE', - 'LONG', - 'LOWER', - 'MANUAL', - 'MATCH', - 'MAX', - 'MAX_SEGMENT', - 'MAXIMUM', - 'MAXIMUM_SEGMENT', - 'MERGE', - 'MESSAGE', - 'MIN', - 'MINIMUM', - 'MINUTE', - 'MODULE', - 'MODULE_NAME', - 'MONTH', - 'NAMES', - 'NATIONAL', - 'NATURAL', - 'NCHAR', - 'NEXT', - 'NO', - 'NOAUTO', - 'NOT', - 'NULL', - 'NULLIF', - 'NULLS', - 'NUM_LOG_BUFFERS', - 'NUM_LOG_BUFS', - 'NUMERIC', - 'OCTET_LENGTH', - 'OF', - 'ON', - 'ONLY', - 'OPEN', - 'OPTION', - 'OR', - 'ORDER', - 'OUTER', - 'OUTPUT', - 'OUTPUT_TYPE', - 'OVERFLOW', - 'OVERLAPS', - 'PAD', - 'PAGE', - 'PAGE_SIZE', - 'PAGELENGTH', - 'PAGES', - 'PARAMETER', - 'PARTIAL', - 'PASSWORD', - 'PERCENT', - 'PLAN', - 'POSITION', - 'POST_EVENT', - 'PRECISION', - 'PREPARE', - 'PRESERVE', - 'PRIMARY', - 'PRIOR', - 'PRIVILEGES', - 'PROCEDURE', - 'PUBLIC', - 'QUIT', - 'RAW_PARTITIONS', - 'RDB$DB_KEY', - 'READ', - 'REAL', - 'RECORD_VERSION', - 'RECREATE', - 'RECREATE ROW_COUNT', - 'REFERENCES', - 'RELATIVE', - 'RELEASE', - 'RESERV', - 'RESERVING', - 'RESTART', - 'RESTRICT', - 'RETAIN', - 'RETURN', - 'RETURNING', - 'RETURNING_VALUES', - 'RETURNS', - 'REVOKE', - 'RIGHT', - 'ROLE', - 'ROLLBACK', - 'ROW_COUNT', - 'ROWS', - 'RUNTIME', - 'SAVEPOINT', - 'SCALAR_ARRAY', - 'SCHEMA', - 'SCROLL', - 'SECOND', - 'SECTION', - 'SELECT', - 'SEQUENCE', - 'SESSION', - 'SESSION_USER', - 'SET', - 'SHADOW', - 'SHARED', - 'SHELL', - 'SHOW', - 'SINGULAR', - 'SIZE', - 'SKIP', - 'SMALLINT', - 'SNAPSHOT', - 'SOME', - 'SORT', - 'SPACE', - 'SQL', - 'SQLCODE', - 'SQLERROR', - 'SQLSTATE', - 'SQLWARNING', - 'STABILITY', - 'STARTING', - 'STARTS', - 'STATEMENT', - 'STATIC', - 'STATISTICS', - 'SUB_TYPE', - 'SUBSTRING', - 'SUM', - 'SUSPEND', - 'SYSTEM_USER', - 'TABLE', - 'TEMPORARY', - 'TERMINATOR', - 'THEN', - 'TIES', - 'TIME', - 'TIMESTAMP', - 'TIMEZONE_HOUR', - 'TIMEZONE_MINUTE', - 'TO', - 'TRAILING', - 'TRANSACTION', - 'TRANSLATE', - 'TRANSLATION', - 'TRIGGER', - 'TRIM', - 'TRUE', - 'TYPE', - 'UNCOMMITTED', - 'UNION', - 'UNIQUE', - 'UNKNOWN', - 'UPDATE', - 'UPDATING', - 'UPPER', - 'USAGE', - 'USER', - 'USING', - 'VALUE', - 'VALUES', - 'VARCHAR', - 'VARIABLE', - 'VARYING', - 'VERSION', - 'VIEW', - 'WAIT', - 'WEEKDAY', - 'WHEN', - 'WHENEVER', - 'WHERE', - 'WHILE', - 'WITH', - 'WORK', - 'WRITE', - 'YEAR', - 'YEARDAY', - 'ZONE', -); -// }}} diff --git a/3rdparty/MDB2/Schema/Reserved/mssql.php b/3rdparty/MDB2/Schema/Reserved/mssql.php deleted file mode 100644 index 7aa65f426f..0000000000 --- a/3rdparty/MDB2/Schema/Reserved/mssql.php +++ /dev/null @@ -1,260 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -// {{{ $GLOBALS['_MDB2_Schema_Reserved']['mssql'] -/** - * Has a list of all the reserved words for mssql. - * - * @package MDB2_Schema - * @category Database - * @access protected - * @author David Coallier - */ -$GLOBALS['_MDB2_Schema_Reserved']['mssql'] = array( - 'ADD', - 'CURRENT_TIMESTAMP', - 'GROUP', - 'OPENQUERY', - 'SERIALIZABLE', - 'ALL', - 'CURRENT_USER', - 'HAVING', - 'OPENROWSET', - 'SESSION_USER', - 'ALTER', - 'CURSOR', - 'HOLDLOCK', - 'OPTION', - 'SET', - 'AND', - 'DATABASE', - 'IDENTITY', - 'OR', - 'SETUSER', - 'ANY', - 'DBCC', - 'IDENTITYCOL', - 'ORDER', - 'SHUTDOWN', - 'AS', - 'DEALLOCATE', - 'IDENTITY_INSERT', - 'OUTER', - 'SOME', - 'ASC', - 'DECLARE', - 'IF', - 'OVER', - 'STATISTICS', - 'AUTHORIZATION', - 'DEFAULT', - 'IN', - 'PERCENT', - 'SUM', - 'AVG', - 'DELETE', - 'INDEX', - 'PERM', - 'SYSTEM_USER', - 'BACKUP', - 'DENY', - 'INNER', - 'PERMANENT', - 'TABLE', - 'BEGIN', - 'DESC', - 'INSERT', - 'PIPE', - 'TAPE', - 'BETWEEN', - 'DISK', - 'INTERSECT', - 'PLAN', - 'TEMP', - 'BREAK', - 'DISTINCT', - 'INTO', - 'PRECISION', - 'TEMPORARY', - 'BROWSE', - 'DISTRIBUTED', - 'IS', - 'PREPARE', - 'TEXTSIZE', - 'BULK', - 'DOUBLE', - 'ISOLATION', - 'PRIMARY', - 'THEN', - 'BY', - 'DROP', - 'JOIN', - 'PRINT', - 'TO', - 'CASCADE', - 'DUMMY', - 'KEY', - 'PRIVILEGES', - 'TOP', - 'CASE', - 'DUMP', - 'KILL', - 'PROC', - 'TRAN', - 'CHECK', - 'ELSE', - 'LEFT', - 'PROCEDURE', - 'TRANSACTION', - 'CHECKPOINT', - 'END', - 'LEVEL', - 'PROCESSEXIT', - 'TRIGGER', - 'CLOSE', - 'ERRLVL', - 'LIKE', - 'PUBLIC', - 'TRUNCATE', - 'CLUSTERED', - 'ERROREXIT', - 'LINENO', - 'RAISERROR', - 'TSEQUAL', - 'COALESCE', - 'ESCAPE', - 'LOAD', - 'READ', - 'UNCOMMITTED', - 'COLUMN', - 'EXCEPT', - 'MAX', - 'READTEXT', - 'UNION', - 'COMMIT', - 'EXEC', - 'MIN', - 'RECONFIGURE', - 'UNIQUE', - 'COMMITTED', - 'EXECUTE', - 'MIRROREXIT', - 'REFERENCES', - 'UPDATE', - 'COMPUTE', - 'EXISTS', - 'NATIONAL', - 'REPEATABLE', - 'UPDATETEXT', - 'CONFIRM', - 'EXIT', - 'NOCHECK', - 'REPLICATION', - 'USE', - 'CONSTRAINT', - 'FETCH', - 'NONCLUSTERED', - 'RESTORE', - 'USER', - 'CONTAINS', - 'FILE', - 'NOT', - 'RESTRICT', - 'VALUES', - 'CONTAINSTABLE', - 'FILLFACTOR', - 'NULL', - 'RETURN', - 'VARYING', - 'CONTINUE', - 'FLOPPY', - 'NULLIF', - 'REVOKE', - 'VIEW', - 'CONTROLROW', - 'FOR', - 'OF', - 'RIGHT', - 'WAITFOR', - 'CONVERT', - 'FOREIGN', - 'OFF', - 'ROLLBACK', - 'WHEN', - 'COUNT', - 'FREETEXT', - 'OFFSETS', - 'ROWCOUNT', - 'WHERE', - 'CREATE', - 'FREETEXTTABLE', - 'ON', - 'ROWGUIDCOL', - 'WHILE', - 'CROSS', - 'FROM', - 'ONCE', - 'RULE', - 'WITH', - 'CURRENT', - 'FULL', - 'ONLY', - 'SAVE', - 'WORK', - 'CURRENT_DATE', - 'GOTO', - 'OPEN', - 'SCHEMA', - 'WRITETEXT', - 'CURRENT_TIME', - 'GRANT', - 'OPENDATASOURCE', - 'SELECT', -); -//}}} diff --git a/3rdparty/MDB2/Schema/Reserved/mysql.php b/3rdparty/MDB2/Schema/Reserved/mysql.php deleted file mode 100644 index 6a4338b261..0000000000 --- a/3rdparty/MDB2/Schema/Reserved/mysql.php +++ /dev/null @@ -1,285 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -// {{{ $GLOBALS['_MDB2_Schema_Reserved']['mysql'] -/** - * Has a list of reserved words of mysql - * - * @package MDB2_Schema - * @category Database - * @access protected - * @author David Coalier - */ -$GLOBALS['_MDB2_Schema_Reserved']['mysql'] = array( - 'ADD', - 'ALL', - 'ALTER', - 'ANALYZE', - 'AND', - 'AS', - 'ASC', - 'ASENSITIVE', - 'BEFORE', - 'BETWEEN', - 'BIGINT', - 'BINARY', - 'BLOB', - 'BOTH', - 'BY', - 'CALL', - 'CASCADE', - 'CASE', - 'CHANGE', - 'CHAR', - 'CHARACTER', - 'CHECK', - 'COLLATE', - 'COLUMN', - 'CONDITION', - 'CONNECTION', - 'CONSTRAINT', - 'CONTINUE', - 'CONVERT', - 'CREATE', - 'CROSS', - 'CURRENT_DATE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_USER', - 'CURSOR', - 'DATABASE', - 'DATABASES', - 'DAY_HOUR', - 'DAY_MICROSECOND', - 'DAY_MINUTE', - 'DAY_SECOND', - 'DEC', - 'DECIMAL', - 'DECLARE', - 'DEFAULT', - 'DELAYED', - 'DELETE', - 'DESC', - 'DESCRIBE', - 'DETERMINISTIC', - 'DISTINCT', - 'DISTINCTROW', - 'DIV', - 'DOUBLE', - 'DROP', - 'DUAL', - 'EACH', - 'ELSE', - 'ELSEIF', - 'ENCLOSED', - 'ESCAPED', - 'EXISTS', - 'EXIT', - 'EXPLAIN', - 'FALSE', - 'FETCH', - 'FLOAT', - 'FLOAT4', - 'FLOAT8', - 'FOR', - 'FORCE', - 'FOREIGN', - 'FROM', - 'FULLTEXT', - 'GOTO', - 'GRANT', - 'GROUP', - 'HAVING', - 'HIGH_PRIORITY', - 'HOUR_MICROSECOND', - 'HOUR_MINUTE', - 'HOUR_SECOND', - 'IF', - 'IGNORE', - 'IN', - 'INDEX', - 'INFILE', - 'INNER', - 'INOUT', - 'INSENSITIVE', - 'INSERT', - 'INT', - 'INT1', - 'INT2', - 'INT3', - 'INT4', - 'INT8', - 'INTEGER', - 'INTERVAL', - 'INTO', - 'IS', - 'ITERATE', - 'JOIN', - 'KEY', - 'KEYS', - 'KILL', - 'LABEL', - 'LEADING', - 'LEAVE', - 'LEFT', - 'LIKE', - 'LIMIT', - 'LINES', - 'LOAD', - 'LOCALTIME', - 'LOCALTIMESTAMP', - 'LOCK', - 'LONG', - 'LONGBLOB', - 'LONGTEXT', - 'LOOP', - 'LOW_PRIORITY', - 'MATCH', - 'MEDIUMBLOB', - 'MEDIUMINT', - 'MEDIUMTEXT', - 'MIDDLEINT', - 'MINUTE_MICROSECOND', - 'MINUTE_SECOND', - 'MOD', - 'MODIFIES', - 'NATURAL', - 'NOT', - 'NO_WRITE_TO_BINLOG', - 'NULL', - 'NUMERIC', - 'ON', - 'OPTIMIZE', - 'OPTION', - 'OPTIONALLY', - 'OR', - 'ORDER', - 'OUT', - 'OUTER', - 'OUTFILE', - 'PRECISION', - 'PRIMARY', - 'PROCEDURE', - 'PURGE', - 'RAID0', - 'READ', - 'READS', - 'REAL', - 'REFERENCES', - 'REGEXP', - 'RELEASE', - 'RENAME', - 'REPEAT', - 'REPLACE', - 'REQUIRE', - 'RESTRICT', - 'RETURN', - 'REVOKE', - 'RIGHT', - 'RLIKE', - 'SCHEMA', - 'SCHEMAS', - 'SECOND_MICROSECOND', - 'SELECT', - 'SENSITIVE', - 'SEPARATOR', - 'SET', - 'SHOW', - 'SMALLINT', - 'SONAME', - 'SPATIAL', - 'SPECIFIC', - 'SQL', - 'SQLEXCEPTION', - 'SQLSTATE', - 'SQLWARNING', - 'SQL_BIG_RESULT', - 'SQL_CALC_FOUND_ROWS', - 'SQL_SMALL_RESULT', - 'SSL', - 'STARTING', - 'STRAIGHT_JOIN', - 'TABLE', - 'TERMINATED', - 'THEN', - 'TINYBLOB', - 'TINYINT', - 'TINYTEXT', - 'TO', - 'TRAILING', - 'TRIGGER', - 'TRUE', - 'UNDO', - 'UNION', - 'UNIQUE', - 'UNLOCK', - 'UNSIGNED', - 'UPDATE', - 'USAGE', - 'USE', - 'USING', - 'UTC_DATE', - 'UTC_TIME', - 'UTC_TIMESTAMP', - 'VALUES', - 'VARBINARY', - 'VARCHAR', - 'VARCHARACTER', - 'VARYING', - 'WHEN', - 'WHERE', - 'WHILE', - 'WITH', - 'WRITE', - 'X509', - 'XOR', - 'YEAR_MONTH', - 'ZEROFILL', - ); - // }}} diff --git a/3rdparty/MDB2/Schema/Reserved/oci8.php b/3rdparty/MDB2/Schema/Reserved/oci8.php deleted file mode 100644 index 3cc898e1d6..0000000000 --- a/3rdparty/MDB2/Schema/Reserved/oci8.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -// {{{ $GLOBALS['_MDB2_Schema_Reserved']['oci8'] -/** - * Has a list of all the reserved words for oracle. - * - * @package MDB2_Schema - * @category Database - * @access protected - * @author David Coallier - */ -$GLOBALS['_MDB2_Schema_Reserved']['oci8'] = array( - 'ACCESS', - 'ELSE', - 'MODIFY', - 'START', - 'ADD', - 'EXCLUSIVE', - 'NOAUDIT', - 'SELECT', - 'ALL', - 'EXISTS', - 'NOCOMPRESS', - 'SESSION', - 'ALTER', - 'FILE', - 'NOT', - 'SET', - 'AND', - 'FLOAT', - 'NOTFOUND ', - 'SHARE', - 'ANY', - 'FOR', - 'NOWAIT', - 'SIZE', - 'ARRAYLEN', - 'FROM', - 'NULL', - 'SMALLINT', - 'AS', - 'GRANT', - 'NUMBER', - 'SQLBUF', - 'ASC', - 'GROUP', - 'OF', - 'SUCCESSFUL', - 'AUDIT', - 'HAVING', - 'OFFLINE ', - 'SYNONYM', - 'BETWEEN', - 'IDENTIFIED', - 'ON', - 'SYSDATE', - 'BY', - 'IMMEDIATE', - 'ONLINE', - 'TABLE', - 'CHAR', - 'IN', - 'OPTION', - 'THEN', - 'CHECK', - 'INCREMENT', - 'OR', - 'TO', - 'CLUSTER', - 'INDEX', - 'ORDER', - 'TRIGGER', - 'COLUMN', - 'INITIAL', - 'PCTFREE', - 'UID', - 'COMMENT', - 'INSERT', - 'PRIOR', - 'UNION', - 'COMPRESS', - 'INTEGER', - 'PRIVILEGES', - 'UNIQUE', - 'CONNECT', - 'INTERSECT', - 'PUBLIC', - 'UPDATE', - 'CREATE', - 'INTO', - 'RAW', - 'USER', - 'CURRENT', - 'IS', - 'RENAME', - 'VALIDATE', - 'DATE', - 'LEVEL', - 'RESOURCE', - 'VALUES', - 'DECIMAL', - 'LIKE', - 'REVOKE', - 'VARCHAR', - 'DEFAULT', - 'LOCK', - 'ROW', - 'VARCHAR2', - 'DELETE', - 'LONG', - 'ROWID', - 'VIEW', - 'DESC', - 'MAXEXTENTS', - 'ROWLABEL', - 'WHENEVER', - 'DISTINCT', - 'MINUS', - 'ROWNUM', - 'WHERE', - 'DROP', - 'MODE', - 'ROWS', - 'WITH', -); -// }}} diff --git a/3rdparty/MDB2/Schema/Reserved/pgsql.php b/3rdparty/MDB2/Schema/Reserved/pgsql.php deleted file mode 100644 index 84537685e0..0000000000 --- a/3rdparty/MDB2/Schema/Reserved/pgsql.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -// {{{ $GLOBALS['_MDB2_Schema_Reserved']['pgsql'] -/** - * Has a list of reserved words of pgsql - * - * @package MDB2_Schema - * @category Database - * @access protected - * @author Marcelo Santos Araujo - */ -$GLOBALS['_MDB2_Schema_Reserved']['pgsql'] = array( - 'ALL', - 'ANALYSE', - 'ANALYZE', - 'AND', - 'ANY', - 'AS', - 'ASC', - 'AUTHORIZATION', - 'BETWEEN', - 'BINARY', - 'BOTH', - 'CASE', - 'CAST', - 'CHECK', - 'COLLATE', - 'COLUMN', - 'CONSTRAINT', - 'CREATE', - 'CURRENT_DATE', - 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', - 'CURRENT_USER', - 'DEFAULT', - 'DEFERRABLE', - 'DESC', - 'DISTINCT', - 'DO', - 'ELSE', - 'END', - 'EXCEPT', - 'FALSE', - 'FOR', - 'FOREIGN', - 'FREEZE', - 'FROM', - 'FULL', - 'GRANT', - 'GROUP', - 'HAVING', - 'ILIKE', - 'IN', - 'INITIALLY', - 'INNER', - 'INTERSECT', - 'INTO', - 'IS', - 'ISNULL', - 'JOIN', - 'LEADING', - 'LEFT', - 'LIKE', - 'LIMIT', - 'LOCALTIME', - 'LOCALTIMESTAMP', - 'NATURAL', - 'NEW', - 'NOT', - 'NOTNULL', - 'NULL', - 'OFF', - 'OFFSET', - 'OLD', - 'ON', - 'ONLY', - 'OR', - 'ORDER', - 'OUTER', - 'OVERLAPS', - 'PLACING', - 'PRIMARY', - 'REFERENCES', - 'SELECT', - 'SESSION_USER', - 'SIMILAR', - 'SOME', - 'TABLE', - 'THEN', - 'TO', - 'TRAILING', - 'TRUE', - 'UNION', - 'UNIQUE', - 'USER', - 'USING', - 'VERBOSE', - 'WHEN', - 'WHERE' -); -// }}} diff --git a/3rdparty/MDB2/Schema/Tool.php b/3rdparty/MDB2/Schema/Tool.php deleted file mode 100644 index 3210c9173e..0000000000 --- a/3rdparty/MDB2/Schema/Tool.php +++ /dev/null @@ -1,583 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -require_once 'MDB2/Schema.php'; -require_once 'MDB2/Schema/Tool/ParameterException.php'; - -/** -* Command line tool to work with database schemas -* -* Functionality: -* - dump a database schema to stdout -* - import schema into database -* - create a diff between two schemas -* - apply diff to database -* - * @category Database - * @package MDB2_Schema - * @author Christian Weiske - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Tool -{ - /** - * Run the schema tool - * - * @param array $args Array of command line arguments - */ - public function __construct($args) - { - $strAction = $this->getAction($args); - try { - $this->{'do' . ucfirst($strAction)}($args); - } catch (MDB2_Schema_Tool_ParameterException $e) { - $this->{'doHelp' . ucfirst($strAction)}($e->getMessage()); - } - }//public function __construct($args) - - - - /** - * Runs the tool with command line arguments - * - * @return void - */ - public static function run() - { - $args = $GLOBALS['argv']; - array_shift($args); - - try { - $tool = new MDB2_Schema_Tool($args); - } catch (Exception $e) { - self::toStdErr($e->getMessage() . "\n"); - } - }//public static function run() - - - - /** - * Reads the first parameter from the argument array and - * returns the action. - * - * @param array &$args Command line parameters - * - * @return string Action to execute - */ - protected function getAction(&$args) - { - if (count($args) == 0) { - return 'help'; - } - $arg = array_shift($args); - switch ($arg) { - case 'h': - case 'help': - case '-h': - case '--help': - return 'help'; - case 'd': - case 'dump': - case '-d': - case '--dump': - return 'dump'; - case 'l': - case 'load': - case '-l': - case '--load': - return 'load'; - case 'i': - case 'diff': - case '-i': - case '--diff': - return 'diff'; - case 'a': - case 'apply': - case '-a': - case '--apply': - return 'apply'; - case 'n': - case 'init': - case '-i': - case '--init': - return 'init'; - default: - throw new MDB2_Schema_Tool_ParameterException( - "Unknown mode \"$arg\"" - ); - } - }//protected function getAction(&$args) - - - - /** - * Writes the message to stderr - * - * @param string $msg Message to print - * - * @return void - */ - protected static function toStdErr($msg) - { - file_put_contents('php://stderr', $msg); - }//protected static function toStdErr($msg) - - - - /** - * Displays generic help to stdout - * - * @return void - */ - protected function doHelp() - { - self::toStdErr( -<< '
    ', - 'idxname_format' => '%s', - 'debug' => true, - 'quote_identifier' => true, - 'force_defaults' => false, - 'portability' => true, - 'use_transactions' => false, - ); - return $options; - }//protected function getSchemaOptions() - - - - /** - * Checks if the passed parameter is a PEAR_Error object - * and throws an exception in that case. - * - * @param mixed $object Some variable to check - * @param string $location Where the error occured - * - * @return void - */ - protected function throwExceptionOnError($object, $location = '') - { - if (PEAR::isError($object)) { - //FIXME: exception class - //debug_print_backtrace(); - throw new Exception('Error ' . $location - . "\n" . $object->getMessage() - . "\n" . $object->getUserInfo() - ); - } - }//protected function throwExceptionOnError($object, $location = '') - - - - /** - * Loads a file or a dsn from the arguments - * - * @param array &$args Array of arguments to the program - * - * @return array Array of ('file'|'dsn', $value) - */ - protected function getFileOrDsn(&$args) - { - if (count($args) == 0) { - throw new MDB2_Schema_Tool_ParameterException( - 'File or DSN expected' - ); - } - - $arg = array_shift($args); - if ($arg == '-p') { - $bAskPassword = true; - $arg = array_shift($args); - } else { - $bAskPassword = false; - } - - if (strpos($arg, '://') === false) { - if (file_exists($arg)) { - //File - return array('file', $arg); - } else { - throw new Exception('Schema file does not exist'); - } - } - - //read password if necessary - if ($bAskPassword) { - $password = $this->readPasswordFromStdin($arg); - $arg = self::setPasswordIntoDsn($arg, $password); - self::toStdErr($arg); - } - return array('dsn', $arg); - }//protected function getFileOrDsn(&$args) - - - - /** - * Takes a DSN data source name and integrates the given - * password into it. - * - * @param string $dsn Data source name - * @param string $password Password - * - * @return string DSN with password - */ - protected function setPasswordIntoDsn($dsn, $password) - { - //simple try to integrate password - if (strpos($dsn, '@') === false) { - //no @ -> no user and no password - return str_replace('://', '://:' . $password . '@', $dsn); - } else if (preg_match('|://[^:]+@|', $dsn)) { - //user only, no password - return str_replace('@', ':' . $password . '@', $dsn); - } else if (strpos($dsn, ':@') !== false) { - //abstract version - return str_replace(':@', ':' . $password . '@', $dsn); - } - - return $dsn; - }//protected function setPasswordIntoDsn($dsn, $password) - - - - /** - * Reads a password from stdin - * - * @param string $dsn DSN name to put into the message - * - * @return string Password - */ - protected function readPasswordFromStdin($dsn) - { - $stdin = fopen('php://stdin', 'r'); - self::toStdErr('Please insert password for ' . $dsn . "\n"); - $password = ''; - $breakme = false; - while (false !== ($char = fgetc($stdin))) { - if (ord($char) == 10 || $char == "\n" || $char == "\r") { - break; - } - $password .= $char; - } - fclose($stdin); - - return trim($password); - }//protected function readPasswordFromStdin() - - - - /** - * Creates a database schema dump and sends it to stdout - * - * @param array $args Command line arguments - * - * @return void - */ - protected function doDump($args) - { - $dump_what = MDB2_SCHEMA_DUMP_STRUCTURE; - $arg = ''; - if (count($args)) { - $arg = $args[0]; - } - - switch (strtolower($arg)) { - case 'all': - $dump_what = MDB2_SCHEMA_DUMP_ALL; - array_shift($args); - break; - case 'data': - $dump_what = MDB2_SCHEMA_DUMP_CONTENT; - array_shift($args); - break; - case 'schema': - array_shift($args); - } - - list($type, $dsn) = $this->getFileOrDsn($args); - if ($type == 'file') { - throw new MDB2_Schema_Tool_ParameterException( - 'Dumping a schema file as a schema file does not make much ' . - 'sense' - ); - } - - $schema = MDB2_Schema::factory($dsn, $this->getSchemaOptions()); - $this->throwExceptionOnError($schema); - - $definition = $schema->getDefinitionFromDatabase(); - $this->throwExceptionOnError($definition); - - - $dump_options = array( - 'output_mode' => 'file', - 'output' => 'php://stdout', - 'end_of_line' => "\r\n" - ); - $op = $schema->dumpDatabase( - $definition, $dump_options, $dump_what - ); - $this->throwExceptionOnError($op); - - $schema->disconnect(); - }//protected function doDump($args) - - - - /** - * Loads a database schema - * - * @param array $args Command line arguments - * - * @return void - */ - protected function doLoad($args) - { - list($typeSource, $dsnSource) = $this->getFileOrDsn($args); - list($typeDest, $dsnDest) = $this->getFileOrDsn($args); - - if ($typeDest == 'file') { - throw new MDB2_Schema_Tool_ParameterException( - 'A schema can only be loaded into a database, not a file' - ); - } - - - $schemaDest = MDB2_Schema::factory($dsnDest, $this->getSchemaOptions()); - $this->throwExceptionOnError($schemaDest); - - //load definition - if ($typeSource == 'file') { - $definition = $schemaDest->parseDatabaseDefinitionFile($dsnSource); - $where = 'loading schema file'; - } else { - $schemaSource = MDB2_Schema::factory( - $dsnSource, - $this->getSchemaOptions() - ); - $this->throwExceptionOnError( - $schemaSource, - 'connecting to source database' - ); - - $definition = $schemaSource->getDefinitionFromDatabase(); - $where = 'loading definition from database'; - } - $this->throwExceptionOnError($definition, $where); - - - //create destination database from definition - $simulate = false; - $op = $schemaDest->createDatabase( - $definition, - array(), - $simulate - ); - $this->throwExceptionOnError($op, 'creating the database'); - }//protected function doLoad($args) - - - - /** - * Initializes a database with data - * - * @param array $args Command line arguments - * - * @return void - */ - protected function doInit($args) - { - list($typeSource, $dsnSource) = $this->getFileOrDsn($args); - list($typeDest, $dsnDest) = $this->getFileOrDsn($args); - - if ($typeSource != 'file') { - throw new MDB2_Schema_Tool_ParameterException( - 'Data must come from a source file' - ); - } - - if ($typeDest != 'dsn') { - throw new MDB2_Schema_Tool_ParameterException( - 'A schema can only be loaded into a database, not a file' - ); - } - - $schemaDest = MDB2_Schema::factory($dsnDest, $this->getSchemaOptions()); - $this->throwExceptionOnError( - $schemaDest, - 'connecting to destination database' - ); - - $definition = $schemaDest->getDefinitionFromDatabase(); - $this->throwExceptionOnError( - $definition, - 'loading definition from database' - ); - - $op = $schemaDest->writeInitialization($dsnSource, $definition); - $this->throwExceptionOnError($op, 'initializing database'); - }//protected function doInit($args) - - -}//class MDB2_Schema_Tool diff --git a/3rdparty/MDB2/Schema/Tool/ParameterException.php b/3rdparty/MDB2/Schema/Tool/ParameterException.php deleted file mode 100644 index 92bea69391..0000000000 --- a/3rdparty/MDB2/Schema/Tool/ParameterException.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -/** - * To be implemented yet - * - * @category Database - * @package MDB2_Schema - * @author Christian Weiske - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Tool_ParameterException extends Exception -{ -} diff --git a/3rdparty/MDB2/Schema/Validate.php b/3rdparty/MDB2/Schema/Validate.php deleted file mode 100644 index 4a8e0d27ba..0000000000 --- a/3rdparty/MDB2/Schema/Validate.php +++ /dev/null @@ -1,1004 +0,0 @@ - - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -/** - * Validates an XML schema file - * - * @category Database - * @package MDB2_Schema - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Validate -{ - // {{{ properties - - var $fail_on_invalid_names = true; - - var $valid_types = array(); - - var $force_defaults = true; - - var $max_identifiers_length = null; - - // }}} - // {{{ constructor - - /** - * PHP 5 constructor - * - * @param bool $fail_on_invalid_names array with reserved words per RDBMS - * @param array $valid_types information of all valid fields - * types - * @param bool $force_defaults if true sets a default value to - * field when not explicit - * @param int $max_identifiers_length maximum allowed size for entities - * name - * - * @return void - * - * @access public - * @static - */ - function __construct($fail_on_invalid_names = true, $valid_types = array(), - $force_defaults = true, $max_identifiers_length = null - ) { - if (empty($GLOBALS['_MDB2_Schema_Reserved'])) { - $GLOBALS['_MDB2_Schema_Reserved'] = array(); - } - - if (is_array($fail_on_invalid_names)) { - $this->fail_on_invalid_names = array_intersect($fail_on_invalid_names, - array_keys($GLOBALS['_MDB2_Schema_Reserved'])); - } elseif ($fail_on_invalid_names === true) { - $this->fail_on_invalid_names = array_keys($GLOBALS['_MDB2_Schema_Reserved']); - } else { - $this->fail_on_invalid_names = array(); - } - $this->valid_types = $valid_types; - $this->force_defaults = $force_defaults; - $this->max_identifiers_length = $max_identifiers_length; - } - - // }}} - // {{{ raiseError() - - /** - * Pushes a MDB2_Schema_Error into stack and returns it - * - * @param int $ecode MDB2_Schema's error code - * @param string $msg textual message - * - * @return object - * @access private - * @static - */ - function &raiseError($ecode, $msg = null) - { - $error = MDB2_Schema::raiseError($ecode, null, null, $msg); - return $error; - } - - // }}} - // {{{ isBoolean() - - /** - * Verifies if a given value can be considered boolean. If yes, set value - * to true or false according to its actual contents and return true. If - * not, keep its contents untouched and return false. - * - * @param mixed &$value value to be checked - * - * @return bool - * - * @access public - * @static - */ - function isBoolean(&$value) - { - if (is_bool($value)) { - return true; - } - - if ($value === 0 || $value === 1 || $value === '') { - $value = (bool)$value; - return true; - } - - if (!is_string($value)) { - return false; - } - - switch ($value) { - case '0': - case 'N': - case 'n': - case 'no': - case 'false': - $value = false; - break; - case '1': - case 'Y': - case 'y': - case 'yes': - case 'true': - $value = true; - break; - default: - return false; - } - return true; - } - - // }}} - // {{{ validateTable() - - /* Definition */ - /** - * Checks whether the definition of a parsed table is valid. Modify table - * definition when necessary. - * - * @param array $tables multi dimensional array that contains the - * tables of current database. - * @param array &$table multi dimensional array that contains the - * structure and optional data of the table. - * @param string $table_name name of the parsed table - * - * @return bool|error object - * - * @access public - */ - function validateTable($tables, &$table, $table_name) - { - /* Table name duplicated? */ - if (is_array($tables) && isset($tables[$table_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'table "'.$table_name.'" already exists'); - } - - /** - * Valid name ? - */ - $result = $this->validateIdentifier($table_name, 'table'); - if (PEAR::isError($result)) { - return $result; - } - - /* Was */ - if (empty($table['was'])) { - $table['was'] = $table_name; - } - - /* Have we got fields? */ - if (empty($table['fields']) || !is_array($table['fields'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'tables need one or more fields'); - } - - /* Autoincrement */ - $autoinc = $primary = false; - foreach ($table['fields'] as $field_name => $field) { - if (!empty($field['autoincrement'])) { - if ($autoinc) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'there was already an autoincrement field in "'.$table_name.'" before "'.$field_name.'"'); - } - $autoinc = $field_name; - } - } - - /* - * Checking Indexes - * this have to be done here otherwise we can't - * guarantee that all table fields were already - * defined in the moment we are parsing indexes - */ - if (!empty($table['indexes']) && is_array($table['indexes'])) { - foreach ($table['indexes'] as $name => $index) { - $skip_index = false; - if (!empty($index['primary'])) { - /* - * Lets see if we should skip this index since there is - * already an auto increment on this field this implying - * a primary key index. - */ - if (count($index['fields']) == '1' - && $autoinc - && array_key_exists($autoinc, $index['fields'])) { - $skip_index = true; - } elseif ($autoinc || $primary) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'there was already an primary index or autoincrement field in "'.$table_name.'" before "'.$name.'"'); - } else { - $primary = true; - } - } - - if (!$skip_index && is_array($index['fields'])) { - foreach ($index['fields'] as $field_name => $field) { - if (!isset($table['fields'][$field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'index field "'.$field_name.'" does not exist'); - } - if (!empty($index['primary']) - && !$table['fields'][$field_name]['notnull'] - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'all primary key fields must be defined notnull in "'.$table_name.'"'); - } - } - } else { - unset($table['indexes'][$name]); - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ validateField() - - /** - * Checks whether the definition of a parsed field is valid. Modify field - * definition when necessary. - * - * @param array $fields multi dimensional array that contains the - * fields of current table. - * @param array &$field multi dimensional array that contains the - * structure of the parsed field. - * @param string $field_name name of the parsed field - * - * @return bool|error object - * - * @access public - */ - function validateField($fields, &$field, $field_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($field_name, 'field'); - if (PEAR::isError($result)) { - return $result; - } - - /* Field name duplicated? */ - if (is_array($fields) && isset($fields[$field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "'.$field_name.'" already exists'); - } - - /* Type check */ - if (empty($field['type'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'no field type specified'); - } - if (!empty($this->valid_types) && !array_key_exists($field['type'], $this->valid_types)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'no valid field type ("'.$field['type'].'") specified'); - } - - /* Unsigned */ - if (array_key_exists('unsigned', $field) && !$this->isBoolean($field['unsigned'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'unsigned has to be a boolean value'); - } - - /* Fixed */ - if (array_key_exists('fixed', $field) && !$this->isBoolean($field['fixed'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'fixed has to be a boolean value'); - } - - /* Length */ - if (array_key_exists('length', $field) && $field['length'] <= 0) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'length has to be an integer greater 0'); - } - - // if it's a DECIMAL datatype, check if a 'scale' value is provided: - // 8,4 should be translated to DECIMAL(8,4) - if (is_float($this->valid_types[$field['type']]) - && !empty($field['length']) - && strpos($field['length'], ',') !== false - ) { - list($field['length'], $field['scale']) = explode(',', $field['length']); - } - - /* Was */ - if (empty($field['was'])) { - $field['was'] = $field_name; - } - - /* Notnull */ - if (empty($field['notnull'])) { - $field['notnull'] = false; - } - if (!$this->isBoolean($field['notnull'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "notnull" has to be a boolean value'); - } - - /* Default */ - if ($this->force_defaults - && !array_key_exists('default', $field) - && $field['type'] != 'clob' && $field['type'] != 'blob' - ) { - $field['default'] = $this->valid_types[$field['type']]; - } - if (array_key_exists('default', $field)) { - if ($field['type'] == 'clob' || $field['type'] == 'blob') { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field['type'].'"-fields are not allowed to have a default value'); - } - if ($field['default'] === '' && !$field['notnull']) { - $field['default'] = null; - } - } - if (isset($field['default']) - && PEAR::isError($result = $this->validateDataFieldValue($field, $field['default'], $field_name)) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'default value of "'.$field_name.'" is incorrect: '.$result->getUserinfo()); - } - - /* Autoincrement */ - if (!empty($field['autoincrement'])) { - if (!$field['notnull']) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'all autoincrement fields must be defined notnull'); - } - - if (empty($field['default'])) { - $field['default'] = '0'; - } elseif ($field['default'] !== '0' && $field['default'] !== 0) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'all autoincrement fields must be defined default "0"'); - } - } - return MDB2_OK; - } - - // }}} - // {{{ validateIndex() - - /** - * Checks whether a parsed index is valid. Modify index definition when - * necessary. - * - * @param array $table_indexes multi dimensional array that contains the - * indexes of current table. - * @param array &$index multi dimensional array that contains the - * structure of the parsed index. - * @param string $index_name name of the parsed index - * - * @return bool|error object - * - * @access public - */ - function validateIndex($table_indexes, &$index, $index_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($index_name, 'index'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($table_indexes) && isset($table_indexes[$index_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'index "'.$index_name.'" already exists'); - } - if (array_key_exists('unique', $index) && !$this->isBoolean($index['unique'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "unique" has to be a boolean value'); - } - if (array_key_exists('primary', $index) && !$this->isBoolean($index['primary'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "primary" has to be a boolean value'); - } - - /* Have we got fields? */ - if (empty($index['fields']) || !is_array($index['fields'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'indexes need one or more fields'); - } - - if (empty($index['was'])) { - $index['was'] = $index_name; - } - return MDB2_OK; - } - - // }}} - // {{{ validateIndexField() - - /** - * Checks whether a parsed index-field is valid. Modify its definition when - * necessary. - * - * @param array $index_fields multi dimensional array that contains the - * fields of current index. - * @param array &$field multi dimensional array that contains the - * structure of the parsed index-field. - * @param string $field_name name of the parsed index-field - * - * @return bool|error object - * - * @access public - */ - function validateIndexField($index_fields, &$field, $field_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($field_name, 'index field'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($index_fields) && isset($index_fields[$field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'index field "'.$field_name.'" already exists'); - } - if (empty($field['sorting'])) { - $field['sorting'] = 'ascending'; - } elseif ($field['sorting'] !== 'ascending' && $field['sorting'] !== 'descending') { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'sorting type unknown'); - } - return MDB2_OK; - } - - // }}} - // {{{ validateConstraint() - - /** - * Checks whether a parsed foreign key is valid. Modify its definition when - * necessary. - * - * @param array $table_constraints multi dimensional array that contains the - * constraints of current table. - * @param array &$constraint multi dimensional array that contains the - * structure of the parsed foreign key. - * @param string $constraint_name name of the parsed foreign key - * - * @return bool|error object - * - * @access public - */ - function validateConstraint($table_constraints, &$constraint, $constraint_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($constraint_name, 'foreign key'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($table_constraints) && isset($table_constraints[$constraint_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign key "'.$constraint_name.'" already exists'); - } - - /* Have we got fields? */ - if (empty($constraint['fields']) || !is_array($constraint['fields'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign key "'.$constraint_name.'" need one or more fields'); - } - - /* Have we got referenced fields? */ - if (empty($constraint['references']) || !is_array($constraint['references'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign key "'.$constraint_name.'" need to reference one or more fields'); - } - - /* Have we got referenced table? */ - if (empty($constraint['references']['table'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign key "'.$constraint_name.'" need to reference a table'); - } - - if (empty($constraint['was'])) { - $constraint['was'] = $constraint_name; - } - return MDB2_OK; - } - - // }}} - // {{{ validateConstraintField() - - /** - * Checks whether a foreign-field is valid. - * - * @param array $constraint_fields multi dimensional array that contains the - * fields of current foreign key. - * @param string $field_name name of the parsed foreign-field - * - * @return bool|error object - * - * @access public - */ - function validateConstraintField($constraint_fields, $field_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($field_name, 'foreign key field'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($constraint_fields) && isset($constraint_fields[$field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign field "'.$field_name.'" already exists'); - } - return MDB2_OK; - } - - // }}} - // {{{ validateConstraintReferencedField() - - /** - * Checks whether a foreign-referenced field is valid. - * - * @param array $referenced_fields multi dimensional array that contains the - * fields of current foreign key. - * @param string $field_name name of the parsed foreign-field - * - * @return bool|error object - * - * @access public - */ - function validateConstraintReferencedField($referenced_fields, $field_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($field_name, 'referenced foreign field'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($referenced_fields) && isset($referenced_fields[$field_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'foreign field "'.$field_name.'" already referenced'); - } - return MDB2_OK; - } - - // }}} - // {{{ validateSequence() - - /** - * Checks whether the definition of a parsed sequence is valid. Modify - * sequence definition when necessary. - * - * @param array $sequences multi dimensional array that contains the - * sequences of current database. - * @param array &$sequence multi dimensional array that contains the - * structure of the parsed sequence. - * @param string $sequence_name name of the parsed sequence - * - * @return bool|error object - * - * @access public - */ - function validateSequence($sequences, &$sequence, $sequence_name) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($sequence_name, 'sequence'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($sequences) && isset($sequences[$sequence_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'sequence "'.$sequence_name.'" already exists'); - } - - if (is_array($this->fail_on_invalid_names)) { - $name = strtoupper($sequence_name); - foreach ($this->fail_on_invalid_names as $rdbms) { - if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'sequence name "'.$sequence_name.'" is a reserved word in: '.$rdbms); - } - } - } - - if (empty($sequence['was'])) { - $sequence['was'] = $sequence_name; - } - - if (!empty($sequence['on']) - && (empty($sequence['on']['table']) || empty($sequence['on']['field'])) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'sequence "'.$sequence_name.'" on a table was not properly defined'); - } - return MDB2_OK; - } - - // }}} - // {{{ validateDatabase() - - /** - * Checks whether a parsed database is valid. Modify its structure and - * data when necessary. - * - * @param array &$database multi dimensional array that contains the - * structure and optional data of the database. - * - * @return bool|error object - * - * @access public - */ - function validateDatabase(&$database) - { - if (!is_array($database)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'something wrong went with database definition'); - } - - /** - * Valid name ? - */ - $result = $this->validateIdentifier($database['name'], 'database'); - if (PEAR::isError($result)) { - return $result; - } - - /* Create */ - if (isset($database['create']) - && !$this->isBoolean($database['create']) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "create" has to be a boolean value'); - } - - /* Overwrite */ - if (isset($database['overwrite']) - && $database['overwrite'] !== '' - && !$this->isBoolean($database['overwrite']) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "overwrite" has to be a boolean value'); - } - - /* - * This have to be done here otherwise we can't guarantee that all - * tables were already defined in the moment we are parsing constraints - */ - if (isset($database['tables'])) { - foreach ($database['tables'] as $table_name => $table) { - if (!empty($table['constraints'])) { - foreach ($table['constraints'] as $constraint_name => $constraint) { - $referenced_table_name = $constraint['references']['table']; - - if (!isset($database['tables'][$referenced_table_name])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'referenced table "'.$referenced_table_name.'" of foreign key "'.$constraint_name.'" of table "'.$table_name.'" does not exist'); - } - - if (empty($constraint['references']['fields'])) { - $referenced_table = $database['tables'][$referenced_table_name]; - - $primary = false; - - if (!empty($referenced_table['indexes'])) { - foreach ($referenced_table['indexes'] as $index_name => $index) { - if (array_key_exists('primary', $index) - && $index['primary'] - ) { - $primary = array(); - foreach ($index['fields'] as $field_name => $field) { - $primary[$field_name] = ''; - } - break; - } - } - } - - if (!$primary) { - foreach ($referenced_table['fields'] as $field_name => $field) { - if (array_key_exists('autoincrement', $field) - && $field['autoincrement'] - ) { - $primary = array( $field_name => '' ); - break; - } - } - } - - if (!$primary) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'referenced table "'.$referenced_table_name.'" has no primary key and no referenced field was specified for foreign key "'.$constraint_name.'" of table "'.$table_name.'"'); - } - - $constraint['references']['fields'] = $primary; - } - - /* the same number of referencing and referenced fields ? */ - if (count($constraint['fields']) != count($constraint['references']['fields'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'The number of fields in the referenced key must match those of the foreign key "'.$constraint_name.'"'); - } - - $database['tables'][$table_name]['constraints'][$constraint_name]['references']['fields'] = $constraint['references']['fields']; - } - } - } - } - - /* - * This have to be done here otherwise we can't guarantee that all - * tables were already defined in the moment we are parsing sequences - */ - if (isset($database['sequences'])) { - foreach ($database['sequences'] as $seq_name => $seq) { - if (!empty($seq['on']) - && empty($database['tables'][$seq['on']['table']]['fields'][$seq['on']['field']]) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'sequence "'.$seq_name.'" was assigned on unexisting field/table'); - } - } - } - return MDB2_OK; - } - - // }}} - // {{{ validateDataField() - - /* Data Manipulation */ - /** - * Checks whether a parsed DML-field is valid. Modify its structure when - * necessary. This is called when validating INSERT and - * UPDATE. - * - * @param array $table_fields multi dimensional array that contains the - * definition for current table's fields. - * @param array $instruction_fields multi dimensional array that contains the - * parsed fields of the current DML instruction. - * @param string &$field array that contains the parsed instruction field - * - * @return bool|error object - * - * @access public - */ - function validateDataField($table_fields, $instruction_fields, &$field) - { - /** - * Valid name ? - */ - $result = $this->validateIdentifier($field['name'], 'field'); - if (PEAR::isError($result)) { - return $result; - } - - if (is_array($instruction_fields) && isset($instruction_fields[$field['name']])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'field "'.$field['name'].'" already initialized'); - } - - if (is_array($table_fields) && !isset($table_fields[$field['name']])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field['name'].'" is not defined'); - } - - if (!isset($field['group']['type'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field['name'].'" has no initial value'); - } - - if (isset($field['group']['data']) - && $field['group']['type'] == 'value' - && $field['group']['data'] !== '' - && PEAR::isError($result = $this->validateDataFieldValue($table_fields[$field['name']], $field['group']['data'], $field['name'])) - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - 'value of "'.$field['name'].'" is incorrect: '.$result->getUserinfo()); - } - - return MDB2_OK; - } - - // }}} - // {{{ validateDataFieldValue() - - /** - * Checks whether a given value is compatible with a table field. This is - * done when parsing a field for a INSERT or UPDATE instruction. - * - * @param array $field_def multi dimensional array that contains the - * definition for current table's fields. - * @param string &$field_value value to fill the parsed field - * @param string $field_name name of the parsed field - * - * @return bool|error object - * - * @access public - * @see MDB2_Schema_Validate::validateInsertField() - */ - function validateDataFieldValue($field_def, &$field_value, $field_name) - { - switch ($field_def['type']) { - case 'text': - case 'clob': - if (!empty($field_def['length']) && strlen($field_value) > $field_def['length']) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is larger than "'.$field_def['length'].'"'); - } - break; - case 'blob': - $field_value = pack('H*', $field_value); - if (!empty($field_def['length']) && strlen($field_value) > $field_def['length']) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is larger than "'.$field_def['type'].'"'); - } - break; - case 'integer': - if ($field_value != ((int)$field_value)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - //$field_value = (int)$field_value; - if (!empty($field_def['unsigned']) && $field_def['unsigned'] && $field_value < 0) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" signed instead of unsigned'); - } - break; - case 'boolean': - if (!$this->isBoolean($field_value)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - break; - case 'date': - if (!preg_match('/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/', $field_value) - && $field_value !== 'CURRENT_DATE' - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - break; - case 'timestamp': - if (!preg_match('/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/', $field_value) - && strcasecmp($field_value, 'now()') != 0 - && $field_value !== 'CURRENT_TIMESTAMP' - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - break; - case 'time': - if (!preg_match("/([0-9]{2}):([0-9]{2}):([0-9]{2})/", $field_value) - && $field_value !== 'CURRENT_TIME' - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - break; - case 'float': - case 'double': - if ($field_value != (double)$field_value) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - '"'.$field_value.'" is not of type "'.$field_def['type'].'"'); - } - //$field_value = (double)$field_value; - break; - } - return MDB2_OK; - } - - // }}} - // {{{ validateIdentifier() - - /** - * Checks whether a given identifier is valid for current driver. - * - * @param string $id identifier to check - * @param string $type whether identifier represents a table name, index, etc. - * - * @return bool|error object - * - * @access public - */ - function validateIdentifier($id, $type) - { - $max_length = $this->max_identifiers_length; - $cur_length = strlen($id); - - /** - * Have we got a name? - */ - if (!$id) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - "a $type has to have a name"); - } - - /** - * Supported length ? - */ - if ($max_length !== null - && $cur_length > $max_length - ) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - "$type name '$id' is too long for current driver"); - } elseif ($cur_length > 30) { - // FIXME: find a way to issue a warning in MDB2_Schema object - /* $this->warnings[] = "$type name '$id' might not be - portable to other drivers"; */ - } - - /** - * Reserved ? - */ - if (is_array($this->fail_on_invalid_names)) { - $name = strtoupper($id); - foreach ($this->fail_on_invalid_names as $rdbms) { - if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, - "$type name '$id' is a reserved word in: $rdbms"); - } - } - } - - return MDB2_OK; - } - - // }}} -} diff --git a/3rdparty/MDB2/Schema/Writer.php b/3rdparty/MDB2/Schema/Writer.php deleted file mode 100644 index 3eaa39a207..0000000000 --- a/3rdparty/MDB2/Schema/Writer.php +++ /dev/null @@ -1,586 +0,0 @@ - - * @author Igor Feghali - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @version SVN: $Id$ - * @link http://pear.php.net/packages/MDB2_Schema - */ - -/** - * Writes an XML schema file - * - * @category Database - * @package MDB2_Schema - * @author Lukas Smith - * @license BSD http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/packages/MDB2_Schema - */ -class MDB2_Schema_Writer -{ - // {{{ properties - - var $valid_types = array(); - - // }}} - // {{{ constructor - - /** - * PHP 5 constructor - * - * @param array $valid_types information of all valid fields - * types - * - * @return void - * - * @access public - * @static - */ - function __construct($valid_types = array()) - { - $this->valid_types = $valid_types; - } - - // }}} - // {{{ raiseError() - - /** - * This method is used to communicate an error and invoke error - * callbacks etc. Basically a wrapper for PEAR::raiseError - * without the message string. - * - * @param int|PEAR_Error $code integer error code or and PEAR_Error - * instance - * @param int $mode error mode, see PEAR_Error docs error - * level (E_USER_NOTICE etc). If error mode - * is PEAR_ERROR_CALLBACK, this is the - * callback function, either as a function - * name, or as an array of an object and - * method name. For other error modes this - * parameter is ignored. - * @param string $options Extra debug information. Defaults to the - * last query and native error code. - * @param string $userinfo User-friendly error message - * - * @return object a PEAR error object - * @access public - * @see PEAR_Error - */ - function &raiseError($code = null, $mode = null, $options = null, $userinfo = null) - { - $error = MDB2_Schema::raiseError($code, $mode, $options, $userinfo); - return $error; - } - - // }}} - // {{{ _escapeSpecialChars() - - /** - * add escapecharacters to all special characters in a string - * - * @param string $string string that should be escaped - * - * @return string escaped string - * @access protected - */ - function _escapeSpecialChars($string) - { - if (!is_string($string)) { - $string = strval($string); - } - - $escaped = ''; - for ($char = 0, $count = strlen($string); $char < $count; $char++) { - switch ($string[$char]) { - case '&': - $escaped .= '&'; - break; - case '>': - $escaped .= '>'; - break; - case '<': - $escaped .= '<'; - break; - case '"': - $escaped .= '"'; - break; - case '\'': - $escaped .= '''; - break; - default: - $code = ord($string[$char]); - if ($code < 32 || $code > 127) { - $escaped .= "&#$code;"; - } else { - $escaped .= $string[$char]; - } - break; - } - } - return $escaped; - } - - // }}} - // {{{ _dumpBoolean() - - /** - * dump the structure of a sequence - * - * @param string $boolean boolean value or variable definition - * - * @return string with xml boolea definition - * @access private - */ - function _dumpBoolean($boolean) - { - if (is_string($boolean)) { - if ($boolean !== 'true' || $boolean !== 'false' - || preg_match('/.*/', $boolean) - ) { - return $boolean; - } - } - return $boolean ? 'true' : 'false'; - } - - // }}} - // {{{ dumpSequence() - - /** - * dump the structure of a sequence - * - * @param string $sequence_definition sequence definition - * @param string $sequence_name sequence name - * @param string $eol end of line characters - * @param integer $dump determines what data to dump - * MDB2_SCHEMA_DUMP_ALL : the entire db - * MDB2_SCHEMA_DUMP_STRUCTURE : only the structure of the db - * MDB2_SCHEMA_DUMP_CONTENT : only the content of the db - * - * @return mixed string xml sequence definition on success, or a error object - * @access public - */ - function dumpSequence($sequence_definition, $sequence_name, $eol, $dump = MDB2_SCHEMA_DUMP_ALL) - { - $buffer = "$eol $eol $sequence_name$eol"; - if ($dump == MDB2_SCHEMA_DUMP_ALL || $dump == MDB2_SCHEMA_DUMP_CONTENT) { - if (!empty($sequence_definition['start'])) { - $start = $sequence_definition['start']; - $buffer .= " $start$eol"; - } - } - - if (!empty($sequence_definition['on'])) { - $buffer .= " $eol"; - $buffer .= "
    ".$sequence_definition['on']['table']; - $buffer .= "
    $eol ".$sequence_definition['on']['field']; - $buffer .= "$eol
    $eol"; - } - $buffer .= "
    $eol"; - - return $buffer; - } - - // }}} - // {{{ dumpDatabase() - - /** - * Dump a previously parsed database structure in the Metabase schema - * XML based format suitable for the Metabase parser. This function - * may optionally dump the database definition with initialization - * commands that specify the data that is currently present in the tables. - * - * @param array $database_definition unknown - * @param array $arguments associative array that takes pairs of tag - * names and values that define dump options. - * array ( - * 'output_mode' => String - * 'file' : dump into a file - * default: dump using a function - * 'output' => String - * depending on the 'Output_Mode' - * name of the file - * name of the function - * 'end_of_line' => String - * end of line delimiter that should be used - * default: "\n" - * ); - * @param integer $dump determines what data to dump - * MDB2_SCHEMA_DUMP_ALL : the entire db - * MDB2_SCHEMA_DUMP_STRUCTURE : only the structure of the db - * MDB2_SCHEMA_DUMP_CONTENT : only the content of the db - * - * @return mixed MDB2_OK on success, or a error object - * @access public - */ - function dumpDatabase($database_definition, $arguments, $dump = MDB2_SCHEMA_DUMP_ALL) - { - if (!empty($arguments['output'])) { - if (!empty($arguments['output_mode']) && $arguments['output_mode'] == 'file') { - $fp = fopen($arguments['output'], 'w'); - if ($fp === false) { - return $this->raiseError(MDB2_SCHEMA_ERROR_WRITER, null, null, - 'it was not possible to open output file'); - } - - $output = false; - } elseif (is_callable($arguments['output'])) { - $output = $arguments['output']; - } else { - return $this->raiseError(MDB2_SCHEMA_ERROR_WRITER, null, null, - 'no valid output function specified'); - } - } else { - return $this->raiseError(MDB2_SCHEMA_ERROR_WRITER, null, null, - 'no output method specified'); - } - - $eol = isset($arguments['end_of_line']) ? $arguments['end_of_line'] : "\n"; - - $sequences = array(); - if (!empty($database_definition['sequences']) - && is_array($database_definition['sequences']) - ) { - foreach ($database_definition['sequences'] as $sequence_name => $sequence) { - $table = !empty($sequence['on']) ? $sequence['on']['table'] :''; - - $sequences[$table][] = $sequence_name; - } - } - - $buffer = ''.$eol; - $buffer .= "$eol$eol ".$database_definition['name'].""; - $buffer .= "$eol ".$this->_dumpBoolean($database_definition['create']).""; - $buffer .= "$eol ".$this->_dumpBoolean($database_definition['overwrite'])."$eol"; - $buffer .= "$eol ".$database_definition['charset']."$eol"; - - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - } - - if (!empty($database_definition['tables']) && is_array($database_definition['tables'])) { - foreach ($database_definition['tables'] as $table_name => $table) { - $buffer = "$eol $eol$eol $table_name$eol"; - if ($dump == MDB2_SCHEMA_DUMP_ALL || $dump == MDB2_SCHEMA_DUMP_STRUCTURE) { - $buffer .= "$eol $eol"; - if (!empty($table['fields']) && is_array($table['fields'])) { - foreach ($table['fields'] as $field_name => $field) { - if (empty($field['type'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, null, null, - 'it was not specified the type of the field "'. - $field_name.'" of the table "'.$table_name.'"'); - } - if (!empty($this->valid_types) && !array_key_exists($field['type'], $this->valid_types)) { - return $this->raiseError(MDB2_SCHEMA_ERROR_UNSUPPORTED, null, null, - 'type "'.$field['type'].'" is not yet supported'); - } - $buffer .= "$eol $eol $field_name$eol "; - $buffer .= $field['type']."$eol"; - if (!empty($field['fixed']) && $field['type'] === 'text') { - $buffer .= " ".$this->_dumpBoolean($field['fixed'])."$eol"; - } - if (array_key_exists('default', $field) - && $field['type'] !== 'clob' && $field['type'] !== 'blob' - ) { - $buffer .= ' '.$this->_escapeSpecialChars($field['default'])."$eol"; - } - if (!empty($field['notnull'])) { - $buffer .= " ".$this->_dumpBoolean($field['notnull'])."$eol"; - } else { - $buffer .= " false$eol"; - } - if (!empty($field['autoincrement'])) { - $buffer .= " " . $field['autoincrement'] ."$eol"; - } - if (!empty($field['unsigned'])) { - $buffer .= " ".$this->_dumpBoolean($field['unsigned'])."$eol"; - } - if (!empty($field['length'])) { - $buffer .= ' '.$field['length']."$eol"; - } - $buffer .= " $eol"; - } - } - - if (!empty($table['indexes']) && is_array($table['indexes'])) { - foreach ($table['indexes'] as $index_name => $index) { - if (strtolower($index_name) === 'primary') { - $index_name = $table_name . '_pKey'; - } - $buffer .= "$eol $eol $index_name$eol"; - if (!empty($index['unique'])) { - $buffer .= " ".$this->_dumpBoolean($index['unique'])."$eol"; - } - - if (!empty($index['primary'])) { - $buffer .= " ".$this->_dumpBoolean($index['primary'])."$eol"; - } - - foreach ($index['fields'] as $field_name => $field) { - $buffer .= " $eol $field_name$eol"; - if (!empty($field) && is_array($field)) { - $buffer .= ' '.$field['sorting']."$eol"; - } - $buffer .= " $eol"; - } - $buffer .= " $eol"; - } - } - - if (!empty($table['constraints']) && is_array($table['constraints'])) { - foreach ($table['constraints'] as $constraint_name => $constraint) { - $buffer .= "$eol $eol $constraint_name$eol"; - if (empty($constraint['fields']) || !is_array($constraint['fields'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, null, null, - 'it was not specified a field for the foreign key "'. - $constraint_name.'" of the table "'.$table_name.'"'); - } - if (!is_array($constraint['references']) || empty($constraint['references']['table'])) { - return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE, null, null, - 'it was not specified the referenced table of the foreign key "'. - $constraint_name.'" of the table "'.$table_name.'"'); - } - if (!empty($constraint['match'])) { - $buffer .= " ".$constraint['match']."$eol"; - } - if (!empty($constraint['ondelete'])) { - $buffer .= " ".$constraint['ondelete']."$eol"; - } - if (!empty($constraint['onupdate'])) { - $buffer .= " ".$constraint['onupdate']."$eol"; - } - if (!empty($constraint['deferrable'])) { - $buffer .= " ".$constraint['deferrable']."$eol"; - } - if (!empty($constraint['initiallydeferred'])) { - $buffer .= " ".$constraint['initiallydeferred']."$eol"; - } - foreach ($constraint['fields'] as $field_name => $field) { - $buffer .= " $field_name$eol"; - } - $buffer .= " $eol
    ".$constraint['references']['table']."
    $eol"; - foreach ($constraint['references']['fields'] as $field_name => $field) { - $buffer .= " $field_name$eol"; - } - $buffer .= " $eol"; - - $buffer .= " $eol"; - } - } - - $buffer .= "$eol $eol"; - } - - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - } - - $buffer = ''; - if ($dump == MDB2_SCHEMA_DUMP_ALL || $dump == MDB2_SCHEMA_DUMP_CONTENT) { - if (!empty($table['initialization']) && is_array($table['initialization'])) { - $buffer = "$eol $eol"; - foreach ($table['initialization'] as $instruction) { - switch ($instruction['type']) { - case 'insert': - $buffer .= "$eol $eol"; - foreach ($instruction['data']['field'] as $field) { - $field_name = $field['name']; - - $buffer .= "$eol $eol $field_name$eol"; - $buffer .= $this->writeExpression($field['group'], 5, $arguments); - $buffer .= " $eol"; - } - $buffer .= "$eol $eol"; - break; - case 'update': - $buffer .= "$eol $eol"; - foreach ($instruction['data']['field'] as $field) { - $field_name = $field['name']; - - $buffer .= "$eol $eol $field_name$eol"; - $buffer .= $this->writeExpression($field['group'], 5, $arguments); - $buffer .= " $eol"; - } - - if (!empty($instruction['data']['where']) - && is_array($instruction['data']['where']) - ) { - $buffer .= " $eol"; - $buffer .= $this->writeExpression($instruction['data']['where'], 5, $arguments); - $buffer .= " $eol"; - } - - $buffer .= "$eol $eol"; - break; - case 'delete': - $buffer .= "$eol $eol$eol"; - if (!empty($instruction['data']['where']) - && is_array($instruction['data']['where']) - ) { - $buffer .= " $eol"; - $buffer .= $this->writeExpression($instruction['data']['where'], 5, $arguments); - $buffer .= " $eol"; - } - $buffer .= "$eol $eol"; - break; - } - } - $buffer .= "$eol $eol"; - } - } - $buffer .= "$eol $eol"; - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - } - - if (isset($sequences[$table_name])) { - foreach ($sequences[$table_name] as $sequence) { - $result = $this->dumpSequence($database_definition['sequences'][$sequence], - $sequence, $eol, $dump); - if (PEAR::isError($result)) { - return $result; - } - - if ($output) { - call_user_func($output, $result); - } else { - fwrite($fp, $result); - } - } - } - } - } - - if (isset($sequences[''])) { - foreach ($sequences[''] as $sequence) { - $result = $this->dumpSequence($database_definition['sequences'][$sequence], - $sequence, $eol, $dump); - if (PEAR::isError($result)) { - return $result; - } - - if ($output) { - call_user_func($output, $result); - } else { - fwrite($fp, $result); - } - } - } - - $buffer = "$eol
    $eol"; - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - fclose($fp); - } - - return MDB2_OK; - } - - // }}} - // {{{ writeExpression() - - /** - * Dumps the structure of an element. Elements can be value, column, - * function or expression. - * - * @param array $element multi dimensional array that represents the parsed element - * of a DML instruction. - * @param integer $offset base indentation width - * @param array $arguments associative array that takes pairs of tag - * names and values that define dump options. - * - * @return string - * - * @access public - * @see MDB2_Schema_Writer::dumpDatabase() - */ - function writeExpression($element, $offset = 0, $arguments = null) - { - $eol = isset($arguments['end_of_line']) ? $arguments['end_of_line'] : "\n"; - $str = ''; - - $indent = str_repeat(' ', $offset); - $noffset = $offset + 1; - - switch ($element['type']) { - case 'value': - $str .= "$indent".$this->_escapeSpecialChars($element['data'])."$eol"; - break; - case 'column': - $str .= "$indent".$this->_escapeSpecialChars($element['data'])."$eol"; - break; - case 'function': - $str .= "$indent$eol$indent ".$this->_escapeSpecialChars($element['data']['name'])."$eol"; - - if (!empty($element['data']['arguments']) - && is_array($element['data']['arguments']) - ) { - foreach ($element['data']['arguments'] as $v) { - $str .= $this->writeExpression($v, $noffset, $arguments); - } - } - - $str .= "$indent$eol"; - break; - case 'expression': - $str .= "$indent$eol"; - $str .= $this->writeExpression($element['data']['operants'][0], $noffset, $arguments); - $str .= "$indent ".$element['data']['operator']."$eol"; - $str .= $this->writeExpression($element['data']['operants'][1], $noffset, $arguments); - $str .= "$indent$eol"; - break; - } - return $str; - } - - // }}} -} diff --git a/3rdparty/OS/Guess.php b/3rdparty/OS/Guess.php deleted file mode 100644 index d3f2cc764e..0000000000 --- a/3rdparty/OS/Guess.php +++ /dev/null @@ -1,338 +0,0 @@ - - * @author Gregory Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Guess.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since PEAR 0.1 - */ - -// {{{ uname examples - -// php_uname() without args returns the same as 'uname -a', or a PHP-custom -// string for Windows. -// PHP versions prior to 4.3 return the uname of the host where PHP was built, -// as of 4.3 it returns the uname of the host running the PHP code. -// -// PC RedHat Linux 7.1: -// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown -// -// PC Debian Potato: -// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown -// -// PC FreeBSD 3.3: -// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386 -// -// PC FreeBSD 4.3: -// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386 -// -// PC FreeBSD 4.5: -// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386 -// -// PC FreeBSD 4.5 w/uname from GNU shellutils: -// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown -// -// HP 9000/712 HP-UX 10: -// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license -// -// HP 9000/712 HP-UX 10 w/uname from GNU shellutils: -// HP-UX host B.10.10 A 9000/712 unknown -// -// IBM RS6000/550 AIX 4.3: -// AIX host 3 4 000003531C00 -// -// AIX 4.3 w/uname from GNU shellutils: -// AIX host 3 4 000003531C00 unknown -// -// SGI Onyx IRIX 6.5 w/uname from GNU shellutils: -// IRIX64 host 6.5 01091820 IP19 mips -// -// SGI Onyx IRIX 6.5: -// IRIX64 host 6.5 01091820 IP19 -// -// SparcStation 20 Solaris 8 w/uname from GNU shellutils: -// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc -// -// SparcStation 20 Solaris 8: -// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20 -// -// Mac OS X (Darwin) -// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh -// -// Mac OS X early versions -// - -// }}} - -/* TODO: - * - define endianness, to allow matchSignature("bigend") etc. - */ - -/** - * Retrieves information about the current operating system - * - * This class uses php_uname() to grok information about the current OS - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Gregory Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class OS_Guess -{ - var $sysname; - var $nodename; - var $cpu; - var $release; - var $extra; - - function OS_Guess($uname = null) - { - list($this->sysname, - $this->release, - $this->cpu, - $this->extra, - $this->nodename) = $this->parseSignature($uname); - } - - function parseSignature($uname = null) - { - static $sysmap = array( - 'HP-UX' => 'hpux', - 'IRIX64' => 'irix', - ); - static $cpumap = array( - 'i586' => 'i386', - 'i686' => 'i386', - 'ppc' => 'powerpc', - ); - if ($uname === null) { - $uname = php_uname(); - } - $parts = preg_split('/\s+/', trim($uname)); - $n = count($parts); - - $release = $machine = $cpu = ''; - $sysname = $parts[0]; - $nodename = $parts[1]; - $cpu = $parts[$n-1]; - $extra = ''; - if ($cpu == 'unknown') { - $cpu = $parts[$n - 2]; - } - - switch ($sysname) { - case 'AIX' : - $release = "$parts[3].$parts[2]"; - break; - case 'Windows' : - switch ($parts[1]) { - case '95/98': - $release = '9x'; - break; - default: - $release = $parts[1]; - break; - } - $cpu = 'i386'; - break; - case 'Linux' : - $extra = $this->_detectGlibcVersion(); - // use only the first two digits from the kernel version - $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); - break; - case 'Mac' : - $sysname = 'darwin'; - $nodename = $parts[2]; - $release = $parts[3]; - if ($cpu == 'Macintosh') { - if ($parts[$n - 2] == 'Power') { - $cpu = 'powerpc'; - } - } - break; - case 'Darwin' : - if ($cpu == 'Macintosh') { - if ($parts[$n - 2] == 'Power') { - $cpu = 'powerpc'; - } - } - $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); - break; - default: - $release = preg_replace('/-.*/', '', $parts[2]); - break; - } - - if (isset($sysmap[$sysname])) { - $sysname = $sysmap[$sysname]; - } else { - $sysname = strtolower($sysname); - } - if (isset($cpumap[$cpu])) { - $cpu = $cpumap[$cpu]; - } - return array($sysname, $release, $cpu, $extra, $nodename); - } - - function _detectGlibcVersion() - { - static $glibc = false; - if ($glibc !== false) { - return $glibc; // no need to run this multiple times - } - $major = $minor = 0; - include_once "System.php"; - // Use glibc's header file to - // get major and minor version number: - if (@file_exists('/usr/include/features.h') && - @is_readable('/usr/include/features.h')) { - if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) { - $features_file = fopen('/usr/include/features.h', 'rb'); - while (!feof($features_file)) { - $line = fgets($features_file, 8192); - if (!$line || (strpos($line, '#define') === false)) { - continue; - } - if (strpos($line, '__GLIBC__')) { - // major version number #define __GLIBC__ version - $line = preg_split('/\s+/', $line); - $glibc_major = trim($line[2]); - if (isset($glibc_minor)) { - break; - } - continue; - } - - if (strpos($line, '__GLIBC_MINOR__')) { - // got the minor version number - // #define __GLIBC_MINOR__ version - $line = preg_split('/\s+/', $line); - $glibc_minor = trim($line[2]); - if (isset($glibc_major)) { - break; - } - continue; - } - } - fclose($features_file); - if (!isset($glibc_major) || !isset($glibc_minor)) { - return $glibc = ''; - } - return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ; - } // no cpp - - $tmpfile = System::mktemp("glibctest"); - $fp = fopen($tmpfile, "w"); - fwrite($fp, "#include \n__GLIBC__ __GLIBC_MINOR__\n"); - fclose($fp); - $cpp = popen("/usr/bin/cpp $tmpfile", "r"); - while ($line = fgets($cpp, 1024)) { - if ($line{0} == '#' || trim($line) == '') { - continue; - } - - if (list($major, $minor) = explode(' ', trim($line))) { - break; - } - } - pclose($cpp); - unlink($tmpfile); - } // features.h - - if (!($major && $minor) && @is_link('/lib/libc.so.6')) { - // Let's try reading the libc.so.6 symlink - if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) { - list($major, $minor) = explode('.', $matches[1]); - } - } - - if (!($major && $minor)) { - return $glibc = ''; - } - - return $glibc = "glibc{$major}.{$minor}"; - } - - function getSignature() - { - if (empty($this->extra)) { - return "{$this->sysname}-{$this->release}-{$this->cpu}"; - } - return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}"; - } - - function getSysname() - { - return $this->sysname; - } - - function getNodename() - { - return $this->nodename; - } - - function getCpu() - { - return $this->cpu; - } - - function getRelease() - { - return $this->release; - } - - function getExtra() - { - return $this->extra; - } - - function matchSignature($match) - { - $fragments = is_array($match) ? $match : explode('-', $match); - $n = count($fragments); - $matches = 0; - if ($n > 0) { - $matches += $this->_matchFragment($fragments[0], $this->sysname); - } - if ($n > 1) { - $matches += $this->_matchFragment($fragments[1], $this->release); - } - if ($n > 2) { - $matches += $this->_matchFragment($fragments[2], $this->cpu); - } - if ($n > 3) { - $matches += $this->_matchFragment($fragments[3], $this->extra); - } - return ($matches == $n); - } - - function _matchFragment($fragment, $value) - { - if (strcspn($fragment, '*?') < strlen($fragment)) { - $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/'; - return preg_match($reg, $value); - } - return ($fragment == '*' || !strcasecmp($fragment, $value)); - } - -} -/* - * Local Variables: - * indent-tabs-mode: nil - * c-basic-offset: 4 - * End: - */ \ No newline at end of file diff --git a/3rdparty/PEAR-LICENSE b/3rdparty/PEAR-LICENSE deleted file mode 100644 index a00a2421fd..0000000000 --- a/3rdparty/PEAR-LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 1997-2009, - Stig Bakken , - Gregory Beaver , - Helgi Þormar Þorbjörnsson , - Tomas V.V.Cox , - Martin Jansen . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/3rdparty/PEAR.php b/3rdparty/PEAR.php deleted file mode 100644 index 501f6a653d..0000000000 --- a/3rdparty/PEAR.php +++ /dev/null @@ -1,1063 +0,0 @@ - - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2010 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: PEAR.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/**#@+ - * ERROR constants - */ -define('PEAR_ERROR_RETURN', 1); -define('PEAR_ERROR_PRINT', 2); -define('PEAR_ERROR_TRIGGER', 4); -define('PEAR_ERROR_DIE', 8); -define('PEAR_ERROR_CALLBACK', 16); -/** - * WARNING: obsolete - * @deprecated - */ -define('PEAR_ERROR_EXCEPTION', 32); -/**#@-*/ -define('PEAR_ZE2', (function_exists('version_compare') && - version_compare(zend_version(), "2-dev", "ge"))); - -if (substr(PHP_OS, 0, 3) == 'WIN') { - define('OS_WINDOWS', true); - define('OS_UNIX', false); - define('PEAR_OS', 'Windows'); -} else { - define('OS_WINDOWS', false); - define('OS_UNIX', true); - define('PEAR_OS', 'Unix'); // blatant assumption -} - -$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; -$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; -$GLOBALS['_PEAR_destructor_object_list'] = array(); -$GLOBALS['_PEAR_shutdown_funcs'] = array(); -$GLOBALS['_PEAR_error_handler_stack'] = array(); - -@ini_set('track_errors', true); - -/** - * Base class for other PEAR classes. Provides rudimentary - * emulation of destructors. - * - * If you want a destructor in your class, inherit PEAR and make a - * destructor method called _yourclassname (same name as the - * constructor, but with a "_" prefix). Also, in your constructor you - * have to call the PEAR constructor: $this->PEAR();. - * The destructor method will be called without parameters. Note that - * at in some SAPI implementations (such as Apache), any output during - * the request shutdown (in which destructors are called) seems to be - * discarded. If you need to get any debug information from your - * destructor, use error_log(), syslog() or something similar. - * - * IMPORTANT! To use the emulated destructors you need to create the - * objects by reference: $obj =& new PEAR_child; - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Greg Beaver - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @see PEAR_Error - * @since Class available since PHP 4.0.2 - * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear - */ -class PEAR -{ - /** - * Whether to enable internal debug messages. - * - * @var bool - * @access private - */ - var $_debug = false; - - /** - * Default error mode for this object. - * - * @var int - * @access private - */ - var $_default_error_mode = null; - - /** - * Default error options used for this object when error mode - * is PEAR_ERROR_TRIGGER. - * - * @var int - * @access private - */ - var $_default_error_options = null; - - /** - * Default error handler (callback) for this object, if error mode is - * PEAR_ERROR_CALLBACK. - * - * @var string - * @access private - */ - var $_default_error_handler = ''; - - /** - * Which class to use for error objects. - * - * @var string - * @access private - */ - var $_error_class = 'PEAR_Error'; - - /** - * An array of expected errors. - * - * @var array - * @access private - */ - var $_expected_errors = array(); - - /** - * Constructor. Registers this object in - * $_PEAR_destructor_object_list for destructor emulation if a - * destructor object exists. - * - * @param string $error_class (optional) which class to use for - * error objects, defaults to PEAR_Error. - * @access public - * @return void - */ - function PEAR($error_class = null) - { - $classname = strtolower(get_class($this)); - if ($this->_debug) { - print "PEAR constructor called, class=$classname\n"; - } - - if ($error_class !== null) { - $this->_error_class = $error_class; - } - - while ($classname && strcasecmp($classname, "pear")) { - $destructor = "_$classname"; - if (method_exists($this, $destructor)) { - global $_PEAR_destructor_object_list; - $_PEAR_destructor_object_list[] = &$this; - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - break; - } else { - $classname = get_parent_class($classname); - } - } - } - - /** - * Destructor (the emulated type of...). Does nothing right now, - * but is included for forward compatibility, so subclass - * destructors should always call it. - * - * See the note in the class desciption about output from - * destructors. - * - * @access public - * @return void - */ - function _PEAR() { - if ($this->_debug) { - printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); - } - } - - /** - * If you have a class that's mostly/entirely static, and you need static - * properties, you can use this method to simulate them. Eg. in your method(s) - * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); - * You MUST use a reference, or they will not persist! - * - * @access public - * @param string $class The calling classname, to prevent clashes - * @param string $var The variable to retrieve. - * @return mixed A reference to the variable. If not set it will be - * auto initialised to NULL. - */ - function &getStaticProperty($class, $var) - { - static $properties; - if (!isset($properties[$class])) { - $properties[$class] = array(); - } - - if (!array_key_exists($var, $properties[$class])) { - $properties[$class][$var] = null; - } - - return $properties[$class][$var]; - } - - /** - * Use this function to register a shutdown method for static - * classes. - * - * @access public - * @param mixed $func The function name (or array of class/method) to call - * @param mixed $args The arguments to pass to the function - * @return void - */ - function registerShutdownFunc($func, $args = array()) - { - // if we are called statically, there is a potential - // that no shutdown func is registered. Bug #6445 - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); - } - - /** - * Tell whether a value is a PEAR error. - * - * @param mixed $data the value to test - * @param int $code if $data is an error object, return true - * only if $code is a string and - * $obj->getMessage() == $code or - * $code is an integer and $obj->getCode() == $code - * @access public - * @return bool true if parameter is an error - */ - static function isError($data, $code = null) - { - if (!is_a($data, 'PEAR_Error')) { - return false; - } - - if (is_null($code)) { - return true; - } elseif (is_string($code)) { - return $data->getMessage() == $code; - } - - return $data->getCode() == $code; - } - - /** - * Sets how errors generated by this object should be handled. - * Can be invoked both in objects and statically. If called - * statically, setErrorHandling sets the default behaviour for all - * PEAR objects. If called in an object, setErrorHandling sets - * the default behaviour for that object. - * - * @param int $mode - * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. - * - * @param mixed $options - * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one - * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * - * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is the object, and the element at index 1 is - * the name of the method to call in the object. - * - * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is - * a printf format string used when printing the error - * message. - * - * @access public - * @return void - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - * @see PEAR_ERROR_EXCEPTION - * - * @since PHP 4.0.5 - */ - function setErrorHandling($mode = null, $options = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $setmode = &$this->_default_error_mode; - $setoptions = &$this->_default_error_options; - } else { - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - } - - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - } - - /** - * This method is used to tell which errors you expect to get. - * Expected errors are always returned with error mode - * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, - * and this method pushes a new element onto it. The list of - * expected errors are in effect until they are popped off the - * stack with the popExpect() method. - * - * Note that this method can not be called statically - * - * @param mixed $code a single error code or an array of error codes to expect - * - * @return int the new depth of the "expected errors" stack - * @access public - */ - function expectError($code = '*') - { - if (is_array($code)) { - array_push($this->_expected_errors, $code); - } else { - array_push($this->_expected_errors, array($code)); - } - return count($this->_expected_errors); - } - - /** - * This method pops one element off the expected error codes - * stack. - * - * @return array the list of error codes that were popped - */ - function popExpect() - { - return array_pop($this->_expected_errors); - } - - /** - * This method checks unsets an error code if available - * - * @param mixed error code - * @return bool true if the error code was unset, false otherwise - * @access private - * @since PHP 4.3.0 - */ - function _checkDelExpect($error_code) - { - $deleted = false; - foreach ($this->_expected_errors as $key => $error_array) { - if (in_array($error_code, $error_array)) { - unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); - $deleted = true; - } - - // clean up empty arrays - if (0 == count($this->_expected_errors[$key])) { - unset($this->_expected_errors[$key]); - } - } - - return $deleted; - } - - /** - * This method deletes all occurences of the specified element from - * the expected error codes stack. - * - * @param mixed $error_code error code that should be deleted - * @return mixed list of error codes that were deleted or error - * @access public - * @since PHP 4.3.0 - */ - function delExpect($error_code) - { - $deleted = false; - if ((is_array($error_code) && (0 != count($error_code)))) { - // $error_code is a non-empty array here; we walk through it trying - // to unset all values - foreach ($error_code as $key => $error) { - $deleted = $this->_checkDelExpect($error) ? true : false; - } - - return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } elseif (!empty($error_code)) { - // $error_code comes alone, trying to unset it - if ($this->_checkDelExpect($error_code)) { - return true; - } - - return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } - - // $error_code is empty - return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME - } - - /** - * This method is a wrapper that returns an instance of the - * configured error class with this object's default error - * handling applied. If the $mode and $options parameters are not - * specified, the object's defaults are used. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. - * - * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter - * specifies the PHP-internal error level (one of - * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * If $mode is PEAR_ERROR_CALLBACK, this - * parameter specifies the callback function or - * method. In other error modes this parameter - * is ignored. - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @param string $error_class The returned error object will be - * instantiated from this class, if specified. - * - * @param bool $skipmsg If true, raiseError will only pass error codes, - * the error message parameter will be dropped. - * - * @access public - * @return object a PEAR error object - * @see PEAR::setErrorHandling - * @since PHP 4.0.5 - */ - static function &raiseError($message = null, - $code = null, - $mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - // The error is yet a PEAR error object - if (is_object($message)) { - $code = $message->getCode(); - $userinfo = $message->getUserInfo(); - $error_class = $message->getType(); - $message->error_message_prefix = ''; - $message = $message->getMessage(); - } - - if ( - isset($this) && - isset($this->_expected_errors) && - count($this->_expected_errors) > 0 && - count($exp = end($this->_expected_errors)) - ) { - if ($exp[0] == "*" || - (is_int(reset($exp)) && in_array($code, $exp)) || - (is_string(reset($exp)) && in_array($message, $exp)) - ) { - $mode = PEAR_ERROR_RETURN; - } - } - - // No mode given, try global ones - if ($mode === null) { - // Class error handler - if (isset($this) && isset($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - // Global error handler - } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { - $mode = $GLOBALS['_PEAR_default_error_mode']; - $options = $GLOBALS['_PEAR_default_error_options']; - } - } - - if ($error_class !== null) { - $ec = $error_class; - } elseif (isset($this) && isset($this->_error_class)) { - $ec = $this->_error_class; - } else { - $ec = 'PEAR_Error'; - } - - if (intval(PHP_VERSION) < 5) { - // little non-eval hack to fix bug #12147 - include 'PEAR/FixPHP5PEARWarnings.php'; - return $a; - } - - if ($skipmsg) { - $a = new $ec($code, $mode, $options, $userinfo); - } else { - $a = new $ec($message, $code, $mode, $options, $userinfo); - } - - return $a; - } - - /** - * Simpler form of raiseError with fewer options. In most cases - * message, code and userinfo are enough. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @access public - * @return object a PEAR error object - * @see PEAR::raiseError - */ - function &throwError($message = null, $code = null, $userinfo = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $a = $this->raiseError($message, $code, null, null, $userinfo); - return $a; - } - - $a = PEAR::raiseError($message, $code, null, null, $userinfo); - return $a; - } - - function staticPushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - $stack[] = array($def_mode, $def_options); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $def_mode = $mode; - $def_options = $options; - break; - - case PEAR_ERROR_CALLBACK: - $def_mode = $mode; - // class/object method callback - if (is_callable($options)) { - $def_options = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - $stack[] = array($mode, $options); - return true; - } - - function staticPopErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - return true; - } - - /** - * Push a new error handler on top of the error handler options stack. With this - * you can easily override the actual error handler for some code and restore - * it later with popErrorHandling. - * - * @param mixed $mode (same as setErrorHandling) - * @param mixed $options (same as setErrorHandling) - * - * @return bool Always true - * - * @see PEAR::setErrorHandling - */ - function pushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - if (isset($this) && is_a($this, 'PEAR')) { - $def_mode = &$this->_default_error_mode; - $def_options = &$this->_default_error_options; - } else { - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - } - $stack[] = array($def_mode, $def_options); - - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - $stack[] = array($mode, $options); - return true; - } - - /** - * Pop the last error handler used - * - * @return bool Always true - * - * @see PEAR::pushErrorHandling - */ - function popErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - return true; - } - - /** - * OS independant PHP extension load. Remember to take care - * on the correct extension name for case sensitive OSes. - * - * @param string $ext The extension name - * @return bool Success or not on the dl() call - */ - static function loadExtension($ext) - { - if (extension_loaded($ext)) { - return true; - } - - // if either returns true dl() will produce a FATAL error, stop that - if ( - function_exists('dl') === false || - ini_get('enable_dl') != 1 || - ini_get('safe_mode') == 1 - ) { - return false; - } - - if (OS_WINDOWS) { - $suffix = '.dll'; - } elseif (PHP_OS == 'HP-UX') { - $suffix = '.sl'; - } elseif (PHP_OS == 'AIX') { - $suffix = '.a'; - } elseif (PHP_OS == 'OSX') { - $suffix = '.bundle'; - } else { - $suffix = '.so'; - } - - return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); - } -} - -if (PEAR_ZE2) { - include_once 'PEAR5.php'; -} - -function _PEAR_call_destructors() -{ - global $_PEAR_destructor_object_list; - if (is_array($_PEAR_destructor_object_list) && - sizeof($_PEAR_destructor_object_list)) - { - reset($_PEAR_destructor_object_list); - if (PEAR_ZE2) { - $destructLifoExists = PEAR5::getStaticProperty('PEAR', 'destructlifo'); - } else { - $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo'); - } - - if ($destructLifoExists) { - $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); - } - - while (list($k, $objref) = each($_PEAR_destructor_object_list)) { - $classname = get_class($objref); - while ($classname) { - $destructor = "_$classname"; - if (method_exists($objref, $destructor)) { - $objref->$destructor(); - break; - } else { - $classname = get_parent_class($classname); - } - } - } - // Empty the object list to ensure that destructors are - // not called more than once. - $_PEAR_destructor_object_list = array(); - } - - // Now call the shutdown functions - if ( - isset($GLOBALS['_PEAR_shutdown_funcs']) && - is_array($GLOBALS['_PEAR_shutdown_funcs']) && - !empty($GLOBALS['_PEAR_shutdown_funcs']) - ) { - foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { - call_user_func_array($value[0], $value[1]); - } - } -} - -/** - * Standard PEAR error class for PHP 4 - * - * This class is supserseded by {@link PEAR_Exception} in PHP 5 - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Gregory Beaver - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/manual/en/core.pear.pear-error.php - * @see PEAR::raiseError(), PEAR::throwError() - * @since Class available since PHP 4.0.2 - */ -class PEAR_Error -{ - var $error_message_prefix = ''; - var $mode = PEAR_ERROR_RETURN; - var $level = E_USER_NOTICE; - var $code = -1; - var $message = ''; - var $userinfo = ''; - var $backtrace = null; - - /** - * PEAR_Error constructor - * - * @param string $message message - * - * @param int $code (optional) error code - * - * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, - * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION - * - * @param mixed $options (optional) error level, _OR_ in the case of - * PEAR_ERROR_CALLBACK, the callback function or object/method - * tuple. - * - * @param string $userinfo (optional) additional user/debug info - * - * @access public - * - */ - function PEAR_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - if ($mode === null) { - $mode = PEAR_ERROR_RETURN; - } - $this->message = $message; - $this->code = $code; - $this->mode = $mode; - $this->userinfo = $userinfo; - - if (PEAR_ZE2) { - $skiptrace = PEAR5::getStaticProperty('PEAR_Error', 'skiptrace'); - } else { - $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace'); - } - - if (!$skiptrace) { - $this->backtrace = debug_backtrace(); - if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { - unset($this->backtrace[0]['object']); - } - } - - if ($mode & PEAR_ERROR_CALLBACK) { - $this->level = E_USER_NOTICE; - $this->callback = $options; - } else { - if ($options === null) { - $options = E_USER_NOTICE; - } - - $this->level = $options; - $this->callback = null; - } - - if ($this->mode & PEAR_ERROR_PRINT) { - if (is_null($options) || is_int($options)) { - $format = "%s"; - } else { - $format = $options; - } - - printf($format, $this->getMessage()); - } - - if ($this->mode & PEAR_ERROR_TRIGGER) { - trigger_error($this->getMessage(), $this->level); - } - - if ($this->mode & PEAR_ERROR_DIE) { - $msg = $this->getMessage(); - if (is_null($options) || is_int($options)) { - $format = "%s"; - if (substr($msg, -1) != "\n") { - $msg .= "\n"; - } - } else { - $format = $options; - } - die(sprintf($format, $msg)); - } - - if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) { - call_user_func($this->callback, $this); - } - - if ($this->mode & PEAR_ERROR_EXCEPTION) { - trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); - eval('$e = new Exception($this->message, $this->code);throw($e);'); - } - } - - /** - * Get the error mode from an error object. - * - * @return int error mode - * @access public - */ - function getMode() - { - return $this->mode; - } - - /** - * Get the callback function/method from an error object. - * - * @return mixed callback function or object/method array - * @access public - */ - function getCallback() - { - return $this->callback; - } - - /** - * Get the error message from an error object. - * - * @return string full error message - * @access public - */ - function getMessage() - { - return ($this->error_message_prefix . $this->message); - } - - /** - * Get error code from an error object - * - * @return int error code - * @access public - */ - function getCode() - { - return $this->code; - } - - /** - * Get the name of this error/exception. - * - * @return string error/exception name (type) - * @access public - */ - function getType() - { - return get_class($this); - } - - /** - * Get additional user-supplied information. - * - * @return string user-supplied information - * @access public - */ - function getUserInfo() - { - return $this->userinfo; - } - - /** - * Get additional debug information supplied by the application. - * - * @return string debug information - * @access public - */ - function getDebugInfo() - { - return $this->getUserInfo(); - } - - /** - * Get the call backtrace from where the error was generated. - * Supported with PHP 4.3.0 or newer. - * - * @param int $frame (optional) what frame to fetch - * @return array Backtrace, or NULL if not available. - * @access public - */ - function getBacktrace($frame = null) - { - if (defined('PEAR_IGNORE_BACKTRACE')) { - return null; - } - if ($frame === null) { - return $this->backtrace; - } - return $this->backtrace[$frame]; - } - - function addUserInfo($info) - { - if (empty($this->userinfo)) { - $this->userinfo = $info; - } else { - $this->userinfo .= " ** $info"; - } - } - - function __toString() - { - return $this->getMessage(); - } - - /** - * Make a string representation of this object. - * - * @return string a string with an object summary - * @access public - */ - function toString() - { - $modes = array(); - $levels = array(E_USER_NOTICE => 'notice', - E_USER_WARNING => 'warning', - E_USER_ERROR => 'error'); - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_array($this->callback)) { - $callback = (is_object($this->callback[0]) ? - strtolower(get_class($this->callback[0])) : - $this->callback[0]) . '::' . - $this->callback[1]; - } else { - $callback = $this->callback; - } - return sprintf('[%s: message="%s" code=%d mode=callback '. - 'callback=%s prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - $callback, $this->error_message_prefix, - $this->userinfo); - } - if ($this->mode & PEAR_ERROR_PRINT) { - $modes[] = 'print'; - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - $modes[] = 'trigger'; - } - if ($this->mode & PEAR_ERROR_DIE) { - $modes[] = 'die'; - } - if ($this->mode & PEAR_ERROR_RETURN) { - $modes[] = 'return'; - } - return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. - 'prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - implode("|", $modes), $levels[$this->level], - $this->error_message_prefix, - $this->userinfo); - } -} - -/* - * Local Variables: - * mode: php - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/3rdparty/PEAR/Autoloader.php b/3rdparty/PEAR/Autoloader.php deleted file mode 100644 index 51620c7085..0000000000 --- a/3rdparty/PEAR/Autoloader.php +++ /dev/null @@ -1,218 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Autoloader.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader - * @since File available since Release 0.1 - * @deprecated File deprecated in Release 1.4.0a1 - */ - -// /* vim: set expandtab tabstop=4 shiftwidth=4: */ - -if (!extension_loaded("overload")) { - // die hard without ext/overload - die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader"); -} - -/** - * Include for PEAR_Error and PEAR classes - */ -require_once "PEAR.php"; - -/** - * This class is for objects where you want to separate the code for - * some methods into separate classes. This is useful if you have a - * class with not-frequently-used methods that contain lots of code - * that you would like to avoid always parsing. - * - * The PEAR_Autoloader class provides autoloading and aggregation. - * The autoloading lets you set up in which classes the separated - * methods are found. Aggregation is the technique used to import new - * methods, an instance of each class providing separated methods is - * stored and called every time the aggregated method is called. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader - * @since File available since Release 0.1 - * @deprecated File deprecated in Release 1.4.0a1 - */ -class PEAR_Autoloader extends PEAR -{ - // {{{ properties - - /** - * Map of methods and classes where they are defined - * - * @var array - * - * @access private - */ - var $_autoload_map = array(); - - /** - * Map of methods and aggregate objects - * - * @var array - * - * @access private - */ - var $_method_map = array(); - - // }}} - // {{{ addAutoload() - - /** - * Add one or more autoload entries. - * - * @param string $method which method to autoload - * - * @param string $classname (optional) which class to find the method in. - * If the $method parameter is an array, this - * parameter may be omitted (and will be ignored - * if not), and the $method parameter will be - * treated as an associative array with method - * names as keys and class names as values. - * - * @return void - * - * @access public - */ - function addAutoload($method, $classname = null) - { - if (is_array($method)) { - array_walk($method, create_function('$a,&$b', '$b = strtolower($b);')); - $this->_autoload_map = array_merge($this->_autoload_map, $method); - } else { - $this->_autoload_map[strtolower($method)] = $classname; - } - } - - // }}} - // {{{ removeAutoload() - - /** - * Remove an autoload entry. - * - * @param string $method which method to remove the autoload entry for - * - * @return bool TRUE if an entry was removed, FALSE if not - * - * @access public - */ - function removeAutoload($method) - { - $method = strtolower($method); - $ok = isset($this->_autoload_map[$method]); - unset($this->_autoload_map[$method]); - return $ok; - } - - // }}} - // {{{ addAggregateObject() - - /** - * Add an aggregate object to this object. If the specified class - * is not defined, loading it will be attempted following PEAR's - * file naming scheme. All the methods in the class will be - * aggregated, except private ones (name starting with an - * underscore) and constructors. - * - * @param string $classname what class to instantiate for the object. - * - * @return void - * - * @access public - */ - function addAggregateObject($classname) - { - $classname = strtolower($classname); - if (!class_exists($classname)) { - $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname); - include_once $include_file; - } - $obj = new $classname; - $methods = get_class_methods($classname); - foreach ($methods as $method) { - // don't import priviate methods and constructors - if ($method{0} != '_' && $method != $classname) { - $this->_method_map[$method] = $obj; - } - } - } - - // }}} - // {{{ removeAggregateObject() - - /** - * Remove an aggregate object. - * - * @param string $classname the class of the object to remove - * - * @return bool TRUE if an object was removed, FALSE if not - * - * @access public - */ - function removeAggregateObject($classname) - { - $ok = false; - $classname = strtolower($classname); - reset($this->_method_map); - while (list($method, $obj) = each($this->_method_map)) { - if (is_a($obj, $classname)) { - unset($this->_method_map[$method]); - $ok = true; - } - } - return $ok; - } - - // }}} - // {{{ __call() - - /** - * Overloaded object call handler, called each time an - * undefined/aggregated method is invoked. This method repeats - * the call in the right aggregate object and passes on the return - * value. - * - * @param string $method which method that was called - * - * @param string $args An array of the parameters passed in the - * original call - * - * @return mixed The return value from the aggregated method, or a PEAR - * error if the called method was unknown. - */ - function __call($method, $args, &$retval) - { - $method = strtolower($method); - if (empty($this->_method_map[$method]) && isset($this->_autoload_map[$method])) { - $this->addAggregateObject($this->_autoload_map[$method]); - } - if (isset($this->_method_map[$method])) { - $retval = call_user_func_array(array($this->_method_map[$method], $method), $args); - return true; - } - return false; - } - - // }}} -} - -overload("PEAR_Autoloader"); - -?> diff --git a/3rdparty/PEAR/Builder.php b/3rdparty/PEAR/Builder.php deleted file mode 100644 index 90f3a14555..0000000000 --- a/3rdparty/PEAR/Builder.php +++ /dev/null @@ -1,489 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Builder.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - * - * TODO: log output parameters in PECL command line - * TODO: msdev path in configuration - */ - -/** - * Needed for extending PEAR_Builder - */ -require_once 'PEAR/Common.php'; -require_once 'PEAR/PackageFile.php'; - -/** - * Class to handle building (compiling) extensions. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since PHP 4.0.2 - * @see http://pear.php.net/manual/en/core.ppm.pear-builder.php - */ -class PEAR_Builder extends PEAR_Common -{ - var $php_api_version = 0; - var $zend_module_api_no = 0; - var $zend_extension_api_no = 0; - - var $extensions_built = array(); - - /** - * @var string Used for reporting when it is not possible to pass function - * via extra parameter, e.g. log, msdevCallback - */ - var $current_callback = null; - - // used for msdev builds - var $_lastline = null; - var $_firstline = null; - - /** - * PEAR_Builder constructor. - * - * @param object $ui user interface object (instance of PEAR_Frontend_*) - * - * @access public - */ - function PEAR_Builder(&$ui) - { - parent::PEAR_Common(); - $this->setFrontendObject($ui); - } - - /** - * Build an extension from source on windows. - * requires msdev - */ - function _build_win32($descfile, $callback = null) - { - if (is_object($descfile)) { - $pkg = $descfile; - $descfile = $pkg->getPackageFile(); - } else { - $pf = &new PEAR_PackageFile($this->config, $this->debug); - $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($pkg)) { - return $pkg; - } - } - $dir = dirname($descfile); - $old_cwd = getcwd(); - - if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) { - return $this->raiseError("could not chdir to $dir"); - } - - // packages that were in a .tar have the packagefile in this directory - $vdir = $pkg->getPackage() . '-' . $pkg->getVersion(); - if (file_exists($dir) && is_dir($vdir)) { - if (!chdir($vdir)) { - return $this->raiseError("could not chdir to " . realpath($vdir)); - } - - $dir = getcwd(); - } - - $this->log(2, "building in $dir"); - - $dsp = $pkg->getPackage().'.dsp'; - if (!file_exists("$dir/$dsp")) { - return $this->raiseError("The DSP $dsp does not exist."); - } - // XXX TODO: make release build type configurable - $command = 'msdev '.$dsp.' /MAKE "'.$pkg->getPackage(). ' - Release"'; - - $err = $this->_runCommand($command, array(&$this, 'msdevCallback')); - if (PEAR::isError($err)) { - return $err; - } - - // figure out the build platform and type - $platform = 'Win32'; - $buildtype = 'Release'; - if (preg_match('/.*?'.$pkg->getPackage().'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) { - $platform = $matches[1]; - $buildtype = $matches[2]; - } - - if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/', $this->_lastline, $matches)) { - if ($matches[2]) { - // there were errors in the build - return $this->raiseError("There were errors during compilation."); - } - $out = $matches[1]; - } else { - return $this->raiseError("Did not understand the completion status returned from msdev.exe."); - } - - // msdev doesn't tell us the output directory :/ - // open the dsp, find /out and use that directory - $dsptext = join(file($dsp),''); - - // this regex depends on the build platform and type having been - // correctly identified above. - $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'. - $pkg->getPackage().'\s-\s'. - $platform.'\s'. - $buildtype.'").*?'. - '\/out:"(.*?)"/is'; - - if ($dsptext && preg_match($regex, $dsptext, $matches)) { - // what we get back is a relative path to the output file itself. - $outfile = realpath($matches[2]); - } else { - return $this->raiseError("Could not retrieve output information from $dsp."); - } - // realpath returns false if the file doesn't exist - if ($outfile && copy($outfile, "$dir/$out")) { - $outfile = "$dir/$out"; - } - - $built_files[] = array( - 'file' => "$outfile", - 'php_api' => $this->php_api_version, - 'zend_mod_api' => $this->zend_module_api_no, - 'zend_ext_api' => $this->zend_extension_api_no, - ); - - return $built_files; - } - // }}} - - // {{{ msdevCallback() - function msdevCallback($what, $data) - { - if (!$this->_firstline) - $this->_firstline = $data; - $this->_lastline = $data; - call_user_func($this->current_callback, $what, $data); - } - - /** - * @param string - * @param string - * @param array - * @access private - */ - function _harvestInstDir($dest_prefix, $dirname, &$built_files) - { - $d = opendir($dirname); - if (!$d) - return false; - - $ret = true; - while (($ent = readdir($d)) !== false) { - if ($ent{0} == '.') - continue; - - $full = $dirname . DIRECTORY_SEPARATOR . $ent; - if (is_dir($full)) { - if (!$this->_harvestInstDir( - $dest_prefix . DIRECTORY_SEPARATOR . $ent, - $full, $built_files)) { - $ret = false; - break; - } - } else { - $dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent; - $built_files[] = array( - 'file' => $full, - 'dest' => $dest, - 'php_api' => $this->php_api_version, - 'zend_mod_api' => $this->zend_module_api_no, - 'zend_ext_api' => $this->zend_extension_api_no, - ); - } - } - closedir($d); - return $ret; - } - - /** - * Build an extension from source. Runs "phpize" in the source - * directory, but compiles in a temporary directory - * (TMPDIR/pear-build-USER/PACKAGE-VERSION). - * - * @param string|PEAR_PackageFile_v* $descfile path to XML package description file, or - * a PEAR_PackageFile object - * - * @param mixed $callback callback function used to report output, - * see PEAR_Builder::_runCommand for details - * - * @return array an array of associative arrays with built files, - * format: - * array( array( 'file' => '/path/to/ext.so', - * 'php_api' => YYYYMMDD, - * 'zend_mod_api' => YYYYMMDD, - * 'zend_ext_api' => YYYYMMDD ), - * ... ) - * - * @access public - * - * @see PEAR_Builder::_runCommand - */ - function build($descfile, $callback = null) - { - if (preg_match('/(\\/|\\\\|^)([^\\/\\\\]+)?php(.+)?$/', - $this->config->get('php_bin'), $matches)) { - if (isset($matches[2]) && strlen($matches[2]) && - trim($matches[2]) != trim($this->config->get('php_prefix'))) { - $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') . - ' appears to have a prefix ' . $matches[2] . ', but' . - ' config variable php_prefix does not match'); - } - - if (isset($matches[3]) && strlen($matches[3]) && - trim($matches[3]) != trim($this->config->get('php_suffix'))) { - $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') . - ' appears to have a suffix ' . $matches[3] . ', but' . - ' config variable php_suffix does not match'); - } - } - - $this->current_callback = $callback; - if (PEAR_OS == "Windows") { - return $this->_build_win32($descfile, $callback); - } - - if (PEAR_OS != 'Unix') { - return $this->raiseError("building extensions not supported on this platform"); - } - - if (is_object($descfile)) { - $pkg = $descfile; - $descfile = $pkg->getPackageFile(); - if (is_a($pkg, 'PEAR_PackageFile_v1')) { - $dir = dirname($descfile); - } else { - $dir = $pkg->_config->get('temp_dir') . '/' . $pkg->getName(); - // automatically delete at session end - $this->addTempFile($dir); - } - } else { - $pf = &new PEAR_PackageFile($this->config); - $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($pkg)) { - return $pkg; - } - $dir = dirname($descfile); - } - - // Find config. outside of normal path - e.g. config.m4 - foreach (array_keys($pkg->getInstallationFileList()) as $item) { - if (stristr(basename($item), 'config.m4') && dirname($item) != '.') { - $dir .= DIRECTORY_SEPARATOR . dirname($item); - break; - } - } - - $old_cwd = getcwd(); - if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) { - return $this->raiseError("could not chdir to $dir"); - } - - $vdir = $pkg->getPackage() . '-' . $pkg->getVersion(); - if (is_dir($vdir)) { - chdir($vdir); - } - - $dir = getcwd(); - $this->log(2, "building in $dir"); - putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH')); - $err = $this->_runCommand($this->config->get('php_prefix') - . "phpize" . - $this->config->get('php_suffix'), - array(&$this, 'phpizeCallback')); - if (PEAR::isError($err)) { - return $err; - } - - if (!$err) { - return $this->raiseError("`phpize' failed"); - } - - // {{{ start of interactive part - $configure_command = "$dir/configure"; - $configure_options = $pkg->getConfigureOptions(); - if ($configure_options) { - foreach ($configure_options as $o) { - $default = array_key_exists('default', $o) ? $o['default'] : null; - list($r) = $this->ui->userDialog('build', - array($o['prompt']), - array('text'), - array($default)); - if (substr($o['name'], 0, 5) == 'with-' && - ($r == 'yes' || $r == 'autodetect')) { - $configure_command .= " --$o[name]"; - } else { - $configure_command .= " --$o[name]=".trim($r); - } - } - } - // }}} end of interactive part - - // FIXME make configurable - if (!$user=getenv('USER')) { - $user='defaultuser'; - } - - $tmpdir = $this->config->get('temp_dir'); - $build_basedir = System::mktemp(' -t "' . $tmpdir . '" -d "pear-build-' . $user . '"'); - $build_dir = "$build_basedir/$vdir"; - $inst_dir = "$build_basedir/install-$vdir"; - $this->log(1, "building in $build_dir"); - if (is_dir($build_dir)) { - System::rm(array('-rf', $build_dir)); - } - - if (!System::mkDir(array('-p', $build_dir))) { - return $this->raiseError("could not create build dir: $build_dir"); - } - - $this->addTempFile($build_dir); - if (!System::mkDir(array('-p', $inst_dir))) { - return $this->raiseError("could not create temporary install dir: $inst_dir"); - } - $this->addTempFile($inst_dir); - - $make_command = getenv('MAKE') ? getenv('MAKE') : 'make'; - - $to_run = array( - $configure_command, - $make_command, - "$make_command INSTALL_ROOT=\"$inst_dir\" install", - "find \"$inst_dir\" | xargs ls -dils" - ); - if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) { - return $this->raiseError("could not chdir to $build_dir"); - } - putenv('PHP_PEAR_VERSION=1.9.4'); - foreach ($to_run as $cmd) { - $err = $this->_runCommand($cmd, $callback); - if (PEAR::isError($err)) { - chdir($old_cwd); - return $err; - } - if (!$err) { - chdir($old_cwd); - return $this->raiseError("`$cmd' failed"); - } - } - if (!($dp = opendir("modules"))) { - chdir($old_cwd); - return $this->raiseError("no `modules' directory found"); - } - $built_files = array(); - $prefix = exec($this->config->get('php_prefix') - . "php-config" . - $this->config->get('php_suffix') . " --prefix"); - $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files); - chdir($old_cwd); - return $built_files; - } - - /** - * Message callback function used when running the "phpize" - * program. Extracts the API numbers used. Ignores other message - * types than "cmdoutput". - * - * @param string $what the type of message - * @param mixed $data the message - * - * @return void - * - * @access public - */ - function phpizeCallback($what, $data) - { - if ($what != 'cmdoutput') { - return; - } - $this->log(1, rtrim($data)); - if (preg_match('/You should update your .aclocal.m4/', $data)) { - return; - } - $matches = array(); - if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) { - $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1])); - $apino = (int)$matches[2]; - if (isset($this->$member)) { - $this->$member = $apino; - //$msg = sprintf("%-22s : %d", $matches[1], $apino); - //$this->log(1, $msg); - } - } - } - - /** - * Run an external command, using a message callback to report - * output. The command will be run through popen and output is - * reported for every line with a "cmdoutput" message with the - * line string, including newlines, as payload. - * - * @param string $command the command to run - * - * @param mixed $callback (optional) function to use as message - * callback - * - * @return bool whether the command was successful (exit code 0 - * means success, any other means failure) - * - * @access private - */ - function _runCommand($command, $callback = null) - { - $this->log(1, "running: $command"); - $pp = popen("$command 2>&1", "r"); - if (!$pp) { - return $this->raiseError("failed to run `$command'"); - } - if ($callback && $callback[0]->debug == 1) { - $olddbg = $callback[0]->debug; - $callback[0]->debug = 2; - } - - while ($line = fgets($pp, 1024)) { - if ($callback) { - call_user_func($callback, 'cmdoutput', $line); - } else { - $this->log(2, rtrim($line)); - } - } - if ($callback && isset($olddbg)) { - $callback[0]->debug = $olddbg; - } - - $exitcode = is_resource($pp) ? pclose($pp) : -1; - return ($exitcode == 0); - } - - function log($level, $msg) - { - if ($this->current_callback) { - if ($this->debug >= $level) { - call_user_func($this->current_callback, 'output', $msg); - } - return; - } - return PEAR_Common::log($level, $msg); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/ChannelFile.php b/3rdparty/PEAR/ChannelFile.php deleted file mode 100644 index f2c02ab42b..0000000000 --- a/3rdparty/PEAR/ChannelFile.php +++ /dev/null @@ -1,1559 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: ChannelFile.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Needed for error handling - */ -require_once 'PEAR/ErrorStack.php'; -require_once 'PEAR/XMLParser.php'; -require_once 'PEAR/Common.php'; - -/** - * Error code if the channel.xml tag does not contain a valid version - */ -define('PEAR_CHANNELFILE_ERROR_NO_VERSION', 1); -/** - * Error code if the channel.xml tag version is not supported (version 1.0 is the only supported version, - * currently - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_VERSION', 2); - -/** - * Error code if parsing is attempted with no xml extension - */ -define('PEAR_CHANNELFILE_ERROR_NO_XML_EXT', 3); - -/** - * Error code if creating the xml parser resource fails - */ -define('PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER', 4); - -/** - * Error code used for all sax xml parsing errors - */ -define('PEAR_CHANNELFILE_ERROR_PARSER_ERROR', 5); - -/**#@+ - * Validation errors - */ -/** - * Error code when channel name is missing - */ -define('PEAR_CHANNELFILE_ERROR_NO_NAME', 6); -/** - * Error code when channel name is invalid - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_NAME', 7); -/** - * Error code when channel summary is missing - */ -define('PEAR_CHANNELFILE_ERROR_NO_SUMMARY', 8); -/** - * Error code when channel summary is multi-line - */ -define('PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY', 9); -/** - * Error code when channel server is missing for protocol - */ -define('PEAR_CHANNELFILE_ERROR_NO_HOST', 10); -/** - * Error code when channel server is invalid for protocol - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_HOST', 11); -/** - * Error code when a mirror name is invalid - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_MIRROR', 21); -/** - * Error code when a mirror type is invalid - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE', 22); -/** - * Error code when an attempt is made to generate xml, but the parsed content is invalid - */ -define('PEAR_CHANNELFILE_ERROR_INVALID', 23); -/** - * Error code when an empty package name validate regex is passed in - */ -define('PEAR_CHANNELFILE_ERROR_EMPTY_REGEX', 24); -/** - * Error code when a tag has no version - */ -define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION', 25); -/** - * Error code when a tag has no name - */ -define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME', 26); -/** - * Error code when a tag has no name - */ -define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME', 27); -/** - * Error code when a tag has no version attribute - */ -define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION', 28); -/** - * Error code when a mirror does not exist but is called for in one of the set* - * methods. - */ -define('PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND', 32); -/** - * Error code when a server port is not numeric - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_PORT', 33); -/** - * Error code when contains no version attribute - */ -define('PEAR_CHANNELFILE_ERROR_NO_STATICVERSION', 34); -/** - * Error code when contains no type attribute in a protocol definition - */ -define('PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE', 35); -/** - * Error code when a mirror is defined and the channel.xml represents the __uri pseudo-channel - */ -define('PEAR_CHANNELFILE_URI_CANT_MIRROR', 36); -/** - * Error code when ssl attribute is present and is not "yes" - */ -define('PEAR_CHANNELFILE_ERROR_INVALID_SSL', 37); -/**#@-*/ - -/** - * Mirror types allowed. Currently only internet servers are recognized. - */ -$GLOBALS['_PEAR_CHANNELS_MIRROR_TYPES'] = array('server'); - - -/** - * The Channel handling class - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_ChannelFile -{ - /** - * @access private - * @var PEAR_ErrorStack - * @access private - */ - var $_stack; - - /** - * Supported channel.xml versions, for parsing - * @var array - * @access private - */ - var $_supportedVersions = array('1.0'); - - /** - * Parsed channel information - * @var array - * @access private - */ - var $_channelInfo; - - /** - * index into the subchannels array, used for parsing xml - * @var int - * @access private - */ - var $_subchannelIndex; - - /** - * index into the mirrors array, used for parsing xml - * @var int - * @access private - */ - var $_mirrorIndex; - - /** - * Flag used to determine the validity of parsed content - * @var boolean - * @access private - */ - var $_isValid = false; - - function PEAR_ChannelFile() - { - $this->_stack = &new PEAR_ErrorStack('PEAR_ChannelFile'); - $this->_stack->setErrorMessageTemplate($this->_getErrorMessage()); - $this->_isValid = false; - } - - /** - * @return array - * @access protected - */ - function _getErrorMessage() - { - return - array( - PEAR_CHANNELFILE_ERROR_INVALID_VERSION => - 'While parsing channel.xml, an invalid version number "%version% was passed in, expecting one of %versions%', - PEAR_CHANNELFILE_ERROR_NO_VERSION => - 'No version number found in tag', - PEAR_CHANNELFILE_ERROR_NO_XML_EXT => - '%error%', - PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER => - 'Unable to create XML parser', - PEAR_CHANNELFILE_ERROR_PARSER_ERROR => - '%error%', - PEAR_CHANNELFILE_ERROR_NO_NAME => - 'Missing channel name', - PEAR_CHANNELFILE_ERROR_INVALID_NAME => - 'Invalid channel %tag% "%name%"', - PEAR_CHANNELFILE_ERROR_NO_SUMMARY => - 'Missing channel summary', - PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY => - 'Channel summary should be on one line, but is multi-line', - PEAR_CHANNELFILE_ERROR_NO_HOST => - 'Missing channel server for %type% server', - PEAR_CHANNELFILE_ERROR_INVALID_HOST => - 'Server name "%server%" is invalid for %type% server', - PEAR_CHANNELFILE_ERROR_INVALID_MIRROR => - 'Invalid mirror name "%name%", mirror type %type%', - PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE => - 'Invalid mirror type "%type%"', - PEAR_CHANNELFILE_ERROR_INVALID => - 'Cannot generate xml, contents are invalid', - PEAR_CHANNELFILE_ERROR_EMPTY_REGEX => - 'packagenameregex cannot be empty', - PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION => - '%parent% %protocol% function has no version', - PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME => - '%parent% %protocol% function has no name', - PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE => - '%parent% rest baseurl has no type', - PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME => - 'Validation package has no name in tag', - PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION => - 'Validation package "%package%" has no version', - PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND => - 'Mirror "%mirror%" does not exist', - PEAR_CHANNELFILE_ERROR_INVALID_PORT => - 'Port "%port%" must be numeric', - PEAR_CHANNELFILE_ERROR_NO_STATICVERSION => - ' tag must contain version attribute', - PEAR_CHANNELFILE_URI_CANT_MIRROR => - 'The __uri pseudo-channel cannot have mirrors', - PEAR_CHANNELFILE_ERROR_INVALID_SSL => - '%server% has invalid ssl attribute "%ssl%" can only be yes or not present', - ); - } - - /** - * @param string contents of package.xml file - * @return bool success of parsing - */ - function fromXmlString($data) - { - if (preg_match('/_supportedVersions)) { - $this->_stack->push(PEAR_CHANNELFILE_ERROR_INVALID_VERSION, 'error', - array('version' => $channelversion[1])); - return false; - } - $parser = new PEAR_XMLParser; - $result = $parser->parse($data); - if ($result !== true) { - if ($result->getCode() == 1) { - $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_XML_EXT, 'error', - array('error' => $result->getMessage())); - } else { - $this->_stack->push(PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER, 'error'); - } - return false; - } - $this->_channelInfo = $parser->getData(); - return true; - } else { - $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_VERSION, 'error', array('xml' => $data)); - return false; - } - } - - /** - * @return array - */ - function toArray() - { - if (!$this->_isValid && !$this->validate()) { - return false; - } - return $this->_channelInfo; - } - - /** - * @param array - * @static - * @return PEAR_ChannelFile|false false if invalid - */ - function &fromArray($data, $compatibility = false, $stackClass = 'PEAR_ErrorStack') - { - $a = new PEAR_ChannelFile($compatibility, $stackClass); - $a->_fromArray($data); - if (!$a->validate()) { - $a = false; - return $a; - } - return $a; - } - - /** - * Unlike {@link fromArray()} this does not do any validation - * @param array - * @static - * @return PEAR_ChannelFile - */ - function &fromArrayWithErrors($data, $compatibility = false, - $stackClass = 'PEAR_ErrorStack') - { - $a = new PEAR_ChannelFile($compatibility, $stackClass); - $a->_fromArray($data); - return $a; - } - - /** - * @param array - * @access private - */ - function _fromArray($data) - { - $this->_channelInfo = $data; - } - - /** - * Wrapper to {@link PEAR_ErrorStack::getErrors()} - * @param boolean determines whether to purge the error stack after retrieving - * @return array - */ - function getErrors($purge = false) - { - return $this->_stack->getErrors($purge); - } - - /** - * Unindent given string (?) - * - * @param string $str The string that has to be unindented. - * @return string - * @access private - */ - function _unIndent($str) - { - // remove leading newlines - $str = preg_replace('/^[\r\n]+/', '', $str); - // find whitespace at the beginning of the first line - $indent_len = strspn($str, " \t"); - $indent = substr($str, 0, $indent_len); - $data = ''; - // remove the same amount of whitespace from following lines - foreach (explode("\n", $str) as $line) { - if (substr($line, 0, $indent_len) == $indent) { - $data .= substr($line, $indent_len) . "\n"; - } - } - return $data; - } - - /** - * Parse a channel.xml file. Expects the name of - * a channel xml file as input. - * - * @param string $descfile name of channel xml file - * @return bool success of parsing - */ - function fromXmlFile($descfile) - { - if (!file_exists($descfile) || !is_file($descfile) || !is_readable($descfile) || - (!$fp = fopen($descfile, 'r'))) { - require_once 'PEAR.php'; - return PEAR::raiseError("Unable to open $descfile"); - } - - // read the whole thing so we only get one cdata callback - // for each block of cdata - fclose($fp); - $data = file_get_contents($descfile); - return $this->fromXmlString($data); - } - - /** - * Parse channel information from different sources - * - * This method is able to extract information about a channel - * from an .xml file or a string - * - * @access public - * @param string Filename of the source or the source itself - * @return bool - */ - function fromAny($info) - { - if (is_string($info) && file_exists($info) && strlen($info) < 255) { - $tmp = substr($info, -4); - if ($tmp == '.xml') { - $info = $this->fromXmlFile($info); - } else { - $fp = fopen($info, "r"); - $test = fread($fp, 5); - fclose($fp); - if ($test == "fromXmlFile($info); - } - } - if (PEAR::isError($info)) { - require_once 'PEAR.php'; - return PEAR::raiseError($info); - } - } - if (is_string($info)) { - $info = $this->fromXmlString($info); - } - return $info; - } - - /** - * Return an XML document based on previous parsing and modifications - * - * @return string XML data - * - * @access public - */ - function toXml() - { - if (!$this->_isValid && !$this->validate()) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID); - return false; - } - if (!isset($this->_channelInfo['attribs']['version'])) { - $this->_channelInfo['attribs']['version'] = '1.0'; - } - $channelInfo = $this->_channelInfo; - $ret = "\n"; - $ret .= " - $channelInfo[name] - " . htmlspecialchars($channelInfo['summary'])." -"; - if (isset($channelInfo['suggestedalias'])) { - $ret .= ' ' . $channelInfo['suggestedalias'] . "\n"; - } - if (isset($channelInfo['validatepackage'])) { - $ret .= ' ' . - htmlspecialchars($channelInfo['validatepackage']['_content']) . - "\n"; - } - $ret .= " \n"; - $ret .= ' _makeRestXml($channelInfo['servers']['primary']['rest'], ' '); - } - $ret .= " \n"; - if (isset($channelInfo['servers']['mirror'])) { - $ret .= $this->_makeMirrorsXml($channelInfo); - } - $ret .= " \n"; - $ret .= ""; - return str_replace("\r", "\n", str_replace("\r\n", "\n", $ret)); - } - - /** - * Generate the tag - * @access private - */ - function _makeRestXml($info, $indent) - { - $ret = $indent . "\n"; - if (isset($info['baseurl']) && !isset($info['baseurl'][0])) { - $info['baseurl'] = array($info['baseurl']); - } - - if (isset($info['baseurl'])) { - foreach ($info['baseurl'] as $url) { - $ret .= "$indent \n"; - } - } - $ret .= $indent . "\n"; - return $ret; - } - - /** - * Generate the tag - * @access private - */ - function _makeMirrorsXml($channelInfo) - { - $ret = ""; - if (!isset($channelInfo['servers']['mirror'][0])) { - $channelInfo['servers']['mirror'] = array($channelInfo['servers']['mirror']); - } - foreach ($channelInfo['servers']['mirror'] as $mirror) { - $ret .= ' _makeRestXml($mirror['rest'], ' '); - } - $ret .= " \n"; - } else { - $ret .= "/>\n"; - } - } - return $ret; - } - - /** - * Generate the tag - * @access private - */ - function _makeFunctionsXml($functions, $indent, $rest = false) - { - $ret = ''; - if (!isset($functions[0])) { - $functions = array($functions); - } - foreach ($functions as $function) { - $ret .= "$indent\n"; - } - return $ret; - } - - /** - * Validation error. Also marks the object contents as invalid - * @param error code - * @param array error information - * @access private - */ - function _validateError($code, $params = array()) - { - $this->_stack->push($code, 'error', $params); - $this->_isValid = false; - } - - /** - * Validation warning. Does not mark the object contents invalid. - * @param error code - * @param array error information - * @access private - */ - function _validateWarning($code, $params = array()) - { - $this->_stack->push($code, 'warning', $params); - } - - /** - * Validate parsed file. - * - * @access public - * @return boolean - */ - function validate() - { - $this->_isValid = true; - $info = $this->_channelInfo; - if (empty($info['name'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_NAME); - } elseif (!$this->validChannelServer($info['name'])) { - if ($info['name'] != '__uri') { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, array('tag' => 'name', - 'name' => $info['name'])); - } - } - if (empty($info['summary'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY); - } elseif (strpos(trim($info['summary']), "\n") !== false) { - $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY, - array('summary' => $info['summary'])); - } - if (isset($info['suggestedalias'])) { - if (!$this->validChannelServer($info['suggestedalias'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, - array('tag' => 'suggestedalias', 'name' =>$info['suggestedalias'])); - } - } - if (isset($info['localalias'])) { - if (!$this->validChannelServer($info['localalias'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, - array('tag' => 'localalias', 'name' =>$info['localalias'])); - } - } - if (isset($info['validatepackage'])) { - if (!isset($info['validatepackage']['_content'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME); - } - if (!isset($info['validatepackage']['attribs']['version'])) { - $content = isset($info['validatepackage']['_content']) ? - $info['validatepackage']['_content'] : - null; - $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION, - array('package' => $content)); - } - } - - if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['port']) && - !is_numeric($info['servers']['primary']['attribs']['port'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_PORT, - array('port' => $info['servers']['primary']['attribs']['port'])); - } - - if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['ssl']) && - $info['servers']['primary']['attribs']['ssl'] != 'yes') { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL, - array('ssl' => $info['servers']['primary']['attribs']['ssl'], - 'server' => $info['name'])); - } - - if (isset($info['servers']['primary']['rest']) && - isset($info['servers']['primary']['rest']['baseurl'])) { - $this->_validateFunctions('rest', $info['servers']['primary']['rest']['baseurl']); - } - if (isset($info['servers']['mirror'])) { - if ($this->_channelInfo['name'] == '__uri') { - $this->_validateError(PEAR_CHANNELFILE_URI_CANT_MIRROR); - } - if (!isset($info['servers']['mirror'][0])) { - $info['servers']['mirror'] = array($info['servers']['mirror']); - } - foreach ($info['servers']['mirror'] as $mirror) { - if (!isset($mirror['attribs']['host'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_HOST, - array('type' => 'mirror')); - } elseif (!$this->validChannelServer($mirror['attribs']['host'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_HOST, - array('server' => $mirror['attribs']['host'], 'type' => 'mirror')); - } - if (isset($mirror['attribs']['ssl']) && $mirror['attribs']['ssl'] != 'yes') { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL, - array('ssl' => $info['ssl'], 'server' => $mirror['attribs']['host'])); - } - if (isset($mirror['rest'])) { - $this->_validateFunctions('rest', $mirror['rest']['baseurl'], - $mirror['attribs']['host']); - } - } - } - return $this->_isValid; - } - - /** - * @param string rest - protocol name this function applies to - * @param array the functions - * @param string the name of the parent element (mirror name, for instance) - */ - function _validateFunctions($protocol, $functions, $parent = '') - { - if (!isset($functions[0])) { - $functions = array($functions); - } - - foreach ($functions as $function) { - if (!isset($function['_content']) || empty($function['_content'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME, - array('parent' => $parent, 'protocol' => $protocol)); - } - - if ($protocol == 'rest') { - if (!isset($function['attribs']['type']) || - empty($function['attribs']['type'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE, - array('parent' => $parent, 'protocol' => $protocol)); - } - } else { - if (!isset($function['attribs']['version']) || - empty($function['attribs']['version'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION, - array('parent' => $parent, 'protocol' => $protocol)); - } - } - } - } - - /** - * Test whether a string contains a valid channel server. - * @param string $ver the package version to test - * @return bool - */ - function validChannelServer($server) - { - if ($server == '__uri') { - return true; - } - return (bool) preg_match(PEAR_CHANNELS_SERVER_PREG, $server); - } - - /** - * @return string|false - */ - function getName() - { - if (isset($this->_channelInfo['name'])) { - return $this->_channelInfo['name']; - } - - return false; - } - - /** - * @return string|false - */ - function getServer() - { - if (isset($this->_channelInfo['name'])) { - return $this->_channelInfo['name']; - } - - return false; - } - - /** - * @return int|80 port number to connect to - */ - function getPort($mirror = false) - { - if ($mirror) { - if ($mir = $this->getMirror($mirror)) { - if (isset($mir['attribs']['port'])) { - return $mir['attribs']['port']; - } - - if ($this->getSSL($mirror)) { - return 443; - } - - return 80; - } - - return false; - } - - if (isset($this->_channelInfo['servers']['primary']['attribs']['port'])) { - return $this->_channelInfo['servers']['primary']['attribs']['port']; - } - - if ($this->getSSL()) { - return 443; - } - - return 80; - } - - /** - * @return bool Determines whether secure sockets layer (SSL) is used to connect to this channel - */ - function getSSL($mirror = false) - { - if ($mirror) { - if ($mir = $this->getMirror($mirror)) { - if (isset($mir['attribs']['ssl'])) { - return true; - } - - return false; - } - - return false; - } - - if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) { - return true; - } - - return false; - } - - /** - * @return string|false - */ - function getSummary() - { - if (isset($this->_channelInfo['summary'])) { - return $this->_channelInfo['summary']; - } - - return false; - } - - /** - * @param string protocol type - * @param string Mirror name - * @return array|false - */ - function getFunctions($protocol, $mirror = false) - { - if ($this->getName() == '__uri') { - return false; - } - - $function = $protocol == 'rest' ? 'baseurl' : 'function'; - if ($mirror) { - if ($mir = $this->getMirror($mirror)) { - if (isset($mir[$protocol][$function])) { - return $mir[$protocol][$function]; - } - } - - return false; - } - - if (isset($this->_channelInfo['servers']['primary'][$protocol][$function])) { - return $this->_channelInfo['servers']['primary'][$protocol][$function]; - } - - return false; - } - - /** - * @param string Protocol type - * @param string Function name (null to return the - * first protocol of the type requested) - * @param string Mirror name, if any - * @return array - */ - function getFunction($type, $name = null, $mirror = false) - { - $protocols = $this->getFunctions($type, $mirror); - if (!$protocols) { - return false; - } - - foreach ($protocols as $protocol) { - if ($name === null) { - return $protocol; - } - - if ($protocol['_content'] != $name) { - continue; - } - - return $protocol; - } - - return false; - } - - /** - * @param string protocol type - * @param string protocol name - * @param string version - * @param string mirror name - * @return boolean - */ - function supports($type, $name = null, $mirror = false, $version = '1.0') - { - $protocols = $this->getFunctions($type, $mirror); - if (!$protocols) { - return false; - } - - foreach ($protocols as $protocol) { - if ($protocol['attribs']['version'] != $version) { - continue; - } - - if ($name === null) { - return true; - } - - if ($protocol['_content'] != $name) { - continue; - } - - return true; - } - - return false; - } - - /** - * Determines whether a channel supports Representational State Transfer (REST) protocols - * for retrieving channel information - * @param string - * @return bool - */ - function supportsREST($mirror = false) - { - if ($mirror == $this->_channelInfo['name']) { - $mirror = false; - } - - if ($mirror) { - if ($mir = $this->getMirror($mirror)) { - return isset($mir['rest']); - } - - return false; - } - - return isset($this->_channelInfo['servers']['primary']['rest']); - } - - /** - * Get the URL to access a base resource. - * - * Hyperlinks in the returned xml will be used to retrieve the proper information - * needed. This allows extreme extensibility and flexibility in implementation - * @param string Resource Type to retrieve - */ - function getBaseURL($resourceType, $mirror = false) - { - if ($mirror == $this->_channelInfo['name']) { - $mirror = false; - } - - if ($mirror) { - $mir = $this->getMirror($mirror); - if (!$mir) { - return false; - } - - $rest = $mir['rest']; - } else { - $rest = $this->_channelInfo['servers']['primary']['rest']; - } - - if (!isset($rest['baseurl'][0])) { - $rest['baseurl'] = array($rest['baseurl']); - } - - foreach ($rest['baseurl'] as $baseurl) { - if (strtolower($baseurl['attribs']['type']) == strtolower($resourceType)) { - return $baseurl['_content']; - } - } - - return false; - } - - /** - * Since REST does not implement RPC, provide this as a logical wrapper around - * resetFunctions for REST - * @param string|false mirror name, if any - */ - function resetREST($mirror = false) - { - return $this->resetFunctions('rest', $mirror); - } - - /** - * Empty all protocol definitions - * @param string protocol type - * @param string|false mirror name, if any - */ - function resetFunctions($type, $mirror = false) - { - if ($mirror) { - if (isset($this->_channelInfo['servers']['mirror'])) { - $mirrors = $this->_channelInfo['servers']['mirror']; - if (!isset($mirrors[0])) { - $mirrors = array($mirrors); - } - - foreach ($mirrors as $i => $mir) { - if ($mir['attribs']['host'] == $mirror) { - if (isset($this->_channelInfo['servers']['mirror'][$i][$type])) { - unset($this->_channelInfo['servers']['mirror'][$i][$type]); - } - - return true; - } - } - - return false; - } - - return false; - } - - if (isset($this->_channelInfo['servers']['primary'][$type])) { - unset($this->_channelInfo['servers']['primary'][$type]); - } - - return true; - } - - /** - * Set a channel's protocols to the protocols supported by pearweb - */ - function setDefaultPEARProtocols($version = '1.0', $mirror = false) - { - switch ($version) { - case '1.0' : - $this->resetREST($mirror); - - if (!isset($this->_channelInfo['servers'])) { - $this->_channelInfo['servers'] = array('primary' => - array('rest' => array())); - } elseif (!isset($this->_channelInfo['servers']['primary'])) { - $this->_channelInfo['servers']['primary'] = array('rest' => array()); - } - - return true; - break; - default : - return false; - break; - } - } - - /** - * @return array - */ - function getMirrors() - { - if (isset($this->_channelInfo['servers']['mirror'])) { - $mirrors = $this->_channelInfo['servers']['mirror']; - if (!isset($mirrors[0])) { - $mirrors = array($mirrors); - } - - return $mirrors; - } - - return array(); - } - - /** - * Get the unserialized XML representing a mirror - * @return array|false - */ - function getMirror($server) - { - foreach ($this->getMirrors() as $mirror) { - if ($mirror['attribs']['host'] == $server) { - return $mirror; - } - } - - return false; - } - - /** - * @param string - * @return string|false - * @error PEAR_CHANNELFILE_ERROR_NO_NAME - * @error PEAR_CHANNELFILE_ERROR_INVALID_NAME - */ - function setName($name) - { - return $this->setServer($name); - } - - /** - * Set the socket number (port) that is used to connect to this channel - * @param integer - * @param string|false name of the mirror server, or false for the primary - */ - function setPort($port, $mirror = false) - { - if ($mirror) { - if (!isset($this->_channelInfo['servers']['mirror'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - if (isset($this->_channelInfo['servers']['mirror'][0])) { - foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) { - if ($mirror == $mir['attribs']['host']) { - $this->_channelInfo['servers']['mirror'][$i]['attribs']['port'] = $port; - return true; - } - } - - return false; - } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) { - $this->_channelInfo['servers']['mirror']['attribs']['port'] = $port; - $this->_isValid = false; - return true; - } - } - - $this->_channelInfo['servers']['primary']['attribs']['port'] = $port; - $this->_isValid = false; - return true; - } - - /** - * Set the socket number (port) that is used to connect to this channel - * @param bool Determines whether to turn on SSL support or turn it off - * @param string|false name of the mirror server, or false for the primary - */ - function setSSL($ssl = true, $mirror = false) - { - if ($mirror) { - if (!isset($this->_channelInfo['servers']['mirror'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - if (isset($this->_channelInfo['servers']['mirror'][0])) { - foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) { - if ($mirror == $mir['attribs']['host']) { - if (!$ssl) { - if (isset($this->_channelInfo['servers']['mirror'][$i] - ['attribs']['ssl'])) { - unset($this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl']); - } - } else { - $this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl'] = 'yes'; - } - - return true; - } - } - - return false; - } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) { - if (!$ssl) { - if (isset($this->_channelInfo['servers']['mirror']['attribs']['ssl'])) { - unset($this->_channelInfo['servers']['mirror']['attribs']['ssl']); - } - } else { - $this->_channelInfo['servers']['mirror']['attribs']['ssl'] = 'yes'; - } - - $this->_isValid = false; - return true; - } - } - - if ($ssl) { - $this->_channelInfo['servers']['primary']['attribs']['ssl'] = 'yes'; - } else { - if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) { - unset($this->_channelInfo['servers']['primary']['attribs']['ssl']); - } - } - - $this->_isValid = false; - return true; - } - - /** - * @param string - * @return string|false - * @error PEAR_CHANNELFILE_ERROR_NO_SERVER - * @error PEAR_CHANNELFILE_ERROR_INVALID_SERVER - */ - function setServer($server, $mirror = false) - { - if (empty($server)) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SERVER); - return false; - } elseif (!$this->validChannelServer($server)) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, - array('tag' => 'name', 'name' => $server)); - return false; - } - - if ($mirror) { - $found = false; - foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) { - if ($mirror == $mir['attribs']['host']) { - $found = true; - break; - } - } - - if (!$found) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - $this->_channelInfo['mirror'][$i]['attribs']['host'] = $server; - return true; - } - - $this->_channelInfo['name'] = $server; - return true; - } - - /** - * @param string - * @return boolean success - * @error PEAR_CHANNELFILE_ERROR_NO_SUMMARY - * @warning PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY - */ - function setSummary($summary) - { - if (empty($summary)) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY); - return false; - } elseif (strpos(trim($summary), "\n") !== false) { - $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY, - array('summary' => $summary)); - } - - $this->_channelInfo['summary'] = $summary; - return true; - } - - /** - * @param string - * @param boolean determines whether the alias is in channel.xml or local - * @return boolean success - */ - function setAlias($alias, $local = false) - { - if (!$this->validChannelServer($alias)) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, - array('tag' => 'suggestedalias', 'name' => $alias)); - return false; - } - - if ($local) { - $this->_channelInfo['localalias'] = $alias; - } else { - $this->_channelInfo['suggestedalias'] = $alias; - } - - return true; - } - - /** - * @return string - */ - function getAlias() - { - if (isset($this->_channelInfo['localalias'])) { - return $this->_channelInfo['localalias']; - } - if (isset($this->_channelInfo['suggestedalias'])) { - return $this->_channelInfo['suggestedalias']; - } - if (isset($this->_channelInfo['name'])) { - return $this->_channelInfo['name']; - } - return ''; - } - - /** - * Set the package validation object if it differs from PEAR's default - * The class must be includeable via changing _ in the classname to path separator, - * but no checking of this is made. - * @param string|false pass in false to reset to the default packagename regex - * @return boolean success - */ - function setValidationPackage($validateclass, $version) - { - if (empty($validateclass)) { - unset($this->_channelInfo['validatepackage']); - } - $this->_channelInfo['validatepackage'] = array('_content' => $validateclass); - $this->_channelInfo['validatepackage']['attribs'] = array('version' => $version); - } - - /** - * Add a protocol to the provides section - * @param string protocol type - * @param string protocol version - * @param string protocol name, if any - * @param string mirror name, if this is a mirror's protocol - * @return bool - */ - function addFunction($type, $version, $name = '', $mirror = false) - { - if ($mirror) { - return $this->addMirrorFunction($mirror, $type, $version, $name); - } - - $set = array('attribs' => array('version' => $version), '_content' => $name); - if (!isset($this->_channelInfo['servers']['primary'][$type]['function'])) { - if (!isset($this->_channelInfo['servers'])) { - $this->_channelInfo['servers'] = array('primary' => - array($type => array())); - } elseif (!isset($this->_channelInfo['servers']['primary'])) { - $this->_channelInfo['servers']['primary'] = array($type => array()); - } - - $this->_channelInfo['servers']['primary'][$type]['function'] = $set; - $this->_isValid = false; - return true; - } elseif (!isset($this->_channelInfo['servers']['primary'][$type]['function'][0])) { - $this->_channelInfo['servers']['primary'][$type]['function'] = array( - $this->_channelInfo['servers']['primary'][$type]['function']); - } - - $this->_channelInfo['servers']['primary'][$type]['function'][] = $set; - return true; - } - /** - * Add a protocol to a mirror's provides section - * @param string mirror name (server) - * @param string protocol type - * @param string protocol version - * @param string protocol name, if any - */ - function addMirrorFunction($mirror, $type, $version, $name = '') - { - if (!isset($this->_channelInfo['servers']['mirror'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - $setmirror = false; - if (isset($this->_channelInfo['servers']['mirror'][0])) { - foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) { - if ($mirror == $mir['attribs']['host']) { - $setmirror = &$this->_channelInfo['servers']['mirror'][$i]; - break; - } - } - } else { - if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) { - $setmirror = &$this->_channelInfo['servers']['mirror']; - } - } - - if (!$setmirror) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - $set = array('attribs' => array('version' => $version), '_content' => $name); - if (!isset($setmirror[$type]['function'])) { - $setmirror[$type]['function'] = $set; - $this->_isValid = false; - return true; - } elseif (!isset($setmirror[$type]['function'][0])) { - $setmirror[$type]['function'] = array($setmirror[$type]['function']); - } - - $setmirror[$type]['function'][] = $set; - $this->_isValid = false; - return true; - } - - /** - * @param string Resource Type this url links to - * @param string URL - * @param string|false mirror name, if this is not a primary server REST base URL - */ - function setBaseURL($resourceType, $url, $mirror = false) - { - if ($mirror) { - if (!isset($this->_channelInfo['servers']['mirror'])) { - $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND, - array('mirror' => $mirror)); - return false; - } - - $setmirror = false; - if (isset($this->_channelInfo['servers']['mirror'][0])) { - foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) { - if ($mirror == $mir['attribs']['host']) { - $setmirror = &$this->_channelInfo['servers']['mirror'][$i]; - break; - } - } - } else { - if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) { - $setmirror = &$this->_channelInfo['servers']['mirror']; - } - } - } else { - $setmirror = &$this->_channelInfo['servers']['primary']; - } - - $set = array('attribs' => array('type' => $resourceType), '_content' => $url); - if (!isset($setmirror['rest'])) { - $setmirror['rest'] = array(); - } - - if (!isset($setmirror['rest']['baseurl'])) { - $setmirror['rest']['baseurl'] = $set; - $this->_isValid = false; - return true; - } elseif (!isset($setmirror['rest']['baseurl'][0])) { - $setmirror['rest']['baseurl'] = array($setmirror['rest']['baseurl']); - } - - foreach ($setmirror['rest']['baseurl'] as $i => $url) { - if ($url['attribs']['type'] == $resourceType) { - $this->_isValid = false; - $setmirror['rest']['baseurl'][$i] = $set; - return true; - } - } - - $setmirror['rest']['baseurl'][] = $set; - $this->_isValid = false; - return true; - } - - /** - * @param string mirror server - * @param int mirror http port - * @return boolean - */ - function addMirror($server, $port = null) - { - if ($this->_channelInfo['name'] == '__uri') { - return false; // the __uri channel cannot have mirrors by definition - } - - $set = array('attribs' => array('host' => $server)); - if (is_numeric($port)) { - $set['attribs']['port'] = $port; - } - - if (!isset($this->_channelInfo['servers']['mirror'])) { - $this->_channelInfo['servers']['mirror'] = $set; - return true; - } - - if (!isset($this->_channelInfo['servers']['mirror'][0])) { - $this->_channelInfo['servers']['mirror'] = - array($this->_channelInfo['servers']['mirror']); - } - - $this->_channelInfo['servers']['mirror'][] = $set; - return true; - } - - /** - * Retrieve the name of the validation package for this channel - * @return string|false - */ - function getValidationPackage() - { - if (!$this->_isValid && !$this->validate()) { - return false; - } - - if (!isset($this->_channelInfo['validatepackage'])) { - return array('attribs' => array('version' => 'default'), - '_content' => 'PEAR_Validate'); - } - - return $this->_channelInfo['validatepackage']; - } - - /** - * Retrieve the object that can be used for custom validation - * @param string|false the name of the package to validate. If the package is - * the channel validation package, PEAR_Validate is returned - * @return PEAR_Validate|false false is returned if the validation package - * cannot be located - */ - function &getValidationObject($package = false) - { - if (!class_exists('PEAR_Validate')) { - require_once 'PEAR/Validate.php'; - } - - if (!$this->_isValid) { - if (!$this->validate()) { - $a = false; - return $a; - } - } - - if (isset($this->_channelInfo['validatepackage'])) { - if ($package == $this->_channelInfo['validatepackage']) { - // channel validation packages are always validated by PEAR_Validate - $val = &new PEAR_Validate; - return $val; - } - - if (!class_exists(str_replace('.', '_', - $this->_channelInfo['validatepackage']['_content']))) { - if ($this->isIncludeable(str_replace('_', '/', - $this->_channelInfo['validatepackage']['_content']) . '.php')) { - include_once str_replace('_', '/', - $this->_channelInfo['validatepackage']['_content']) . '.php'; - $vclass = str_replace('.', '_', - $this->_channelInfo['validatepackage']['_content']); - $val = &new $vclass; - } else { - $a = false; - return $a; - } - } else { - $vclass = str_replace('.', '_', - $this->_channelInfo['validatepackage']['_content']); - $val = &new $vclass; - } - } else { - $val = &new PEAR_Validate; - } - - return $val; - } - - function isIncludeable($path) - { - $possibilities = explode(PATH_SEPARATOR, ini_get('include_path')); - foreach ($possibilities as $dir) { - if (file_exists($dir . DIRECTORY_SEPARATOR . $path) - && is_readable($dir . DIRECTORY_SEPARATOR . $path)) { - return true; - } - } - - return false; - } - - /** - * This function is used by the channel updater and retrieves a value set by - * the registry, or the current time if it has not been set - * @return string - */ - function lastModified() - { - if (isset($this->_channelInfo['_lastmodified'])) { - return $this->_channelInfo['_lastmodified']; - } - - return time(); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/ChannelFile/Parser.php b/3rdparty/PEAR/ChannelFile/Parser.php deleted file mode 100644 index e630ace224..0000000000 --- a/3rdparty/PEAR/ChannelFile/Parser.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Parser.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * base xml parser class - */ -require_once 'PEAR/XMLParser.php'; -require_once 'PEAR/ChannelFile.php'; -/** - * Parser for channel.xml - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_ChannelFile_Parser extends PEAR_XMLParser -{ - var $_config; - var $_logger; - var $_registry; - - function setConfig(&$c) - { - $this->_config = &$c; - $this->_registry = &$c->getRegistry(); - } - - function setLogger(&$l) - { - $this->_logger = &$l; - } - - function parse($data, $file) - { - if (PEAR::isError($err = parent::parse($data, $file))) { - return $err; - } - - $ret = new PEAR_ChannelFile; - $ret->setConfig($this->_config); - if (isset($this->_logger)) { - $ret->setLogger($this->_logger); - } - - $ret->fromArray($this->_unserializedData); - // make sure the filelist is in the easy to read format needed - $ret->flattenFilelist(); - $ret->setPackagefile($file, $archive); - return $ret; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command.php b/3rdparty/PEAR/Command.php deleted file mode 100644 index 13518d4e4b..0000000000 --- a/3rdparty/PEAR/Command.php +++ /dev/null @@ -1,414 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Command.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * Needed for error handling - */ -require_once 'PEAR.php'; -require_once 'PEAR/Frontend.php'; -require_once 'PEAR/XMLParser.php'; - -/** - * List of commands and what classes they are implemented in. - * @var array command => implementing class - */ -$GLOBALS['_PEAR_Command_commandlist'] = array(); - -/** - * List of commands and their descriptions - * @var array command => description - */ -$GLOBALS['_PEAR_Command_commanddesc'] = array(); - -/** - * List of shortcuts to common commands. - * @var array shortcut => command - */ -$GLOBALS['_PEAR_Command_shortcuts'] = array(); - -/** - * Array of command objects - * @var array class => object - */ -$GLOBALS['_PEAR_Command_objects'] = array(); - -/** - * PEAR command class, a simple factory class for administrative - * commands. - * - * How to implement command classes: - * - * - The class must be called PEAR_Command_Nnn, installed in the - * "PEAR/Common" subdir, with a method called getCommands() that - * returns an array of the commands implemented by the class (see - * PEAR/Command/Install.php for an example). - * - * - The class must implement a run() function that is called with three - * params: - * - * (string) command name - * (array) assoc array with options, freely defined by each - * command, for example: - * array('force' => true) - * (array) list of the other parameters - * - * The run() function returns a PEAR_CommandResponse object. Use - * these methods to get information: - * - * int getStatus() Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL) - * *_PARTIAL means that you need to issue at least - * one more command to complete the operation - * (used for example for validation steps). - * - * string getMessage() Returns a message for the user. Remember, - * no HTML or other interface-specific markup. - * - * If something unexpected happens, run() returns a PEAR error. - * - * - DON'T OUTPUT ANYTHING! Return text for output instead. - * - * - DON'T USE HTML! The text you return will be used from both Gtk, - * web and command-line interfaces, so for now, keep everything to - * plain text. - * - * - DON'T USE EXIT OR DIE! Always use pear errors. From static - * classes do PEAR::raiseError(), from other classes do - * $this->raiseError(). - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command -{ - // {{{ factory() - - /** - * Get the right object for executing a command. - * - * @param string $command The name of the command - * @param object $config Instance of PEAR_Config object - * - * @return object the command object or a PEAR error - * - * @access public - * @static - */ - function &factory($command, &$config) - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { - $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; - } - if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { - $a = PEAR::raiseError("unknown command `$command'"); - return $a; - } - $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; - if (!class_exists($class)) { - require_once $GLOBALS['_PEAR_Command_objects'][$class]; - } - if (!class_exists($class)) { - $a = PEAR::raiseError("unknown command `$command'"); - return $a; - } - $ui = PEAR_Command::getFrontendObject(); - $obj = new $class($ui, $config); - return $obj; - } - - // }}} - // {{{ & getObject() - function &getObject($command) - { - $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; - if (!class_exists($class)) { - require_once $GLOBALS['_PEAR_Command_objects'][$class]; - } - if (!class_exists($class)) { - return PEAR::raiseError("unknown command `$command'"); - } - $ui = PEAR_Command::getFrontendObject(); - $config = &PEAR_Config::singleton(); - $obj = &new $class($ui, $config); - return $obj; - } - - // }}} - // {{{ & getFrontendObject() - - /** - * Get instance of frontend object. - * - * @return object|PEAR_Error - * @static - */ - function &getFrontendObject() - { - $a = &PEAR_Frontend::singleton(); - return $a; - } - - // }}} - // {{{ & setFrontendClass() - - /** - * Load current frontend class. - * - * @param string $uiclass Name of class implementing the frontend - * - * @return object the frontend object, or a PEAR error - * @static - */ - function &setFrontendClass($uiclass) - { - $a = &PEAR_Frontend::setFrontendClass($uiclass); - return $a; - } - - // }}} - // {{{ setFrontendType() - - /** - * Set current frontend. - * - * @param string $uitype Name of the frontend type (for example "CLI") - * - * @return object the frontend object, or a PEAR error - * @static - */ - function setFrontendType($uitype) - { - $uiclass = 'PEAR_Frontend_' . $uitype; - return PEAR_Command::setFrontendClass($uiclass); - } - - // }}} - // {{{ registerCommands() - - /** - * Scan through the Command directory looking for classes - * and see what commands they implement. - * - * @param bool (optional) if FALSE (default), the new list of - * commands should replace the current one. If TRUE, - * new entries will be merged with old. - * - * @param string (optional) where (what directory) to look for - * classes, defaults to the Command subdirectory of - * the directory from where this file (__FILE__) is - * included. - * - * @return bool TRUE on success, a PEAR error on failure - * - * @access public - * @static - */ - function registerCommands($merge = false, $dir = null) - { - $parser = new PEAR_XMLParser; - if ($dir === null) { - $dir = dirname(__FILE__) . '/Command'; - } - if (!is_dir($dir)) { - return PEAR::raiseError("registerCommands: opendir($dir) '$dir' does not exist or is not a directory"); - } - $dp = @opendir($dir); - if (empty($dp)) { - return PEAR::raiseError("registerCommands: opendir($dir) failed"); - } - if (!$merge) { - $GLOBALS['_PEAR_Command_commandlist'] = array(); - } - - while ($file = readdir($dp)) { - if ($file{0} == '.' || substr($file, -4) != '.xml') { - continue; - } - - $f = substr($file, 0, -4); - $class = "PEAR_Command_" . $f; - // List of commands - if (empty($GLOBALS['_PEAR_Command_objects'][$class])) { - $GLOBALS['_PEAR_Command_objects'][$class] = "$dir/" . $f . '.php'; - } - - $parser->parse(file_get_contents("$dir/$file")); - $implements = $parser->getData(); - foreach ($implements as $command => $desc) { - if ($command == 'attribs') { - continue; - } - - if (isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { - return PEAR::raiseError('Command "' . $command . '" already registered in ' . - 'class "' . $GLOBALS['_PEAR_Command_commandlist'][$command] . '"'); - } - - $GLOBALS['_PEAR_Command_commandlist'][$command] = $class; - $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc['summary']; - if (isset($desc['shortcut'])) { - $shortcut = $desc['shortcut']; - if (isset($GLOBALS['_PEAR_Command_shortcuts'][$shortcut])) { - return PEAR::raiseError('Command shortcut "' . $shortcut . '" already ' . - 'registered to command "' . $command . '" in class "' . - $GLOBALS['_PEAR_Command_commandlist'][$command] . '"'); - } - $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command; - } - - if (isset($desc['options']) && $desc['options']) { - foreach ($desc['options'] as $oname => $option) { - if (isset($option['shortopt']) && strlen($option['shortopt']) > 1) { - return PEAR::raiseError('Option "' . $oname . '" short option "' . - $option['shortopt'] . '" must be ' . - 'only 1 character in Command "' . $command . '" in class "' . - $class . '"'); - } - } - } - } - } - - ksort($GLOBALS['_PEAR_Command_shortcuts']); - ksort($GLOBALS['_PEAR_Command_commandlist']); - @closedir($dp); - return true; - } - - // }}} - // {{{ getCommands() - - /** - * Get the list of currently supported commands, and what - * classes implement them. - * - * @return array command => implementing class - * - * @access public - * @static - */ - function getCommands() - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - return $GLOBALS['_PEAR_Command_commandlist']; - } - - // }}} - // {{{ getShortcuts() - - /** - * Get the list of command shortcuts. - * - * @return array shortcut => command - * - * @access public - * @static - */ - function getShortcuts() - { - if (empty($GLOBALS['_PEAR_Command_shortcuts'])) { - PEAR_Command::registerCommands(); - } - return $GLOBALS['_PEAR_Command_shortcuts']; - } - - // }}} - // {{{ getGetoptArgs() - - /** - * Compiles arguments for getopt. - * - * @param string $command command to get optstring for - * @param string $short_args (reference) short getopt format - * @param array $long_args (reference) long getopt format - * - * @return void - * - * @access public - * @static - */ - function getGetoptArgs($command, &$short_args, &$long_args) - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { - $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; - } - if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { - return null; - } - $obj = &PEAR_Command::getObject($command); - return $obj->getGetoptArgs($command, $short_args, $long_args); - } - - // }}} - // {{{ getDescription() - - /** - * Get description for a command. - * - * @param string $command Name of the command - * - * @return string command description - * - * @access public - * @static - */ - function getDescription($command) - { - if (!isset($GLOBALS['_PEAR_Command_commanddesc'][$command])) { - return null; - } - return $GLOBALS['_PEAR_Command_commanddesc'][$command]; - } - - // }}} - // {{{ getHelp() - - /** - * Get help for command. - * - * @param string $command Name of the command to return help for - * - * @access public - * @static - */ - function getHelp($command) - { - $cmds = PEAR_Command::getCommands(); - if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { - $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; - } - if (isset($cmds[$command])) { - $obj = &PEAR_Command::getObject($command); - return $obj->getHelp($command); - } - return false; - } - // }}} -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Auth.php b/3rdparty/PEAR/Command/Auth.php deleted file mode 100644 index 63cd152b90..0000000000 --- a/3rdparty/PEAR/Command/Auth.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Auth.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - * @deprecated since 1.8.0alpha1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Channels.php'; - -/** - * PEAR commands for login/logout - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - * @deprecated since 1.8.0alpha1 - */ -class PEAR_Command_Auth extends PEAR_Command_Channels -{ - var $commands = array( - 'login' => array( - 'summary' => 'Connects and authenticates to remote server [Deprecated in favor of channel-login]', - 'shortcut' => 'li', - 'function' => 'doLogin', - 'options' => array(), - 'doc' => ' -WARNING: This function is deprecated in favor of using channel-login - -Log in to a remote channel server. If is not supplied, -the default channel is used. To use remote functions in the installer -that require any kind of privileges, you need to log in first. The -username and password you enter here will be stored in your per-user -PEAR configuration (~/.pearrc on Unix-like systems). After logging -in, your username and password will be sent along in subsequent -operations on the remote server.', - ), - 'logout' => array( - 'summary' => 'Logs out from the remote server [Deprecated in favor of channel-logout]', - 'shortcut' => 'lo', - 'function' => 'doLogout', - 'options' => array(), - 'doc' => ' -WARNING: This function is deprecated in favor of using channel-logout - -Logs out from the remote server. This command does not actually -connect to the remote server, it only deletes the stored username and -password from your user configuration.', - ) - - ); - - /** - * PEAR_Command_Auth constructor. - * - * @access public - */ - function PEAR_Command_Auth(&$ui, &$config) - { - parent::PEAR_Command_Channels($ui, $config); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Auth.xml b/3rdparty/PEAR/Command/Auth.xml deleted file mode 100644 index 590193d142..0000000000 --- a/3rdparty/PEAR/Command/Auth.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - Connects and authenticates to remote server [Deprecated in favor of channel-login] - doLogin - li - - <channel name> -WARNING: This function is deprecated in favor of using channel-login - -Log in to a remote channel server. If <channel name> is not supplied, -the default channel is used. To use remote functions in the installer -that require any kind of privileges, you need to log in first. The -username and password you enter here will be stored in your per-user -PEAR configuration (~/.pearrc on Unix-like systems). After logging -in, your username and password will be sent along in subsequent -operations on the remote server. - - - Logs out from the remote server [Deprecated in favor of channel-logout] - doLogout - lo - - -WARNING: This function is deprecated in favor of using channel-logout - -Logs out from the remote server. This command does not actually -connect to the remote server, it only deletes the stored username and -password from your user configuration. - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Build.php b/3rdparty/PEAR/Command/Build.php deleted file mode 100644 index 1de7320246..0000000000 --- a/3rdparty/PEAR/Command/Build.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Build.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for building extensions. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Build extends PEAR_Command_Common -{ - var $commands = array( - 'build' => array( - 'summary' => 'Build an Extension From C Source', - 'function' => 'doBuild', - 'shortcut' => 'b', - 'options' => array(), - 'doc' => '[package.xml] -Builds one or more extensions contained in a package.' - ), - ); - - /** - * PEAR_Command_Build constructor. - * - * @access public - */ - function PEAR_Command_Build(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function doBuild($command, $options, $params) - { - require_once 'PEAR/Builder.php'; - if (sizeof($params) < 1) { - $params[0] = 'package.xml'; - } - - $builder = &new PEAR_Builder($this->ui); - $this->debug = $this->config->get('verbose'); - $err = $builder->build($params[0], array(&$this, 'buildCallback')); - if (PEAR::isError($err)) { - return $err; - } - - return true; - } - - function buildCallback($what, $data) - { - if (($what == 'cmdoutput' && $this->debug > 1) || - ($what == 'output' && $this->debug > 0)) { - $this->ui->outputData(rtrim($data), 'build'); - } - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Build.xml b/3rdparty/PEAR/Command/Build.xml deleted file mode 100644 index ec4e6f554c..0000000000 --- a/3rdparty/PEAR/Command/Build.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - Build an Extension From C Source - doBuild - b - - [package.xml] -Builds one or more extensions contained in a package. - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Channels.php b/3rdparty/PEAR/Command/Channels.php deleted file mode 100644 index fcf01b5039..0000000000 --- a/3rdparty/PEAR/Command/Channels.php +++ /dev/null @@ -1,883 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Channels.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -define('PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS', -500); - -/** - * PEAR commands for managing channels. - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Command_Channels extends PEAR_Command_Common -{ - var $commands = array( - 'list-channels' => array( - 'summary' => 'List Available Channels', - 'function' => 'doList', - 'shortcut' => 'lc', - 'options' => array(), - 'doc' => ' -List all available channels for installation. -', - ), - 'update-channels' => array( - 'summary' => 'Update the Channel List', - 'function' => 'doUpdateAll', - 'shortcut' => 'uc', - 'options' => array(), - 'doc' => ' -List all installed packages in all channels. -' - ), - 'channel-delete' => array( - 'summary' => 'Remove a Channel From the List', - 'function' => 'doDelete', - 'shortcut' => 'cde', - 'options' => array(), - 'doc' => ' -Delete a channel from the registry. You may not -remove any channel that has installed packages. -' - ), - 'channel-add' => array( - 'summary' => 'Add a Channel', - 'function' => 'doAdd', - 'shortcut' => 'ca', - 'options' => array(), - 'doc' => ' -Add a private channel to the channel list. Note that all -public channels should be synced using "update-channels". -Parameter may be either a local file or remote URL to a -channel.xml. -' - ), - 'channel-update' => array( - 'summary' => 'Update an Existing Channel', - 'function' => 'doUpdate', - 'shortcut' => 'cu', - 'options' => array( - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'will force download of new channel.xml if an existing channel name is used', - ), - 'channel' => array( - 'shortopt' => 'c', - 'arg' => 'CHANNEL', - 'doc' => 'will force download of new channel.xml if an existing channel name is used', - ), -), - 'doc' => '[|] -Update a channel in the channel list directly. Note that all -public channels can be synced using "update-channels". -Parameter may be a local or remote channel.xml, or the name of -an existing channel. -' - ), - 'channel-info' => array( - 'summary' => 'Retrieve Information on a Channel', - 'function' => 'doInfo', - 'shortcut' => 'ci', - 'options' => array(), - 'doc' => ' -List the files in an installed package. -' - ), - 'channel-alias' => array( - 'summary' => 'Specify an alias to a channel name', - 'function' => 'doAlias', - 'shortcut' => 'cha', - 'options' => array(), - 'doc' => ' -Specify a specific alias to use for a channel name. -The alias may not be an existing channel name or -alias. -' - ), - 'channel-discover' => array( - 'summary' => 'Initialize a Channel from its server', - 'function' => 'doDiscover', - 'shortcut' => 'di', - 'options' => array(), - 'doc' => '[|] -Initialize a channel from its server and create a local channel.xml. -If is in the format ":@" then - and will be set as the login username/password for -. Use caution when passing the username/password in this way, as -it may allow other users on your computer to briefly view your username/ -password via the system\'s process list. -' - ), - 'channel-login' => array( - 'summary' => 'Connects and authenticates to remote channel server', - 'shortcut' => 'cli', - 'function' => 'doLogin', - 'options' => array(), - 'doc' => ' -Log in to a remote channel server. If is not supplied, -the default channel is used. To use remote functions in the installer -that require any kind of privileges, you need to log in first. The -username and password you enter here will be stored in your per-user -PEAR configuration (~/.pearrc on Unix-like systems). After logging -in, your username and password will be sent along in subsequent -operations on the remote server.', - ), - 'channel-logout' => array( - 'summary' => 'Logs out from the remote channel server', - 'shortcut' => 'clo', - 'function' => 'doLogout', - 'options' => array(), - 'doc' => ' -Logs out from a remote channel server. If is not supplied, -the default channel is used. This command does not actually connect to the -remote server, it only deletes the stored username and password from your user -configuration.', - ), - ); - - /** - * PEAR_Command_Registry constructor. - * - * @access public - */ - function PEAR_Command_Channels(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function _sortChannels($a, $b) - { - return strnatcasecmp($a->getName(), $b->getName()); - } - - function doList($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - $registered = $reg->getChannels(); - usort($registered, array(&$this, '_sortchannels')); - $i = $j = 0; - $data = array( - 'caption' => 'Registered Channels:', - 'border' => true, - 'headline' => array('Channel', 'Alias', 'Summary') - ); - foreach ($registered as $channel) { - $data['data'][] = array($channel->getName(), - $channel->getAlias(), - $channel->getSummary()); - } - - if (count($registered) === 0) { - $data = '(no registered channels)'; - } - $this->ui->outputData($data, $command); - return true; - } - - function doUpdateAll($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - $channels = $reg->getChannels(); - - $success = true; - foreach ($channels as $channel) { - if ($channel->getName() != '__uri') { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->doUpdate('channel-update', - $options, - array($channel->getName())); - if (PEAR::isError($err)) { - $this->ui->outputData($err->getMessage(), $command); - $success = false; - } else { - $success &= $err; - } - } - } - return $success; - } - - function doInfo($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError("No channel specified"); - } - - $reg = &$this->config->getRegistry(); - $channel = strtolower($params[0]); - if ($reg->channelExists($channel)) { - $chan = $reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $this->raiseError($chan); - } - } else { - if (strpos($channel, '://')) { - $downloader = &$this->getDownloader(); - $tmpdir = $this->config->get('temp_dir'); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($loc)) { - return $this->raiseError('Cannot open "' . $channel . - '" (' . $loc->getMessage() . ')'); - } else { - $contents = implode('', file($loc)); - } - } else { - if (!file_exists($params[0])) { - return $this->raiseError('Unknown channel "' . $channel . '"'); - } - - $fp = fopen($params[0], 'r'); - if (!$fp) { - return $this->raiseError('Cannot open "' . $params[0] . '"'); - } - - $contents = ''; - while (!feof($fp)) { - $contents .= fread($fp, 1024); - } - fclose($fp); - } - - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $chan = new PEAR_ChannelFile; - $chan->fromXmlString($contents); - $chan->validate(); - if ($errs = $chan->getErrors(true)) { - foreach ($errs as $err) { - $this->ui->outputData($err['level'] . ': ' . $err['message']); - } - return $this->raiseError('Channel file "' . $params[0] . '" is not valid'); - } - } - - if (!$chan) { - return $this->raiseError('Serious error: Channel "' . $params[0] . - '" has a corrupted registry entry'); - } - - $channel = $chan->getName(); - $caption = 'Channel ' . $channel . ' Information:'; - $data1 = array( - 'caption' => $caption, - 'border' => true); - $data1['data']['server'] = array('Name and Server', $chan->getName()); - if ($chan->getAlias() != $chan->getName()) { - $data1['data']['alias'] = array('Alias', $chan->getAlias()); - } - - $data1['data']['summary'] = array('Summary', $chan->getSummary()); - $validate = $chan->getValidationPackage(); - $data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']); - $data1['data']['vpackageversion'] = - array('Validation Package Version', $validate['attribs']['version']); - $d = array(); - $d['main'] = $data1; - - $data['data'] = array(); - $data['caption'] = 'Server Capabilities'; - $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); - if ($chan->supportsREST()) { - if ($chan->supportsREST()) { - $funcs = $chan->getFunctions('rest'); - if (!isset($funcs[0])) { - $funcs = array($funcs); - } - foreach ($funcs as $protocol) { - $data['data'][] = array('rest', $protocol['attribs']['type'], - $protocol['_content']); - } - } - } else { - $data['data'][] = array('No supported protocols'); - } - - $d['protocols'] = $data; - $data['data'] = array(); - $mirrors = $chan->getMirrors(); - if ($mirrors) { - $data['caption'] = 'Channel ' . $channel . ' Mirrors:'; - unset($data['headline']); - foreach ($mirrors as $mirror) { - $data['data'][] = array($mirror['attribs']['host']); - $d['mirrors'] = $data; - } - - foreach ($mirrors as $i => $mirror) { - $data['data'] = array(); - $data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities'; - $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); - if ($chan->supportsREST($mirror['attribs']['host'])) { - if ($chan->supportsREST($mirror['attribs']['host'])) { - $funcs = $chan->getFunctions('rest', $mirror['attribs']['host']); - if (!isset($funcs[0])) { - $funcs = array($funcs); - } - - foreach ($funcs as $protocol) { - $data['data'][] = array('rest', $protocol['attribs']['type'], - $protocol['_content']); - } - } - } else { - $data['data'][] = array('No supported protocols'); - } - $d['mirrorprotocols' . $i] = $data; - } - } - $this->ui->outputData($d, 'channel-info'); - } - - // }}} - - function doDelete($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError('channel-delete: no channel specified'); - } - - $reg = &$this->config->getRegistry(); - if (!$reg->channelExists($params[0])) { - return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist'); - } - - $channel = $reg->channelName($params[0]); - if ($channel == 'pear.php.net') { - return $this->raiseError('Cannot delete the pear.php.net channel'); - } - - if ($channel == 'pecl.php.net') { - return $this->raiseError('Cannot delete the pecl.php.net channel'); - } - - if ($channel == 'doc.php.net') { - return $this->raiseError('Cannot delete the doc.php.net channel'); - } - - if ($channel == '__uri') { - return $this->raiseError('Cannot delete the __uri pseudo-channel'); - } - - if (PEAR::isError($err = $reg->listPackages($channel))) { - return $err; - } - - if (count($err)) { - return $this->raiseError('Channel "' . $channel . - '" has installed packages, cannot delete'); - } - - if (!$reg->deleteChannel($channel)) { - return $this->raiseError('Channel "' . $channel . '" deletion failed'); - } else { - $this->config->deleteChannel($channel); - $this->ui->outputData('Channel "' . $channel . '" deleted', $command); - } - } - - function doAdd($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError('channel-add: no channel file specified'); - } - - if (strpos($params[0], '://')) { - $downloader = &$this->getDownloader(); - $tmpdir = $this->config->get('temp_dir'); - if (!file_exists($tmpdir)) { - require_once 'System.php'; - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = System::mkdir(array('-p', $tmpdir)); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($err)) { - return $this->raiseError('channel-add: temp_dir does not exist: "' . - $tmpdir . - '" - You can change this location with "pear config-set temp_dir"'); - } - } - - if (!is_writable($tmpdir)) { - return $this->raiseError('channel-add: temp_dir is not writable: "' . - $tmpdir . - '" - You can change this location with "pear config-set temp_dir"'); - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($loc)) { - return $this->raiseError('channel-add: Cannot open "' . $params[0] . - '" (' . $loc->getMessage() . ')'); - } - - list($loc, $lastmodified) = $loc; - $contents = implode('', file($loc)); - } else { - $lastmodified = $fp = false; - if (file_exists($params[0])) { - $fp = fopen($params[0], 'r'); - } - - if (!$fp) { - return $this->raiseError('channel-add: cannot open "' . $params[0] . '"'); - } - - $contents = ''; - while (!feof($fp)) { - $contents .= fread($fp, 1024); - } - fclose($fp); - } - - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $channel = new PEAR_ChannelFile; - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $result = $channel->fromXmlString($contents); - PEAR::staticPopErrorHandling(); - if (!$result) { - $exit = false; - if (count($errors = $channel->getErrors(true))) { - foreach ($errors as $error) { - $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message'])); - if (!$exit) { - $exit = $error['level'] == 'error' ? true : false; - } - } - if ($exit) { - return $this->raiseError('channel-add: invalid channel.xml file'); - } - } - } - - $reg = &$this->config->getRegistry(); - if ($reg->channelExists($channel->getName())) { - return $this->raiseError('channel-add: Channel "' . $channel->getName() . - '" exists, use channel-update to update entry', PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS); - } - - $ret = $reg->addChannel($channel, $lastmodified); - if (PEAR::isError($ret)) { - return $ret; - } - - if (!$ret) { - return $this->raiseError('channel-add: adding Channel "' . $channel->getName() . - '" to registry failed'); - } - - $this->config->setChannels($reg->listChannels()); - $this->config->writeConfigFile(); - $this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command); - } - - function doUpdate($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError("No channel file specified"); - } - - $tmpdir = $this->config->get('temp_dir'); - if (!file_exists($tmpdir)) { - require_once 'System.php'; - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = System::mkdir(array('-p', $tmpdir)); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($err)) { - return $this->raiseError('channel-add: temp_dir does not exist: "' . - $tmpdir . - '" - You can change this location with "pear config-set temp_dir"'); - } - } - - if (!is_writable($tmpdir)) { - return $this->raiseError('channel-add: temp_dir is not writable: "' . - $tmpdir . - '" - You can change this location with "pear config-set temp_dir"'); - } - - $reg = &$this->config->getRegistry(); - $lastmodified = false; - if ((!file_exists($params[0]) || is_dir($params[0])) - && $reg->channelExists(strtolower($params[0]))) { - $c = $reg->getChannel(strtolower($params[0])); - if (PEAR::isError($c)) { - return $this->raiseError($c); - } - - $this->ui->outputData("Updating channel \"$params[0]\"", $command); - $dl = &$this->getDownloader(array()); - // if force is specified, use a timestamp of "1" to force retrieval - $lastmodified = isset($options['force']) ? false : $c->lastModified(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml', - $this->ui, $tmpdir, null, $lastmodified); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($contents)) { - // Attempt to fall back to https - $this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage()); - $this->ui->outputData("Trying channel \"$params[0]\" over https:// instead"); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml', - $this->ui, $tmpdir, null, $lastmodified); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($contents)) { - return $this->raiseError('Cannot retrieve channel.xml for channel "' . - $c->getName() . '" (' . $contents->getMessage() . ')'); - } - } - - list($contents, $lastmodified) = $contents; - if (!$contents) { - $this->ui->outputData("Channel \"$params[0]\" is up to date"); - return; - } - - $contents = implode('', file($contents)); - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $channel = new PEAR_ChannelFile; - $channel->fromXmlString($contents); - if (!$channel->getErrors()) { - // security check: is the downloaded file for the channel we got it from? - if (strtolower($channel->getName()) != strtolower($c->getName())) { - if (!isset($options['force'])) { - return $this->raiseError('ERROR: downloaded channel definition file' . - ' for channel "' . $channel->getName() . '" from channel "' . - strtolower($c->getName()) . '"'); - } - - $this->ui->log(0, 'WARNING: downloaded channel definition file' . - ' for channel "' . $channel->getName() . '" from channel "' . - strtolower($c->getName()) . '"'); - } - } - } else { - if (strpos($params[0], '://')) { - $dl = &$this->getDownloader(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $loc = $dl->downloadHttp($params[0], - $this->ui, $tmpdir, null, $lastmodified); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($loc)) { - return $this->raiseError("Cannot open " . $params[0] . - ' (' . $loc->getMessage() . ')'); - } - - list($loc, $lastmodified) = $loc; - $contents = implode('', file($loc)); - } else { - $fp = false; - if (file_exists($params[0])) { - $fp = fopen($params[0], 'r'); - } - - if (!$fp) { - return $this->raiseError("Cannot open " . $params[0]); - } - - $contents = ''; - while (!feof($fp)) { - $contents .= fread($fp, 1024); - } - fclose($fp); - } - - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $channel = new PEAR_ChannelFile; - $channel->fromXmlString($contents); - } - - $exit = false; - if (count($errors = $channel->getErrors(true))) { - foreach ($errors as $error) { - $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message'])); - if (!$exit) { - $exit = $error['level'] == 'error' ? true : false; - } - } - if ($exit) { - return $this->raiseError('Invalid channel.xml file'); - } - } - - if (!$reg->channelExists($channel->getName())) { - return $this->raiseError('Error: Channel "' . $channel->getName() . - '" does not exist, use channel-add to add an entry'); - } - - $ret = $reg->updateChannel($channel, $lastmodified); - if (PEAR::isError($ret)) { - return $ret; - } - - if (!$ret) { - return $this->raiseError('Updating Channel "' . $channel->getName() . - '" in registry failed'); - } - - $this->config->setChannels($reg->listChannels()); - $this->config->writeConfigFile(); - $this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded'); - } - - function &getDownloader() - { - if (!class_exists('PEAR_Downloader')) { - require_once 'PEAR/Downloader.php'; - } - $a = new PEAR_Downloader($this->ui, array(), $this->config); - return $a; - } - - function doAlias($command, $options, $params) - { - if (count($params) === 1) { - return $this->raiseError('No channel alias specified'); - } - - if (count($params) !== 2 || (!empty($params[1]) && $params[1]{0} == '-')) { - return $this->raiseError( - 'Invalid format, correct is: channel-alias channel alias'); - } - - $reg = &$this->config->getRegistry(); - if (!$reg->channelExists($params[0], true)) { - $extra = ''; - if ($reg->isAlias($params[0])) { - $extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' . - strtolower($params[1]) . '")'; - } - - return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra); - } - - if ($reg->isAlias($params[1])) { - return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' . - 'already aliased to "' . strtolower($params[1]) . '", cannot re-alias'); - } - - $chan = &$reg->getChannel($params[0]); - if (PEAR::isError($chan)) { - return $this->raiseError('Corrupt registry? Error retrieving channel "' . $params[0] . - '" information (' . $chan->getMessage() . ')'); - } - - // make it a local alias - if (!$chan->setAlias(strtolower($params[1]), true)) { - return $this->raiseError('Alias "' . strtolower($params[1]) . - '" is not a valid channel alias'); - } - - $reg->updateChannel($chan); - $this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' . - strtolower($params[1]) . '"'); - } - - /** - * The channel-discover command - * - * @param string $command command name - * @param array $options option_name => value - * @param array $params list of additional parameters. - * $params[0] should contain a string with either: - * - or - * - :@ - * @return null|PEAR_Error - */ - function doDiscover($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError("No channel server specified"); - } - - // Look for the possible input format ":@" - if (preg_match('/^(.+):(.+)@(.+)\\z/', $params[0], $matches)) { - $username = $matches[1]; - $password = $matches[2]; - $channel = $matches[3]; - } else { - $channel = $params[0]; - } - - $reg = &$this->config->getRegistry(); - if ($reg->channelExists($channel)) { - if (!$reg->isAlias($channel)) { - return $this->raiseError("Channel \"$channel\" is already initialized", PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS); - } - - return $this->raiseError("A channel alias named \"$channel\" " . - 'already exists, aliasing channel "' . $reg->channelName($channel) - . '"'); - } - - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->doAdd($command, $options, array('http://' . $channel . '/channel.xml')); - $this->popErrorHandling(); - if (PEAR::isError($err)) { - if ($err->getCode() === PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS) { - return $this->raiseError("Discovery of channel \"$channel\" failed (" . - $err->getMessage() . ')'); - } - // Attempt fetch via https - $this->ui->outputData("Discovering channel $channel over http:// failed with message: " . $err->getMessage()); - $this->ui->outputData("Trying to discover channel $channel over https:// instead"); - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->doAdd($command, $options, array('https://' . $channel . '/channel.xml')); - $this->popErrorHandling(); - if (PEAR::isError($err)) { - return $this->raiseError("Discovery of channel \"$channel\" failed (" . - $err->getMessage() . ')'); - } - } - - // Store username/password if they were given - // Arguably we should do a logintest on the channel here, but since - // that's awkward on a REST-based channel (even "pear login" doesn't - // do it for those), and XML-RPC is deprecated, it's fairly pointless. - if (isset($username)) { - $this->config->set('username', $username, 'user', $channel); - $this->config->set('password', $password, 'user', $channel); - $this->config->store(); - $this->ui->outputData("Stored login for channel \"$channel\" using username \"$username\"", $command); - } - - $this->ui->outputData("Discovery of channel \"$channel\" succeeded", $command); - } - - /** - * Execute the 'login' command. - * - * @param string $command command name - * @param array $options option_name => value - * @param array $params list of additional parameters - * - * @return bool TRUE on success or - * a PEAR error on failure - * - * @access public - */ - function doLogin($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - - // If a parameter is supplied, use that as the channel to log in to - $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel'); - - $chan = $reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $this->raiseError($chan); - } - - $server = $this->config->get('preferred_mirror', null, $channel); - $username = $this->config->get('username', null, $channel); - if (empty($username)) { - $username = isset($_ENV['USER']) ? $_ENV['USER'] : null; - } - $this->ui->outputData("Logging in to $server.", $command); - - list($username, $password) = $this->ui->userDialog( - $command, - array('Username', 'Password'), - array('text', 'password'), - array($username, '') - ); - $username = trim($username); - $password = trim($password); - - $ourfile = $this->config->getConfFile('user'); - if (!$ourfile) { - $ourfile = $this->config->getConfFile('system'); - } - - $this->config->set('username', $username, 'user', $channel); - $this->config->set('password', $password, 'user', $channel); - - if ($chan->supportsREST()) { - $ok = true; - } - - if ($ok !== true) { - return $this->raiseError('Login failed!'); - } - - $this->ui->outputData("Logged in.", $command); - // avoid changing any temporary settings changed with -d - $ourconfig = new PEAR_Config($ourfile, $ourfile); - $ourconfig->set('username', $username, 'user', $channel); - $ourconfig->set('password', $password, 'user', $channel); - $ourconfig->store(); - - return true; - } - - /** - * Execute the 'logout' command. - * - * @param string $command command name - * @param array $options option_name => value - * @param array $params list of additional parameters - * - * @return bool TRUE on success or - * a PEAR error on failure - * - * @access public - */ - function doLogout($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - - // If a parameter is supplied, use that as the channel to log in to - $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel'); - - $chan = $reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $this->raiseError($chan); - } - - $server = $this->config->get('preferred_mirror', null, $channel); - $this->ui->outputData("Logging out from $server.", $command); - $this->config->remove('username', 'user', $channel); - $this->config->remove('password', 'user', $channel); - $this->config->store(); - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Channels.xml b/3rdparty/PEAR/Command/Channels.xml deleted file mode 100644 index 47b72066ab..0000000000 --- a/3rdparty/PEAR/Command/Channels.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - List Available Channels - doList - lc - - -List all available channels for installation. - - - - Update the Channel List - doUpdateAll - uc - - -List all installed packages in all channels. - - - - Remove a Channel From the List - doDelete - cde - - <channel name> -Delete a channel from the registry. You may not -remove any channel that has installed packages. - - - - Add a Channel - doAdd - ca - - <channel.xml> -Add a private channel to the channel list. Note that all -public channels should be synced using "update-channels". -Parameter may be either a local file or remote URL to a -channel.xml. - - - - Update an Existing Channel - doUpdate - cu - - - f - will force download of new channel.xml if an existing channel name is used - - - c - will force download of new channel.xml if an existing channel name is used - CHANNEL - - - [<channel.xml>|<channel name>] -Update a channel in the channel list directly. Note that all -public channels can be synced using "update-channels". -Parameter may be a local or remote channel.xml, or the name of -an existing channel. - - - - Retrieve Information on a Channel - doInfo - ci - - <package> -List the files in an installed package. - - - - Specify an alias to a channel name - doAlias - cha - - <channel> <alias> -Specify a specific alias to use for a channel name. -The alias may not be an existing channel name or -alias. - - - - Initialize a Channel from its server - doDiscover - di - - [<channel.xml>|<channel name>] -Initialize a channel from its server and create a local channel.xml. -If <channel name> is in the format "<username>:<password>@<channel>" then -<username> and <password> will be set as the login username/password for -<channel>. Use caution when passing the username/password in this way, as -it may allow other users on your computer to briefly view your username/ -password via the system's process list. - - - - Connects and authenticates to remote channel server - doLogin - cli - - <channel name> -Log in to a remote channel server. If <channel name> is not supplied, -the default channel is used. To use remote functions in the installer -that require any kind of privileges, you need to log in first. The -username and password you enter here will be stored in your per-user -PEAR configuration (~/.pearrc on Unix-like systems). After logging -in, your username and password will be sent along in subsequent -operations on the remote server. - - - Logs out from the remote channel server - doLogout - clo - - <channel name> -Logs out from a remote channel server. If <channel name> is not supplied, -the default channel is used. This command does not actually connect to the -remote server, it only deletes the stored username and password from your user -configuration. - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Common.php b/3rdparty/PEAR/Command/Common.php deleted file mode 100644 index 279a716623..0000000000 --- a/3rdparty/PEAR/Command/Common.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR.php'; - -/** - * PEAR commands base class - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Common extends PEAR -{ - /** - * PEAR_Config object used to pass user system and configuration - * on when executing commands - * - * @var PEAR_Config - */ - var $config; - /** - * @var PEAR_Registry - * @access protected - */ - var $_registry; - - /** - * User Interface object, for all interaction with the user. - * @var object - */ - var $ui; - - var $_deps_rel_trans = array( - 'lt' => '<', - 'le' => '<=', - 'eq' => '=', - 'ne' => '!=', - 'gt' => '>', - 'ge' => '>=', - 'has' => '==' - ); - - var $_deps_type_trans = array( - 'pkg' => 'package', - 'ext' => 'extension', - 'php' => 'PHP', - 'prog' => 'external program', - 'ldlib' => 'external library for linking', - 'rtlib' => 'external runtime library', - 'os' => 'operating system', - 'websrv' => 'web server', - 'sapi' => 'SAPI backend' - ); - - /** - * PEAR_Command_Common constructor. - * - * @access public - */ - function PEAR_Command_Common(&$ui, &$config) - { - parent::PEAR(); - $this->config = &$config; - $this->ui = &$ui; - } - - /** - * Return a list of all the commands defined by this class. - * @return array list of commands - * @access public - */ - function getCommands() - { - $ret = array(); - foreach (array_keys($this->commands) as $command) { - $ret[$command] = $this->commands[$command]['summary']; - } - - return $ret; - } - - /** - * Return a list of all the command shortcuts defined by this class. - * @return array shortcut => command - * @access public - */ - function getShortcuts() - { - $ret = array(); - foreach (array_keys($this->commands) as $command) { - if (isset($this->commands[$command]['shortcut'])) { - $ret[$this->commands[$command]['shortcut']] = $command; - } - } - - return $ret; - } - - function getOptions($command) - { - $shortcuts = $this->getShortcuts(); - if (isset($shortcuts[$command])) { - $command = $shortcuts[$command]; - } - - if (isset($this->commands[$command]) && - isset($this->commands[$command]['options'])) { - return $this->commands[$command]['options']; - } - - return null; - } - - function getGetoptArgs($command, &$short_args, &$long_args) - { - $short_args = ''; - $long_args = array(); - if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) { - return; - } - - reset($this->commands[$command]['options']); - while (list($option, $info) = each($this->commands[$command]['options'])) { - $larg = $sarg = ''; - if (isset($info['arg'])) { - if ($info['arg']{0} == '(') { - $larg = '=='; - $sarg = '::'; - $arg = substr($info['arg'], 1, -1); - } else { - $larg = '='; - $sarg = ':'; - $arg = $info['arg']; - } - } - - if (isset($info['shortopt'])) { - $short_args .= $info['shortopt'] . $sarg; - } - - $long_args[] = $option . $larg; - } - } - - /** - * Returns the help message for the given command - * - * @param string $command The command - * @return mixed A fail string if the command does not have help or - * a two elements array containing [0]=>help string, - * [1]=> help string for the accepted cmd args - */ - function getHelp($command) - { - $config = &PEAR_Config::singleton(); - if (!isset($this->commands[$command])) { - return "No such command \"$command\""; - } - - $help = null; - if (isset($this->commands[$command]['doc'])) { - $help = $this->commands[$command]['doc']; - } - - if (empty($help)) { - // XXX (cox) Fallback to summary if there is no doc (show both?) - if (!isset($this->commands[$command]['summary'])) { - return "No help for command \"$command\""; - } - $help = $this->commands[$command]['summary']; - } - - if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { - foreach($matches[0] as $k => $v) { - $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); - } - } - - return array($help, $this->getHelpArgs($command)); - } - - /** - * Returns the help for the accepted arguments of a command - * - * @param string $command - * @return string The help string - */ - function getHelpArgs($command) - { - if (isset($this->commands[$command]['options']) && - count($this->commands[$command]['options'])) - { - $help = "Options:\n"; - foreach ($this->commands[$command]['options'] as $k => $v) { - if (isset($v['arg'])) { - if ($v['arg'][0] == '(') { - $arg = substr($v['arg'], 1, -1); - $sapp = " [$arg]"; - $lapp = "[=$arg]"; - } else { - $sapp = " $v[arg]"; - $lapp = "=$v[arg]"; - } - } else { - $sapp = $lapp = ""; - } - - if (isset($v['shortopt'])) { - $s = $v['shortopt']; - $help .= " -$s$sapp, --$k$lapp\n"; - } else { - $help .= " --$k$lapp\n"; - } - - $p = " "; - $doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); - $help .= " $doc\n"; - } - - return $help; - } - - return null; - } - - function run($command, $options, $params) - { - if (empty($this->commands[$command]['function'])) { - // look for shortcuts - foreach (array_keys($this->commands) as $cmd) { - if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) { - if (empty($this->commands[$cmd]['function'])) { - return $this->raiseError("unknown command `$command'"); - } else { - $func = $this->commands[$cmd]['function']; - } - $command = $cmd; - - //$command = $this->commands[$cmd]['function']; - break; - } - } - } else { - $func = $this->commands[$command]['function']; - } - - return $this->$func($command, $options, $params); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Config.php b/3rdparty/PEAR/Command/Config.php deleted file mode 100644 index a761b277f5..0000000000 --- a/3rdparty/PEAR/Command/Config.php +++ /dev/null @@ -1,414 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Config.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for managing configuration data. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Config extends PEAR_Command_Common -{ - var $commands = array( - 'config-show' => array( - 'summary' => 'Show All Settings', - 'function' => 'doConfigShow', - 'shortcut' => 'csh', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'show configuration variables for another channel', - 'arg' => 'CHAN', - ), -), - 'doc' => '[layer] -Displays all configuration values. An optional argument -may be used to tell which configuration layer to display. Valid -configuration layers are "user", "system" and "default". To display -configurations for different channels, set the default_channel -configuration variable and run config-show again. -', - ), - 'config-get' => array( - 'summary' => 'Show One Setting', - 'function' => 'doConfigGet', - 'shortcut' => 'cg', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'show configuration variables for another channel', - 'arg' => 'CHAN', - ), -), - 'doc' => ' [layer] -Displays the value of one configuration parameter. The -first argument is the name of the parameter, an optional second argument -may be used to tell which configuration layer to look in. Valid configuration -layers are "user", "system" and "default". If no layer is specified, a value -will be picked from the first layer that defines the parameter, in the order -just specified. The configuration value will be retrieved for the channel -specified by the default_channel configuration variable. -', - ), - 'config-set' => array( - 'summary' => 'Change Setting', - 'function' => 'doConfigSet', - 'shortcut' => 'cs', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'show configuration variables for another channel', - 'arg' => 'CHAN', - ), -), - 'doc' => ' [layer] -Sets the value of one configuration parameter. The first argument is -the name of the parameter, the second argument is the new value. Some -parameters are subject to validation, and the command will fail with -an error message if the new value does not make sense. An optional -third argument may be used to specify in which layer to set the -configuration parameter. The default layer is "user". The -configuration value will be set for the current channel, which -is controlled by the default_channel configuration variable. -', - ), - 'config-help' => array( - 'summary' => 'Show Information About Setting', - 'function' => 'doConfigHelp', - 'shortcut' => 'ch', - 'options' => array(), - 'doc' => '[parameter] -Displays help for a configuration parameter. Without arguments it -displays help for all configuration parameters. -', - ), - 'config-create' => array( - 'summary' => 'Create a Default configuration file', - 'function' => 'doConfigCreate', - 'shortcut' => 'coc', - 'options' => array( - 'windows' => array( - 'shortopt' => 'w', - 'doc' => 'create a config file for a windows install', - ), - ), - 'doc' => ' -Create a default configuration file with all directory configuration -variables set to subdirectories of , and save it as . -This is useful especially for creating a configuration file for a remote -PEAR installation (using the --remoteconfig option of install, upgrade, -and uninstall). -', - ), - ); - - /** - * PEAR_Command_Config constructor. - * - * @access public - */ - function PEAR_Command_Config(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function doConfigShow($command, $options, $params) - { - $layer = null; - if (is_array($params)) { - $layer = isset($params[0]) ? $params[0] : null; - } - - // $params[0] -> the layer - if ($error = $this->_checkLayer($layer)) { - return $this->raiseError("config-show:$error"); - } - - $keys = $this->config->getKeys(); - sort($keys); - $channel = isset($options['channel']) ? $options['channel'] : - $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - $channel = $reg->channelName($channel); - $data = array('caption' => 'Configuration (channel ' . $channel . '):'); - foreach ($keys as $key) { - $type = $this->config->getType($key); - $value = $this->config->get($key, $layer, $channel); - if ($type == 'password' && $value) { - $value = '********'; - } - - if ($value === false) { - $value = 'false'; - } elseif ($value === true) { - $value = 'true'; - } - - $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); - } - - foreach ($this->config->getLayers() as $layer) { - $data['data']['Config Files'][] = array(ucfirst($layer) . ' Configuration File', 'Filename' , $this->config->getConfFile($layer)); - } - - $this->ui->outputData($data, $command); - return true; - } - - function doConfigGet($command, $options, $params) - { - $args_cnt = is_array($params) ? count($params) : 0; - switch ($args_cnt) { - case 1: - $config_key = $params[0]; - $layer = null; - break; - case 2: - $config_key = $params[0]; - $layer = $params[1]; - if ($error = $this->_checkLayer($layer)) { - return $this->raiseError("config-get:$error"); - } - break; - case 0: - default: - return $this->raiseError("config-get expects 1 or 2 parameters"); - } - - $reg = &$this->config->getRegistry(); - $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - $channel = $reg->channelName($channel); - $this->ui->outputData($this->config->get($config_key, $layer, $channel), $command); - return true; - } - - function doConfigSet($command, $options, $params) - { - // $param[0] -> a parameter to set - // $param[1] -> the value for the parameter - // $param[2] -> the layer - $failmsg = ''; - if (count($params) < 2 || count($params) > 3) { - $failmsg .= "config-set expects 2 or 3 parameters"; - return PEAR::raiseError($failmsg); - } - - if (isset($params[2]) && ($error = $this->_checkLayer($params[2]))) { - $failmsg .= $error; - return PEAR::raiseError("config-set:$failmsg"); - } - - $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - $channel = $reg->channelName($channel); - if ($params[0] == 'default_channel' && !$reg->channelExists($params[1])) { - return $this->raiseError('Channel "' . $params[1] . '" does not exist'); - } - - if ($params[0] == 'preferred_mirror' - && ( - !$reg->mirrorExists($channel, $params[1]) && - (!$reg->channelExists($params[1]) || $channel != $params[1]) - ) - ) { - $msg = 'Channel Mirror "' . $params[1] . '" does not exist'; - $msg .= ' in your registry for channel "' . $channel . '".'; - $msg .= "\n" . 'Attempt to run "pear channel-update ' . $channel .'"'; - $msg .= ' if you believe this mirror should exist as you may'; - $msg .= ' have outdated channel information.'; - return $this->raiseError($msg); - } - - if (count($params) == 2) { - array_push($params, 'user'); - $layer = 'user'; - } else { - $layer = $params[2]; - } - - array_push($params, $channel); - if (!call_user_func_array(array(&$this->config, 'set'), $params)) { - array_pop($params); - $failmsg = "config-set (" . implode(", ", $params) . ") failed, channel $channel"; - } else { - $this->config->store($layer); - } - - if ($failmsg) { - return $this->raiseError($failmsg); - } - - $this->ui->outputData('config-set succeeded', $command); - return true; - } - - function doConfigHelp($command, $options, $params) - { - if (empty($params)) { - $params = $this->config->getKeys(); - } - - $data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); - $data['headline'] = array('Name', 'Type', 'Description'); - $data['border'] = true; - foreach ($params as $name) { - $type = $this->config->getType($name); - $docs = $this->config->getDocs($name); - if ($type == 'set') { - $docs = rtrim($docs) . "\nValid set: " . - implode(' ', $this->config->getSetValues($name)); - } - - $data['data'][] = array($name, $type, $docs); - } - - $this->ui->outputData($data, $command); - } - - function doConfigCreate($command, $options, $params) - { - if (count($params) != 2) { - return PEAR::raiseError('config-create: must have 2 parameters, root path and ' . - 'filename to save as'); - } - - $root = $params[0]; - // Clean up the DIRECTORY_SEPARATOR mess - $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; - $root = preg_replace(array('!\\\\+!', '!/+!', "!$ds2+!"), - array('/', '/', '/'), - $root); - if ($root{0} != '/') { - if (!isset($options['windows'])) { - return PEAR::raiseError('Root directory must be an absolute path beginning ' . - 'with "/", was: "' . $root . '"'); - } - - if (!preg_match('/^[A-Za-z]:/', $root)) { - return PEAR::raiseError('Root directory must be an absolute path beginning ' . - 'with "\\" or "C:\\", was: "' . $root . '"'); - } - } - - $windows = isset($options['windows']); - if ($windows) { - $root = str_replace('/', '\\', $root); - } - - if (!file_exists($params[1]) && !@touch($params[1])) { - return PEAR::raiseError('Could not create "' . $params[1] . '"'); - } - - $params[1] = realpath($params[1]); - $config = &new PEAR_Config($params[1], '#no#system#config#', false, false); - if ($root{strlen($root) - 1} == '/') { - $root = substr($root, 0, strlen($root) - 1); - } - - $config->noRegistry(); - $config->set('php_dir', $windows ? "$root\\pear\\php" : "$root/pear/php", 'user'); - $config->set('data_dir', $windows ? "$root\\pear\\data" : "$root/pear/data"); - $config->set('www_dir', $windows ? "$root\\pear\\www" : "$root/pear/www"); - $config->set('cfg_dir', $windows ? "$root\\pear\\cfg" : "$root/pear/cfg"); - $config->set('ext_dir', $windows ? "$root\\pear\\ext" : "$root/pear/ext"); - $config->set('doc_dir', $windows ? "$root\\pear\\docs" : "$root/pear/docs"); - $config->set('test_dir', $windows ? "$root\\pear\\tests" : "$root/pear/tests"); - $config->set('cache_dir', $windows ? "$root\\pear\\cache" : "$root/pear/cache"); - $config->set('download_dir', $windows ? "$root\\pear\\download" : "$root/pear/download"); - $config->set('temp_dir', $windows ? "$root\\pear\\temp" : "$root/pear/temp"); - $config->set('bin_dir', $windows ? "$root\\pear" : "$root/pear"); - $config->writeConfigFile(); - $this->_showConfig($config); - $this->ui->outputData('Successfully created default configuration file "' . $params[1] . '"', - $command); - } - - function _showConfig(&$config) - { - $params = array('user'); - $keys = $config->getKeys(); - sort($keys); - $channel = 'pear.php.net'; - $data = array('caption' => 'Configuration (channel ' . $channel . '):'); - foreach ($keys as $key) { - $type = $config->getType($key); - $value = $config->get($key, 'user', $channel); - if ($type == 'password' && $value) { - $value = '********'; - } - - if ($value === false) { - $value = 'false'; - } elseif ($value === true) { - $value = 'true'; - } - $data['data'][$config->getGroup($key)][] = - array($config->getPrompt($key) , $key, $value); - } - - foreach ($config->getLayers() as $layer) { - $data['data']['Config Files'][] = - array(ucfirst($layer) . ' Configuration File', 'Filename' , - $config->getConfFile($layer)); - } - - $this->ui->outputData($data, 'config-show'); - return true; - } - - /** - * Checks if a layer is defined or not - * - * @param string $layer The layer to search for - * @return mixed False on no error or the error message - */ - function _checkLayer($layer = null) - { - if (!empty($layer) && $layer != 'default') { - $layers = $this->config->getLayers(); - if (!in_array($layer, $layers)) { - return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; - } - } - - return false; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Config.xml b/3rdparty/PEAR/Command/Config.xml deleted file mode 100644 index f64a925f52..0000000000 --- a/3rdparty/PEAR/Command/Config.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - Show All Settings - doConfigShow - csh - - - c - show configuration variables for another channel - CHAN - - - [layer] -Displays all configuration values. An optional argument -may be used to tell which configuration layer to display. Valid -configuration layers are "user", "system" and "default". To display -configurations for different channels, set the default_channel -configuration variable and run config-show again. - - - - Show One Setting - doConfigGet - cg - - - c - show configuration variables for another channel - CHAN - - - <parameter> [layer] -Displays the value of one configuration parameter. The -first argument is the name of the parameter, an optional second argument -may be used to tell which configuration layer to look in. Valid configuration -layers are "user", "system" and "default". If no layer is specified, a value -will be picked from the first layer that defines the parameter, in the order -just specified. The configuration value will be retrieved for the channel -specified by the default_channel configuration variable. - - - - Change Setting - doConfigSet - cs - - - c - show configuration variables for another channel - CHAN - - - <parameter> <value> [layer] -Sets the value of one configuration parameter. The first argument is -the name of the parameter, the second argument is the new value. Some -parameters are subject to validation, and the command will fail with -an error message if the new value does not make sense. An optional -third argument may be used to specify in which layer to set the -configuration parameter. The default layer is "user". The -configuration value will be set for the current channel, which -is controlled by the default_channel configuration variable. - - - - Show Information About Setting - doConfigHelp - ch - - [parameter] -Displays help for a configuration parameter. Without arguments it -displays help for all configuration parameters. - - - - Create a Default configuration file - doConfigCreate - coc - - - w - create a config file for a windows install - - - <root path> <filename> -Create a default configuration file with all directory configuration -variables set to subdirectories of <root path>, and save it as <filename>. -This is useful especially for creating a configuration file for a remote -PEAR installation (using the --remoteconfig option of install, upgrade, -and uninstall). - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Install.php b/3rdparty/PEAR/Command/Install.php deleted file mode 100644 index c035f6d20d..0000000000 --- a/3rdparty/PEAR/Command/Install.php +++ /dev/null @@ -1,1268 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Install.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for installation or deinstallation/upgrading of - * packages. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Install extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'install' => array( - 'summary' => 'Install Package', - 'function' => 'doInstall', - 'shortcut' => 'i', - 'options' => array( - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'will overwrite newer installed packages', - ), - 'loose' => array( - 'shortopt' => 'l', - 'doc' => 'do not check for recommended dependency version', - ), - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, install anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as installed', - ), - 'soft' => array( - 'shortopt' => 's', - 'doc' => 'soft install, fail silently, or upgrade if already installed', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM', - ), - 'packagingroot' => array( - 'shortopt' => 'P', - 'arg' => 'DIR', - 'doc' => 'root directory used when packaging files, like RPM packaging', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'alldeps' => array( - 'shortopt' => 'a', - 'doc' => 'install all required and optional dependencies', - ), - 'onlyreqdeps' => array( - 'shortopt' => 'o', - 'doc' => 'install all required dependencies', - ), - 'offline' => array( - 'shortopt' => 'O', - 'doc' => 'do not attempt to download any urls or contact channels', - ), - 'pretend' => array( - 'shortopt' => 'p', - 'doc' => 'Only list the packages that would be downloaded', - ), - ), - 'doc' => '[channel/] ... -Installs one or more PEAR packages. You can specify a package to -install in four ways: - -"Package-1.0.tgz" : installs from a local file - -"http://example.com/Package-1.0.tgz" : installs from -anywhere on the net. - -"package.xml" : installs the package described in -package.xml. Useful for testing, or for wrapping a PEAR package in -another package manager such as RPM. - -"Package[-version/state][.tar]" : queries your default channel\'s server -({config master_server}) and downloads the newest package with -the preferred quality/state ({config preferred_state}). - -To retrieve Package version 1.1, use "Package-1.1," to retrieve -Package state beta, use "Package-beta." To retrieve an uncompressed -file, append .tar (make sure there is no file by the same name first) - -To download a package from another channel, prefix with the channel name like -"channel/Package" - -More than one package may be specified at once. It is ok to mix these -four ways of specifying packages. -'), - 'upgrade' => array( - 'summary' => 'Upgrade Package', - 'function' => 'doInstall', - 'shortcut' => 'up', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'upgrade packages from a specific channel', - 'arg' => 'CHAN', - ), - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'overwrite newer installed packages', - ), - 'loose' => array( - 'shortopt' => 'l', - 'doc' => 'do not check for recommended dependency version', - ), - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, upgrade anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as upgraded', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'alldeps' => array( - 'shortopt' => 'a', - 'doc' => 'install all required and optional dependencies', - ), - 'onlyreqdeps' => array( - 'shortopt' => 'o', - 'doc' => 'install all required dependencies', - ), - 'offline' => array( - 'shortopt' => 'O', - 'doc' => 'do not attempt to download any urls or contact channels', - ), - 'pretend' => array( - 'shortopt' => 'p', - 'doc' => 'Only list the packages that would be downloaded', - ), - ), - 'doc' => ' ... -Upgrades one or more PEAR packages. See documentation for the -"install" command for ways to specify a package. - -When upgrading, your package will be updated if the provided new -package has a higher version number (use the -f option if you need to -upgrade anyway). - -More than one package may be specified at once. -'), - 'upgrade-all' => array( - 'summary' => 'Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]', - 'function' => 'doUpgradeAll', - 'shortcut' => 'ua', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'upgrade packages from a specific channel', - 'arg' => 'CHAN', - ), - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, upgrade anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as upgraded', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'loose' => array( - 'doc' => 'do not check for recommended dependency version', - ), - ), - 'doc' => ' -WARNING: This function is deprecated in favor of using the upgrade command with no params - -Upgrades all packages that have a newer release available. Upgrades are -done only if there is a release available of the state specified in -"preferred_state" (currently {config preferred_state}), or a state considered -more stable. -'), - 'uninstall' => array( - 'summary' => 'Un-install Package', - 'function' => 'doUninstall', - 'shortcut' => 'un', - 'options' => array( - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, uninstall anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not remove files, only register the packages as not installed', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'offline' => array( - 'shortopt' => 'O', - 'doc' => 'do not attempt to uninstall remotely', - ), - ), - 'doc' => '[channel/] ... -Uninstalls one or more PEAR packages. More than one package may be -specified at once. Prefix with channel name to uninstall from a -channel not in your default channel ({config default_channel}) -'), - 'bundle' => array( - 'summary' => 'Unpacks a Pecl Package', - 'function' => 'doBundle', - 'shortcut' => 'bun', - 'options' => array( - 'destination' => array( - 'shortopt' => 'd', - 'arg' => 'DIR', - 'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)', - ), - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'Force the unpacking even if there were errors in the package', - ), - ), - 'doc' => ' -Unpacks a Pecl Package into the selected location. It will download the -package if needed. -'), - 'run-scripts' => array( - 'summary' => 'Run Post-Install Scripts bundled with a package', - 'function' => 'doRunScripts', - 'shortcut' => 'rs', - 'options' => array( - ), - 'doc' => ' -Run post-installation scripts in package , if any exist. -'), - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Install constructor. - * - * @access public - */ - function PEAR_Command_Install(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - /** - * For unit testing purposes - */ - function &getDownloader(&$ui, $options, &$config) - { - if (!class_exists('PEAR_Downloader')) { - require_once 'PEAR/Downloader.php'; - } - $a = &new PEAR_Downloader($ui, $options, $config); - return $a; - } - - /** - * For unit testing purposes - */ - function &getInstaller(&$ui) - { - if (!class_exists('PEAR_Installer')) { - require_once 'PEAR/Installer.php'; - } - $a = &new PEAR_Installer($ui); - return $a; - } - - function enableExtension($binaries, $type) - { - if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) { - return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location'); - } - $ini = $this->_parseIni($phpini); - if (PEAR::isError($ini)) { - return $ini; - } - $line = 0; - if ($type == 'extsrc' || $type == 'extbin') { - $search = 'extensions'; - $enable = 'extension'; - } else { - $search = 'zend_extensions'; - ob_start(); - phpinfo(INFO_GENERAL); - $info = ob_get_contents(); - ob_end_clean(); - $debug = function_exists('leak') ? '_debug' : ''; - $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; - $enable = 'zend_extension' . $debug . $ts; - } - foreach ($ini[$search] as $line => $extension) { - if (in_array($extension, $binaries, true) || in_array( - $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) { - // already enabled - assume if one is, all are - return true; - } - } - if ($line) { - $newini = array_slice($ini['all'], 0, $line); - } else { - $newini = array(); - } - foreach ($binaries as $binary) { - if ($ini['extension_dir']) { - $binary = basename($binary); - } - $newini[] = $enable . '="' . $binary . '"' . (OS_UNIX ? "\n" : "\r\n"); - } - $newini = array_merge($newini, array_slice($ini['all'], $line)); - $fp = @fopen($phpini, 'wb'); - if (!$fp) { - return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing'); - } - foreach ($newini as $line) { - fwrite($fp, $line); - } - fclose($fp); - return true; - } - - function disableExtension($binaries, $type) - { - if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) { - return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location'); - } - $ini = $this->_parseIni($phpini); - if (PEAR::isError($ini)) { - return $ini; - } - $line = 0; - if ($type == 'extsrc' || $type == 'extbin') { - $search = 'extensions'; - $enable = 'extension'; - } else { - $search = 'zend_extensions'; - ob_start(); - phpinfo(INFO_GENERAL); - $info = ob_get_contents(); - ob_end_clean(); - $debug = function_exists('leak') ? '_debug' : ''; - $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; - $enable = 'zend_extension' . $debug . $ts; - } - $found = false; - foreach ($ini[$search] as $line => $extension) { - if (in_array($extension, $binaries, true) || in_array( - $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) { - $found = true; - break; - } - } - if (!$found) { - // not enabled - return true; - } - $fp = @fopen($phpini, 'wb'); - if (!$fp) { - return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing'); - } - if ($line) { - $newini = array_slice($ini['all'], 0, $line); - // delete the enable line - $newini = array_merge($newini, array_slice($ini['all'], $line + 1)); - } else { - $newini = array_slice($ini['all'], 1); - } - foreach ($newini as $line) { - fwrite($fp, $line); - } - fclose($fp); - return true; - } - - function _parseIni($filename) - { - if (!file_exists($filename)) { - return PEAR::raiseError('php.ini "' . $filename . '" does not exist'); - } - - if (filesize($filename) > 300000) { - return PEAR::raiseError('php.ini "' . $filename . '" is too large, aborting'); - } - - ob_start(); - phpinfo(INFO_GENERAL); - $info = ob_get_contents(); - ob_end_clean(); - $debug = function_exists('leak') ? '_debug' : ''; - $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; - $zend_extension_line = 'zend_extension' . $debug . $ts; - $all = @file($filename); - if (!$all) { - return PEAR::raiseError('php.ini "' . $filename .'" could not be read'); - } - $zend_extensions = $extensions = array(); - // assume this is right, but pull from the php.ini if it is found - $extension_dir = ini_get('extension_dir'); - foreach ($all as $linenum => $line) { - $line = trim($line); - if (!$line) { - continue; - } - if ($line[0] == ';') { - continue; - } - if (strtolower(substr($line, 0, 13)) == 'extension_dir') { - $line = trim(substr($line, 13)); - if ($line[0] == '=') { - $x = trim(substr($line, 1)); - $x = explode(';', $x); - $extension_dir = str_replace('"', '', array_shift($x)); - continue; - } - } - if (strtolower(substr($line, 0, 9)) == 'extension') { - $line = trim(substr($line, 9)); - if ($line[0] == '=') { - $x = trim(substr($line, 1)); - $x = explode(';', $x); - $extensions[$linenum] = str_replace('"', '', array_shift($x)); - continue; - } - } - if (strtolower(substr($line, 0, strlen($zend_extension_line))) == - $zend_extension_line) { - $line = trim(substr($line, strlen($zend_extension_line))); - if ($line[0] == '=') { - $x = trim(substr($line, 1)); - $x = explode(';', $x); - $zend_extensions[$linenum] = str_replace('"', '', array_shift($x)); - continue; - } - } - } - return array( - 'extensions' => $extensions, - 'zend_extensions' => $zend_extensions, - 'extension_dir' => $extension_dir, - 'all' => $all, - ); - } - - // {{{ doInstall() - - function doInstall($command, $options, $params) - { - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - - if (isset($options['installroot']) && isset($options['packagingroot'])) { - return $this->raiseError('ERROR: cannot use both --installroot and --packagingroot'); - } - - $reg = &$this->config->getRegistry(); - $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - if (empty($this->installer)) { - $this->installer = &$this->getInstaller($this->ui); - } - - if ($command == 'upgrade' || $command == 'upgrade-all') { - // If people run the upgrade command but pass nothing, emulate a upgrade-all - if ($command == 'upgrade' && empty($params)) { - return $this->doUpgradeAll($command, $options, $params); - } - $options['upgrade'] = true; - } else { - $packages = $params; - } - - $instreg = &$reg; // instreg used to check if package is installed - if (isset($options['packagingroot']) && !isset($options['upgrade'])) { - $packrootphp_dir = $this->installer->_prependPath( - $this->config->get('php_dir', null, 'pear.php.net'), - $options['packagingroot']); - $instreg = new PEAR_Registry($packrootphp_dir); // other instreg! - - if ($this->config->get('verbose') > 2) { - $this->ui->outputData('using package root: ' . $options['packagingroot']); - } - } - - $abstractpackages = $otherpackages = array(); - // parse params - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - - foreach ($params as $param) { - if (strpos($param, 'http://') === 0) { - $otherpackages[] = $param; - continue; - } - - if (strpos($param, 'channel://') === false && @file_exists($param)) { - if (isset($options['force'])) { - $otherpackages[] = $param; - continue; - } - - $pkg = new PEAR_PackageFile($this->config); - $pf = $pkg->fromAnyFile($param, PEAR_VALIDATE_DOWNLOADING); - if (PEAR::isError($pf)) { - $otherpackages[] = $param; - continue; - } - - $exists = $reg->packageExists($pf->getPackage(), $pf->getChannel()); - $pversion = $reg->packageInfo($pf->getPackage(), 'version', $pf->getChannel()); - $version_compare = version_compare($pf->getVersion(), $pversion, '<='); - if ($exists && $version_compare) { - if ($this->config->get('verbose')) { - $this->ui->outputData('Ignoring installed package ' . - $reg->parsedPackageNameToString( - array('package' => $pf->getPackage(), - 'channel' => $pf->getChannel()), true)); - } - continue; - } - $otherpackages[] = $param; - continue; - } - - $e = $reg->parsePackageName($param, $channel); - if (PEAR::isError($e)) { - $otherpackages[] = $param; - } else { - $abstractpackages[] = $e; - } - } - PEAR::staticPopErrorHandling(); - - // if there are any local package .tgz or remote static url, we can't - // filter. The filter only works for abstract packages - if (count($abstractpackages) && !isset($options['force'])) { - // when not being forced, only do necessary upgrades/installs - if (isset($options['upgrade'])) { - $abstractpackages = $this->_filterUptodatePackages($abstractpackages, $command); - } else { - $count = count($abstractpackages); - foreach ($abstractpackages as $i => $package) { - if (isset($package['group'])) { - // do not filter out install groups - continue; - } - - if ($instreg->packageExists($package['package'], $package['channel'])) { - if ($count > 1) { - if ($this->config->get('verbose')) { - $this->ui->outputData('Ignoring installed package ' . - $reg->parsedPackageNameToString($package, true)); - } - unset($abstractpackages[$i]); - } elseif ($count === 1) { - // Lets try to upgrade it since it's already installed - $options['upgrade'] = true; - } - } - } - } - $abstractpackages = - array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages); - } elseif (count($abstractpackages)) { - $abstractpackages = - array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages); - } - - $packages = array_merge($abstractpackages, $otherpackages); - if (!count($packages)) { - $c = ''; - if (isset($options['channel'])){ - $c .= ' in channel "' . $options['channel'] . '"'; - } - $this->ui->outputData('Nothing to ' . $command . $c); - return true; - } - - $this->downloader = &$this->getDownloader($this->ui, $options, $this->config); - $errors = $downloaded = $binaries = array(); - $downloaded = &$this->downloader->download($packages); - if (PEAR::isError($downloaded)) { - return $this->raiseError($downloaded); - } - - $errors = $this->downloader->getErrorMsgs(); - if (count($errors)) { - $err = array(); - $err['data'] = array(); - foreach ($errors as $error) { - if ($error !== null) { - $err['data'][] = array($error); - } - } - - if (!empty($err['data'])) { - $err['headline'] = 'Install Errors'; - $this->ui->outputData($err); - } - - if (!count($downloaded)) { - return $this->raiseError("$command failed"); - } - } - - $data = array( - 'headline' => 'Packages that would be Installed' - ); - - if (isset($options['pretend'])) { - foreach ($downloaded as $package) { - $data['data'][] = array($reg->parsedPackageNameToString($package->getParsedPackage())); - } - $this->ui->outputData($data, 'pretend'); - return true; - } - - $this->installer->setOptions($options); - $this->installer->sortPackagesForInstall($downloaded); - if (PEAR::isError($err = $this->installer->setDownloadedPackages($downloaded))) { - $this->raiseError($err->getMessage()); - return true; - } - - $binaries = $extrainfo = array(); - foreach ($downloaded as $param) { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $info = $this->installer->install($param, $options); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($info)) { - $oldinfo = $info; - $pkg = &$param->getPackageFile(); - if ($info->getCode() != PEAR_INSTALLER_NOBINARY) { - if (!($info = $pkg->installBinary($this->installer))) { - $this->ui->outputData('ERROR: ' .$oldinfo->getMessage()); - continue; - } - - // we just installed a different package than requested, - // let's change the param and info so that the rest of this works - $param = $info[0]; - $info = $info[1]; - } - } - - if (!is_array($info)) { - return $this->raiseError("$command failed"); - } - - if ($param->getPackageType() == 'extsrc' || - $param->getPackageType() == 'extbin' || - $param->getPackageType() == 'zendextsrc' || - $param->getPackageType() == 'zendextbin' - ) { - $pkg = &$param->getPackageFile(); - if ($instbin = $pkg->getInstalledBinary()) { - $instpkg = &$instreg->getPackage($instbin, $pkg->getChannel()); - } else { - $instpkg = &$instreg->getPackage($pkg->getPackage(), $pkg->getChannel()); - } - - foreach ($instpkg->getFilelist() as $name => $atts) { - $pinfo = pathinfo($atts['installed_as']); - if (!isset($pinfo['extension']) || - in_array($pinfo['extension'], array('c', 'h')) - ) { - continue; // make sure we don't match php_blah.h - } - - if ((strpos($pinfo['basename'], 'php_') === 0 && - $pinfo['extension'] == 'dll') || - // most unices - $pinfo['extension'] == 'so' || - // hp-ux - $pinfo['extension'] == 'sl') { - $binaries[] = array($atts['installed_as'], $pinfo); - break; - } - } - - if (count($binaries)) { - foreach ($binaries as $pinfo) { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $ret = $this->enableExtension(array($pinfo[0]), $param->getPackageType()); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($ret)) { - $extrainfo[] = $ret->getMessage(); - if ($param->getPackageType() == 'extsrc' || - $param->getPackageType() == 'extbin') { - $exttype = 'extension'; - } else { - ob_start(); - phpinfo(INFO_GENERAL); - $info = ob_get_contents(); - ob_end_clean(); - $debug = function_exists('leak') ? '_debug' : ''; - $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; - $exttype = 'zend_extension' . $debug . $ts; - } - $extrainfo[] = 'You should add "' . $exttype . '=' . - $pinfo[1]['basename'] . '" to php.ini'; - } else { - $extrainfo[] = 'Extension ' . $instpkg->getProvidesExtension() . - ' enabled in php.ini'; - } - } - } - } - - if ($this->config->get('verbose') > 0) { - $chan = $param->getChannel(); - $label = $reg->parsedPackageNameToString( - array( - 'channel' => $chan, - 'package' => $param->getPackage(), - 'version' => $param->getVersion(), - )); - $out = array('data' => "$command ok: $label"); - if (isset($info['release_warnings'])) { - $out['release_warnings'] = $info['release_warnings']; - } - $this->ui->outputData($out, $command); - - if (!isset($options['register-only']) && !isset($options['offline'])) { - if ($this->config->isDefinedLayer('ftp')) { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $info = $this->installer->ftpInstall($param); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($info)) { - $this->ui->outputData($info->getMessage()); - $this->ui->outputData("remote install failed: $label"); - } else { - $this->ui->outputData("remote install ok: $label"); - } - } - } - } - - $deps = $param->getDeps(); - if ($deps) { - if (isset($deps['group'])) { - $groups = $deps['group']; - if (!isset($groups[0])) { - $groups = array($groups); - } - - foreach ($groups as $group) { - if ($group['attribs']['name'] == 'default') { - // default group is always installed, unless the user - // explicitly chooses to install another group - continue; - } - $extrainfo[] = $param->getPackage() . ': Optional feature ' . - $group['attribs']['name'] . ' available (' . - $group['attribs']['hint'] . ')'; - } - - $extrainfo[] = $param->getPackage() . - ': To install optional features use "pear install ' . - $reg->parsedPackageNameToString( - array('package' => $param->getPackage(), - 'channel' => $param->getChannel()), true) . - '#featurename"'; - } - } - - $pkg = &$instreg->getPackage($param->getPackage(), $param->getChannel()); - // $pkg may be NULL if install is a 'fake' install via --packagingroot - if (is_object($pkg)) { - $pkg->setConfig($this->config); - if ($list = $pkg->listPostinstallScripts()) { - $pn = $reg->parsedPackageNameToString(array('channel' => - $param->getChannel(), 'package' => $param->getPackage()), true); - $extrainfo[] = $pn . ' has post-install scripts:'; - foreach ($list as $file) { - $extrainfo[] = $file; - } - $extrainfo[] = $param->getPackage() . - ': Use "pear run-scripts ' . $pn . '" to finish setup.'; - $extrainfo[] = 'DO NOT RUN SCRIPTS FROM UNTRUSTED SOURCES'; - } - } - } - - if (count($extrainfo)) { - foreach ($extrainfo as $info) { - $this->ui->outputData($info); - } - } - - return true; - } - - // }}} - // {{{ doUpgradeAll() - - function doUpgradeAll($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - $upgrade = array(); - - if (isset($options['channel'])) { - $channels = array($options['channel']); - } else { - $channels = $reg->listChannels(); - } - - foreach ($channels as $channel) { - if ($channel == '__uri') { - continue; - } - - // parse name with channel - foreach ($reg->listPackages($channel) as $name) { - $upgrade[] = $reg->parsedPackageNameToString(array( - 'channel' => $channel, - 'package' => $name - )); - } - } - - $err = $this->doInstall($command, $options, $upgrade); - if (PEAR::isError($err)) { - $this->ui->outputData($err->getMessage(), $command); - } - } - - // }}} - // {{{ doUninstall() - - function doUninstall($command, $options, $params) - { - if (count($params) < 1) { - return $this->raiseError("Please supply the package(s) you want to uninstall"); - } - - if (empty($this->installer)) { - $this->installer = &$this->getInstaller($this->ui); - } - - if (isset($options['remoteconfig'])) { - $e = $this->config->readFTPConfigFile($options['remoteconfig']); - if (!PEAR::isError($e)) { - $this->installer->setConfig($this->config); - } - } - - $reg = &$this->config->getRegistry(); - $newparams = array(); - $binaries = array(); - $badparams = array(); - foreach ($params as $pkg) { - $channel = $this->config->get('default_channel'); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $parsed = $reg->parsePackageName($pkg, $channel); - PEAR::staticPopErrorHandling(); - if (!$parsed || PEAR::isError($parsed)) { - $badparams[] = $pkg; - continue; - } - $package = $parsed['package']; - $channel = $parsed['channel']; - $info = &$reg->getPackage($package, $channel); - if ($info === null && - ($channel == 'pear.php.net' || $channel == 'pecl.php.net')) { - // make sure this isn't a package that has flipped from pear to pecl but - // used a package.xml 1.0 - $testc = ($channel == 'pear.php.net') ? 'pecl.php.net' : 'pear.php.net'; - $info = &$reg->getPackage($package, $testc); - if ($info !== null) { - $channel = $testc; - } - } - if ($info === null) { - $badparams[] = $pkg; - } else { - $newparams[] = &$info; - // check for binary packages (this is an alias for those packages if so) - if ($installedbinary = $info->getInstalledBinary()) { - $this->ui->log('adding binary package ' . - $reg->parsedPackageNameToString(array('channel' => $channel, - 'package' => $installedbinary), true)); - $newparams[] = &$reg->getPackage($installedbinary, $channel); - } - // add the contents of a dependency group to the list of installed packages - if (isset($parsed['group'])) { - $group = $info->getDependencyGroup($parsed['group']); - if ($group) { - $installed = $reg->getInstalledGroup($group); - if ($installed) { - foreach ($installed as $i => $p) { - $newparams[] = &$installed[$i]; - } - } - } - } - } - } - $err = $this->installer->sortPackagesForUninstall($newparams); - if (PEAR::isError($err)) { - $this->ui->outputData($err->getMessage(), $command); - return true; - } - $params = $newparams; - // twist this to use it to check on whether dependent packages are also being uninstalled - // for circular dependencies like subpackages - $this->installer->setUninstallPackages($newparams); - $params = array_merge($params, $badparams); - $binaries = array(); - foreach ($params as $pkg) { - $this->installer->pushErrorHandling(PEAR_ERROR_RETURN); - if ($err = $this->installer->uninstall($pkg, $options)) { - $this->installer->popErrorHandling(); - if (PEAR::isError($err)) { - $this->ui->outputData($err->getMessage(), $command); - continue; - } - if ($pkg->getPackageType() == 'extsrc' || - $pkg->getPackageType() == 'extbin' || - $pkg->getPackageType() == 'zendextsrc' || - $pkg->getPackageType() == 'zendextbin') { - if ($instbin = $pkg->getInstalledBinary()) { - continue; // this will be uninstalled later - } - - foreach ($pkg->getFilelist() as $name => $atts) { - $pinfo = pathinfo($atts['installed_as']); - if (!isset($pinfo['extension']) || - in_array($pinfo['extension'], array('c', 'h'))) { - continue; // make sure we don't match php_blah.h - } - if ((strpos($pinfo['basename'], 'php_') === 0 && - $pinfo['extension'] == 'dll') || - // most unices - $pinfo['extension'] == 'so' || - // hp-ux - $pinfo['extension'] == 'sl') { - $binaries[] = array($atts['installed_as'], $pinfo); - break; - } - } - if (count($binaries)) { - foreach ($binaries as $pinfo) { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $ret = $this->disableExtension(array($pinfo[0]), $pkg->getPackageType()); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($ret)) { - $extrainfo[] = $ret->getMessage(); - if ($pkg->getPackageType() == 'extsrc' || - $pkg->getPackageType() == 'extbin') { - $exttype = 'extension'; - } else { - ob_start(); - phpinfo(INFO_GENERAL); - $info = ob_get_contents(); - ob_end_clean(); - $debug = function_exists('leak') ? '_debug' : ''; - $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; - $exttype = 'zend_extension' . $debug . $ts; - } - $this->ui->outputData('Unable to remove "' . $exttype . '=' . - $pinfo[1]['basename'] . '" from php.ini', $command); - } else { - $this->ui->outputData('Extension ' . $pkg->getProvidesExtension() . - ' disabled in php.ini', $command); - } - } - } - } - $savepkg = $pkg; - if ($this->config->get('verbose') > 0) { - if (is_object($pkg)) { - $pkg = $reg->parsedPackageNameToString($pkg); - } - $this->ui->outputData("uninstall ok: $pkg", $command); - } - if (!isset($options['offline']) && is_object($savepkg) && - defined('PEAR_REMOTEINSTALL_OK')) { - if ($this->config->isDefinedLayer('ftp')) { - $this->installer->pushErrorHandling(PEAR_ERROR_RETURN); - $info = $this->installer->ftpUninstall($savepkg); - $this->installer->popErrorHandling(); - if (PEAR::isError($info)) { - $this->ui->outputData($info->getMessage()); - $this->ui->outputData("remote uninstall failed: $pkg"); - } else { - $this->ui->outputData("remote uninstall ok: $pkg"); - } - } - } - } else { - $this->installer->popErrorHandling(); - if (!is_object($pkg)) { - return $this->raiseError("uninstall failed: $pkg"); - } - $pkg = $reg->parsedPackageNameToString($pkg); - } - } - - return true; - } - - // }}} - - - // }}} - // {{{ doBundle() - /* - (cox) It just downloads and untars the package, does not do - any check that the PEAR_Installer::_installFile() does. - */ - - function doBundle($command, $options, $params) - { - $opts = array( - 'force' => true, - 'nodeps' => true, - 'soft' => true, - 'downloadonly' => true - ); - $downloader = &$this->getDownloader($this->ui, $opts, $this->config); - $reg = &$this->config->getRegistry(); - if (count($params) < 1) { - return $this->raiseError("Please supply the package you want to bundle"); - } - - if (isset($options['destination'])) { - if (!is_dir($options['destination'])) { - System::mkdir('-p ' . $options['destination']); - } - $dest = realpath($options['destination']); - } else { - $pwd = getcwd(); - $dir = $pwd . DIRECTORY_SEPARATOR . 'ext'; - $dest = is_dir($dir) ? $dir : $pwd; - } - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = $downloader->setDownloadDir($dest); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($err)) { - return PEAR::raiseError('download directory "' . $dest . - '" is not writeable.'); - } - $result = &$downloader->download(array($params[0])); - if (PEAR::isError($result)) { - return $result; - } - if (!isset($result[0])) { - return $this->raiseError('unable to unpack ' . $params[0]); - } - $pkgfile = &$result[0]->getPackageFile(); - $pkgname = $pkgfile->getName(); - $pkgversion = $pkgfile->getVersion(); - - // Unpacking ------------------------------------------------- - $dest .= DIRECTORY_SEPARATOR . $pkgname; - $orig = $pkgname . '-' . $pkgversion; - - $tar = &new Archive_Tar($pkgfile->getArchiveFile()); - if (!$tar->extractModify($dest, $orig)) { - return $this->raiseError('unable to unpack ' . $pkgfile->getArchiveFile()); - } - $this->ui->outputData("Package ready at '$dest'"); - // }}} - } - - // }}} - - function doRunScripts($command, $options, $params) - { - if (!isset($params[0])) { - return $this->raiseError('run-scripts expects 1 parameter: a package name'); - } - - $reg = &$this->config->getRegistry(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($parsed)) { - return $this->raiseError($parsed); - } - - $package = &$reg->getPackage($parsed['package'], $parsed['channel']); - if (!is_object($package)) { - return $this->raiseError('Could not retrieve package "' . $params[0] . '" from registry'); - } - - $package->setConfig($this->config); - $package->runPostinstallScripts(); - $this->ui->outputData('Install scripts complete', $command); - return true; - } - - /** - * Given a list of packages, filter out those ones that are already up to date - * - * @param $packages: packages, in parsed array format ! - * @return list of packages that can be upgraded - */ - function _filterUptodatePackages($packages, $command) - { - $reg = &$this->config->getRegistry(); - $latestReleases = array(); - - $ret = array(); - foreach ($packages as $package) { - if (isset($package['group'])) { - $ret[] = $package; - continue; - } - - $channel = $package['channel']; - $name = $package['package']; - if (!$reg->packageExists($name, $channel)) { - $ret[] = $package; - continue; - } - - if (!isset($latestReleases[$channel])) { - // fill in cache for this channel - $chan = &$reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $this->raiseError($chan); - } - - $base2 = false; - $preferred_mirror = $this->config->get('preferred_mirror', null, $channel); - if ($chan->supportsREST($preferred_mirror) && - ( - //($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) || - ($base = $chan->getBaseURL('REST1.0', $preferred_mirror)) - ) - ) { - $dorest = true; - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - if (!isset($package['state'])) { - $state = $this->config->get('preferred_state', null, $channel); - } else { - $state = $package['state']; - } - - if ($dorest) { - if ($base2) { - $rest = &$this->config->getREST('1.4', array()); - $base = $base2; - } else { - $rest = &$this->config->getREST('1.0', array()); - } - - $installed = array_flip($reg->listPackages($channel)); - $latest = $rest->listLatestUpgrades($base, $state, $installed, $channel, $reg); - } - - PEAR::staticPopErrorHandling(); - if (PEAR::isError($latest)) { - $this->ui->outputData('Error getting channel info from ' . $channel . - ': ' . $latest->getMessage()); - continue; - } - - $latestReleases[$channel] = array_change_key_case($latest); - } - - // check package for latest release - $name_lower = strtolower($name); - if (isset($latestReleases[$channel][$name_lower])) { - // if not set, up to date - $inst_version = $reg->packageInfo($name, 'version', $channel); - $channel_version = $latestReleases[$channel][$name_lower]['version']; - if (version_compare($channel_version, $inst_version, 'le')) { - // installed version is up-to-date - continue; - } - - // maintain BC - if ($command == 'upgrade-all') { - $this->ui->outputData(array('data' => 'Will upgrade ' . - $reg->parsedPackageNameToString($package)), $command); - } - $ret[] = $package; - } - } - - return $ret; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Install.xml b/3rdparty/PEAR/Command/Install.xml deleted file mode 100644 index 1b1e933c22..0000000000 --- a/3rdparty/PEAR/Command/Install.xml +++ /dev/null @@ -1,276 +0,0 @@ - - - Install Package - doInstall - i - - - f - will overwrite newer installed packages - - - l - do not check for recommended dependency version - - - n - ignore dependencies, install anyway - - - r - do not install files, only register the package as installed - - - s - soft install, fail silently, or upgrade if already installed - - - B - don't build C extensions - - - Z - request uncompressed files when downloading - - - R - root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM - DIR - - - P - root directory used when packaging files, like RPM packaging - DIR - - - - force install even if there were errors - - - a - install all required and optional dependencies - - - o - install all required dependencies - - - O - do not attempt to download any urls or contact channels - - - p - Only list the packages that would be downloaded - - - [channel/]<package> ... -Installs one or more PEAR packages. You can specify a package to -install in four ways: - -"Package-1.0.tgz" : installs from a local file - -"http://example.com/Package-1.0.tgz" : installs from -anywhere on the net. - -"package.xml" : installs the package described in -package.xml. Useful for testing, or for wrapping a PEAR package in -another package manager such as RPM. - -"Package[-version/state][.tar]" : queries your default channel's server -({config master_server}) and downloads the newest package with -the preferred quality/state ({config preferred_state}). - -To retrieve Package version 1.1, use "Package-1.1," to retrieve -Package state beta, use "Package-beta." To retrieve an uncompressed -file, append .tar (make sure there is no file by the same name first) - -To download a package from another channel, prefix with the channel name like -"channel/Package" - -More than one package may be specified at once. It is ok to mix these -four ways of specifying packages. - - - - Upgrade Package - doInstall - up - - - c - upgrade packages from a specific channel - CHAN - - - f - overwrite newer installed packages - - - l - do not check for recommended dependency version - - - n - ignore dependencies, upgrade anyway - - - r - do not install files, only register the package as upgraded - - - B - don't build C extensions - - - Z - request uncompressed files when downloading - - - R - root directory used when installing files (ala PHP's INSTALL_ROOT) - DIR - - - - force install even if there were errors - - - a - install all required and optional dependencies - - - o - install all required dependencies - - - O - do not attempt to download any urls or contact channels - - - p - Only list the packages that would be downloaded - - - <package> ... -Upgrades one or more PEAR packages. See documentation for the -"install" command for ways to specify a package. - -When upgrading, your package will be updated if the provided new -package has a higher version number (use the -f option if you need to -upgrade anyway). - -More than one package may be specified at once. - - - - Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters] - doUpgradeAll - ua - - - c - upgrade packages from a specific channel - CHAN - - - n - ignore dependencies, upgrade anyway - - - r - do not install files, only register the package as upgraded - - - B - don't build C extensions - - - Z - request uncompressed files when downloading - - - R - root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM - DIR - - - - force install even if there were errors - - - - do not check for recommended dependency version - - - -WARNING: This function is deprecated in favor of using the upgrade command with no params - -Upgrades all packages that have a newer release available. Upgrades are -done only if there is a release available of the state specified in -"preferred_state" (currently {config preferred_state}), or a state considered -more stable. - - - - Un-install Package - doUninstall - un - - - n - ignore dependencies, uninstall anyway - - - r - do not remove files, only register the packages as not installed - - - R - root directory used when installing files (ala PHP's INSTALL_ROOT) - DIR - - - - force install even if there were errors - - - O - do not attempt to uninstall remotely - - - [channel/]<package> ... -Uninstalls one or more PEAR packages. More than one package may be -specified at once. Prefix with channel name to uninstall from a -channel not in your default channel ({config default_channel}) - - - - Unpacks a Pecl Package - doBundle - bun - - - d - Optional destination directory for unpacking (defaults to current path or "ext" if exists) - DIR - - - f - Force the unpacking even if there were errors in the package - - - <package> -Unpacks a Pecl Package into the selected location. It will download the -package if needed. - - - - Run Post-Install Scripts bundled with a package - doRunScripts - rs - - <package> -Run post-installation scripts in package <package>, if any exist. - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Mirror.php b/3rdparty/PEAR/Command/Mirror.php deleted file mode 100644 index 4d157c6b88..0000000000 --- a/3rdparty/PEAR/Command/Mirror.php +++ /dev/null @@ -1,139 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Mirror.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.2.0 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for providing file mirrors - * - * @category pear - * @package PEAR - * @author Alexander Merz - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.2.0 - */ -class PEAR_Command_Mirror extends PEAR_Command_Common -{ - var $commands = array( - 'download-all' => array( - 'summary' => 'Downloads each available package from the default channel', - 'function' => 'doDownloadAll', - 'shortcut' => 'da', - 'options' => array( - 'channel' => - array( - 'shortopt' => 'c', - 'doc' => 'specify a channel other than the default channel', - 'arg' => 'CHAN', - ), - ), - 'doc' => ' -Requests a list of available packages from the default channel ({config default_channel}) -and downloads them to current working directory. Note: only -packages within preferred_state ({config preferred_state}) will be downloaded' - ), - ); - - /** - * PEAR_Command_Mirror constructor. - * - * @access public - * @param object PEAR_Frontend a reference to an frontend - * @param object PEAR_Config a reference to the configuration data - */ - function PEAR_Command_Mirror(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - /** - * For unit-testing - */ - function &factory($a) - { - $a = &PEAR_Command::factory($a, $this->config); - return $a; - } - - /** - * retrieves a list of avaible Packages from master server - * and downloads them - * - * @access public - * @param string $command the command - * @param array $options the command options before the command - * @param array $params the stuff after the command name - * @return bool true if succesful - * @throw PEAR_Error - */ - function doDownloadAll($command, $options, $params) - { - $savechannel = $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - $channel = isset($options['channel']) ? $options['channel'] : - $this->config->get('default_channel'); - if (!$reg->channelExists($channel)) { - $this->config->set('default_channel', $savechannel); - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - $this->config->set('default_channel', $channel); - - $this->ui->outputData('Using Channel ' . $this->config->get('default_channel')); - $chan = $reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $this->raiseError($chan); - } - - if ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { - $rest = &$this->config->getREST('1.0', array()); - $remoteInfo = array_flip($rest->listPackages($base, $channel)); - } - - if (PEAR::isError($remoteInfo)) { - return $remoteInfo; - } - - $cmd = &$this->factory("download"); - if (PEAR::isError($cmd)) { - return $cmd; - } - - $this->ui->outputData('Using Preferred State of ' . - $this->config->get('preferred_state')); - $this->ui->outputData('Gathering release information, please wait...'); - - /** - * Error handling not necessary, because already done by - * the download command - */ - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = $cmd->run('download', array('downloadonly' => true), array_keys($remoteInfo)); - PEAR::staticPopErrorHandling(); - $this->config->set('default_channel', $savechannel); - if (PEAR::isError($err)) { - $this->ui->outputData($err->getMessage()); - } - - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Mirror.xml b/3rdparty/PEAR/Command/Mirror.xml deleted file mode 100644 index fe8be9d03b..0000000000 --- a/3rdparty/PEAR/Command/Mirror.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Downloads each available package from the default channel - doDownloadAll - da - - - c - specify a channel other than the default channel - CHAN - - - -Requests a list of available packages from the default channel ({config default_channel}) -and downloads them to current working directory. Note: only -packages within preferred_state ({config preferred_state}) will be downloaded - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Package.php b/3rdparty/PEAR/Command/Package.php deleted file mode 100644 index 81df7bf694..0000000000 --- a/3rdparty/PEAR/Command/Package.php +++ /dev/null @@ -1,1124 +0,0 @@ - - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Package.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for login/logout - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ - -class PEAR_Command_Package extends PEAR_Command_Common -{ - var $commands = array( - 'package' => array( - 'summary' => 'Build Package', - 'function' => 'doPackage', - 'shortcut' => 'p', - 'options' => array( - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'Do not gzip the package file' - ), - 'showname' => array( - 'shortopt' => 'n', - 'doc' => 'Print the name of the packaged file.', - ), - ), - 'doc' => '[descfile] [descfile2] -Creates a PEAR package from its description file (usually called -package.xml). If a second packagefile is passed in, then -the packager will check to make sure that one is a package.xml -version 1.0, and the other is a package.xml version 2.0. The -package.xml version 1.0 will be saved as "package.xml" in the archive, -and the other as "package2.xml" in the archive" -' - ), - 'package-validate' => array( - 'summary' => 'Validate Package Consistency', - 'function' => 'doPackageValidate', - 'shortcut' => 'pv', - 'options' => array(), - 'doc' => ' -', - ), - 'cvsdiff' => array( - 'summary' => 'Run a "cvs diff" for all files in a package', - 'function' => 'doCvsDiff', - 'shortcut' => 'cd', - 'options' => array( - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Be quiet', - ), - 'reallyquiet' => array( - 'shortopt' => 'Q', - 'doc' => 'Be really quiet', - ), - 'date' => array( - 'shortopt' => 'D', - 'doc' => 'Diff against revision of DATE', - 'arg' => 'DATE', - ), - 'release' => array( - 'shortopt' => 'R', - 'doc' => 'Diff against tag for package release REL', - 'arg' => 'REL', - ), - 'revision' => array( - 'shortopt' => 'r', - 'doc' => 'Diff against revision REV', - 'arg' => 'REV', - ), - 'context' => array( - 'shortopt' => 'c', - 'doc' => 'Generate context diff', - ), - 'unified' => array( - 'shortopt' => 'u', - 'doc' => 'Generate unified diff', - ), - 'ignore-case' => array( - 'shortopt' => 'i', - 'doc' => 'Ignore case, consider upper- and lower-case letters equivalent', - ), - 'ignore-whitespace' => array( - 'shortopt' => 'b', - 'doc' => 'Ignore changes in amount of white space', - ), - 'ignore-blank-lines' => array( - 'shortopt' => 'B', - 'doc' => 'Ignore changes that insert or delete blank lines', - ), - 'brief' => array( - 'doc' => 'Report only whether the files differ, no details', - ), - 'dry-run' => array( - 'shortopt' => 'n', - 'doc' => 'Don\'t do anything, just pretend', - ), - ), - 'doc' => ' -Compares all the files in a package. Without any options, this -command will compare the current code with the last checked-in code. -Using the -r or -R option you may compare the current code with that -of a specific release. -', - ), - 'svntag' => array( - 'summary' => 'Set SVN Release Tag', - 'function' => 'doSvnTag', - 'shortcut' => 'sv', - 'options' => array( - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Be quiet', - ), - 'slide' => array( - 'shortopt' => 'F', - 'doc' => 'Move (slide) tag if it exists', - ), - 'delete' => array( - 'shortopt' => 'd', - 'doc' => 'Remove tag', - ), - 'dry-run' => array( - 'shortopt' => 'n', - 'doc' => 'Don\'t do anything, just pretend', - ), - ), - 'doc' => ' [files...] - Sets a SVN tag on all files in a package. Use this command after you have - packaged a distribution tarball with the "package" command to tag what - revisions of what files were in that release. If need to fix something - after running svntag once, but before the tarball is released to the public, - use the "slide" option to move the release tag. - - to include files (such as a second package.xml, or tests not included in the - release), pass them as additional parameters. - ', - ), - 'cvstag' => array( - 'summary' => 'Set CVS Release Tag', - 'function' => 'doCvsTag', - 'shortcut' => 'ct', - 'options' => array( - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Be quiet', - ), - 'reallyquiet' => array( - 'shortopt' => 'Q', - 'doc' => 'Be really quiet', - ), - 'slide' => array( - 'shortopt' => 'F', - 'doc' => 'Move (slide) tag if it exists', - ), - 'delete' => array( - 'shortopt' => 'd', - 'doc' => 'Remove tag', - ), - 'dry-run' => array( - 'shortopt' => 'n', - 'doc' => 'Don\'t do anything, just pretend', - ), - ), - 'doc' => ' [files...] -Sets a CVS tag on all files in a package. Use this command after you have -packaged a distribution tarball with the "package" command to tag what -revisions of what files were in that release. If need to fix something -after running cvstag once, but before the tarball is released to the public, -use the "slide" option to move the release tag. - -to include files (such as a second package.xml, or tests not included in the -release), pass them as additional parameters. -', - ), - 'package-dependencies' => array( - 'summary' => 'Show package dependencies', - 'function' => 'doPackageDependencies', - 'shortcut' => 'pd', - 'options' => array(), - 'doc' => ' or or -List all dependencies the package has. -Can take a tgz / tar file, package.xml or a package name of an installed package.' - ), - 'sign' => array( - 'summary' => 'Sign a package distribution file', - 'function' => 'doSign', - 'shortcut' => 'si', - 'options' => array( - 'verbose' => array( - 'shortopt' => 'v', - 'doc' => 'Display GnuPG output', - ), - ), - 'doc' => ' -Signs a package distribution (.tar or .tgz) file with GnuPG.', - ), - 'makerpm' => array( - 'summary' => 'Builds an RPM spec file from a PEAR package', - 'function' => 'doMakeRPM', - 'shortcut' => 'rpm', - 'options' => array( - 'spec-template' => array( - 'shortopt' => 't', - 'arg' => 'FILE', - 'doc' => 'Use FILE as RPM spec file template' - ), - 'rpm-pkgname' => array( - 'shortopt' => 'p', - 'arg' => 'FORMAT', - 'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced -by the PEAR package name, defaults to "PEAR::%s".', - ), - ), - 'doc' => ' - -Creates an RPM .spec file for wrapping a PEAR package inside an RPM -package. Intended to be used from the SPECS directory, with the PEAR -package tarball in the SOURCES directory: - -$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz -Wrote RPM spec file PEAR::Net_Geo-1.0.spec -$ rpm -bb PEAR::Net_Socket-1.0.spec -... -Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm -', - ), - 'convert' => array( - 'summary' => 'Convert a package.xml 1.0 to package.xml 2.0 format', - 'function' => 'doConvert', - 'shortcut' => 'c2', - 'options' => array( - 'flat' => array( - 'shortopt' => 'f', - 'doc' => 'do not beautify the filelist.', - ), - ), - 'doc' => '[descfile] [descfile2] -Converts a package.xml in 1.0 format into a package.xml -in 2.0 format. The new file will be named package2.xml by default, -and package.xml will be used as the old file by default. -This is not the most intelligent conversion, and should only be -used for automated conversion or learning the format. -' - ), - ); - - var $output; - - /** - * PEAR_Command_Package constructor. - * - * @access public - */ - function PEAR_Command_Package(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function _displayValidationResults($err, $warn, $strict = false) - { - foreach ($err as $e) { - $this->output .= "Error: $e\n"; - } - foreach ($warn as $w) { - $this->output .= "Warning: $w\n"; - } - $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n", - sizeof($err), sizeof($warn)); - if ($strict && count($err) > 0) { - $this->output .= "Fix these errors and try again."; - return false; - } - return true; - } - - function &getPackager() - { - if (!class_exists('PEAR_Packager')) { - require_once 'PEAR/Packager.php'; - } - $a = &new PEAR_Packager; - return $a; - } - - function &getPackageFile($config, $debug = false) - { - if (!class_exists('PEAR_Common')) { - require_once 'PEAR/Common.php'; - } - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - $a = &new PEAR_PackageFile($config, $debug); - $common = new PEAR_Common; - $common->ui = $this->ui; - $a->setLogger($common); - return $a; - } - - function doPackage($command, $options, $params) - { - $this->output = ''; - $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml'; - $pkg2 = isset($params[1]) ? $params[1] : null; - if (!$pkg2 && !isset($params[0]) && file_exists('package2.xml')) { - $pkg2 = 'package2.xml'; - } - - $packager = &$this->getPackager(); - $compress = empty($options['nocompress']) ? true : false; - $result = $packager->package($pkginfofile, $compress, $pkg2); - if (PEAR::isError($result)) { - return $this->raiseError($result); - } - - // Don't want output, only the package file name just created - if (isset($options['showname'])) { - $this->output = $result; - } - - if ($this->output) { - $this->ui->outputData($this->output, $command); - } - - return true; - } - - function doPackageValidate($command, $options, $params) - { - $this->output = ''; - if (count($params) < 1) { - $params[0] = 'package.xml'; - } - - $obj = &$this->getPackageFile($this->config, $this->_debug); - $obj->rawReturn(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL); - if (PEAR::isError($info)) { - $info = $obj->fromPackageFile($params[0], PEAR_VALIDATE_NORMAL); - } else { - $archive = $info->getArchiveFile(); - $tar = &new Archive_Tar($archive); - $tar->extract(dirname($info->getPackageFile())); - $info->setPackageFile(dirname($info->getPackageFile()) . DIRECTORY_SEPARATOR . - $info->getPackage() . '-' . $info->getVersion() . DIRECTORY_SEPARATOR . - basename($info->getPackageFile())); - } - - PEAR::staticPopErrorHandling(); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $valid = false; - if ($info->getPackagexmlVersion() == '2.0') { - if ($valid = $info->validate(PEAR_VALIDATE_NORMAL)) { - $info->flattenFileList(); - $valid = $info->validate(PEAR_VALIDATE_PACKAGING); - } - } else { - $valid = $info->validate(PEAR_VALIDATE_PACKAGING); - } - - $err = $warn = array(); - if ($errors = $info->getValidationWarnings()) { - foreach ($errors as $error) { - if ($error['level'] == 'warning') { - $warn[] = $error['message']; - } else { - $err[] = $error['message']; - } - } - } - - $this->_displayValidationResults($err, $warn); - $this->ui->outputData($this->output, $command); - return true; - } - - function doSvnTag($command, $options, $params) - { - $this->output = ''; - $_cmd = $command; - if (count($params) < 1) { - $help = $this->getHelp($command); - return $this->raiseError("$command: missing parameter: $help[0]"); - } - - $packageFile = realpath($params[0]); - $dir = dirname($packageFile); - $dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1); - $obj = &$this->getPackageFile($this->config, $this->_debug); - $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $err = $warn = array(); - if (!$info->validate()) { - foreach ($info->getValidationWarnings() as $error) { - if ($error['level'] == 'warning') { - $warn[] = $error['message']; - } else { - $err[] = $error['message']; - } - } - } - - if (!$this->_displayValidationResults($err, $warn, true)) { - $this->ui->outputData($this->output, $command); - return $this->raiseError('SVN tag failed'); - } - - $version = $info->getVersion(); - $package = $info->getName(); - $svntag = "$package-$version"; - - if (isset($options['delete'])) { - return $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options); - } - - $path = $this->_svnFindPath($packageFile); - - // Check if there are any modified files - $fp = popen('svn st --xml ' . dirname($packageFile), "r"); - $out = ''; - while ($line = fgets($fp, 1024)) { - $out .= rtrim($line)."\n"; - } - pclose($fp); - - if (!isset($options['quiet']) && strpos($out, 'item="modified"')) { - $params = array(array( - 'name' => 'modified', - 'type' => 'yesno', - 'default' => 'no', - 'prompt' => 'You have files in your SVN checkout (' . $path['from'] . ') that have been modified but not commited, do you still want to tag ' . $version . '?', - )); - $answers = $this->ui->confirmDialog($params); - - if (!in_array($answers['modified'], array('y', 'yes', 'on', '1'))) { - return true; - } - } - - if (isset($options['slide'])) { - $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options); - } - - // Check if tag already exists - $releaseTag = $path['local']['base'] . 'tags' . DIRECTORY_SEPARATOR . $svntag; - $existsCommand = 'svn ls ' . $path['base'] . 'tags/'; - - $fp = popen($existsCommand, "r"); - $out = ''; - while ($line = fgets($fp, 1024)) { - $out .= rtrim($line)."\n"; - } - pclose($fp); - - if (in_array($svntag . DIRECTORY_SEPARATOR, explode("\n", $out))) { - $this->ui->outputData($this->output, $command); - return $this->raiseError('SVN tag ' . $svntag . ' for ' . $package . ' already exists.'); - } elseif (file_exists($path['local']['base'] . 'tags') === false) { - return $this->raiseError('Can not locate the tags directory at ' . $path['local']['base'] . 'tags'); - } elseif (is_writeable($path['local']['base'] . 'tags') === false) { - return $this->raiseError('Can not write to the tag directory at ' . $path['local']['base'] . 'tags'); - } else { - $makeCommand = 'svn mkdir ' . $releaseTag; - $this->output .= "+ $makeCommand\n"; - if (empty($options['dry-run'])) { - // We need to create the tag dir. - $fp = popen($makeCommand, "r"); - $out = ''; - while ($line = fgets($fp, 1024)) { - $out .= rtrim($line)."\n"; - } - pclose($fp); - $this->output .= "$out\n"; - } - } - - $command = 'svn'; - if (isset($options['quiet'])) { - $command .= ' -q'; - } - - $command .= ' copy --parents '; - - $dir = dirname($packageFile); - $dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1); - $files = array_keys($info->getFilelist()); - if (!in_array(basename($packageFile), $files)) { - $files[] = basename($packageFile); - } - - array_shift($params); - if (count($params)) { - // add in additional files to be tagged (package files and such) - $files = array_merge($files, $params); - } - - $commands = array(); - foreach ($files as $file) { - if (!file_exists($file)) { - $file = $dir . DIRECTORY_SEPARATOR . $file; - } - $commands[] = $command . ' ' . escapeshellarg($file) . ' ' . - escapeshellarg($releaseTag . DIRECTORY_SEPARATOR . $file); - } - - $this->output .= implode("\n", $commands) . "\n"; - if (empty($options['dry-run'])) { - foreach ($commands as $command) { - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - } - - $command = 'svn ci -m "Tagging the ' . $version . ' release" ' . $releaseTag . "\n"; - $this->output .= "+ $command\n"; - if (empty($options['dry-run'])) { - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - - $this->ui->outputData($this->output, $_cmd); - return true; - } - - function _svnFindPath($file) - { - $xml = ''; - $command = "svn info --xml $file"; - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $xml .= rtrim($line)."\n"; - } - pclose($fp); - $url_tag = strpos($xml, ''); - $url = substr($xml, $url_tag + 5, strpos($xml, '', $url_tag + 5) - ($url_tag + 5)); - - $path = array(); - $path['from'] = substr($url, 0, strrpos($url, '/')); - $path['base'] = substr($path['from'], 0, strrpos($path['from'], '/') + 1); - - // Figure out the local paths - see http://pear.php.net/bugs/17463 - $pos = strpos($file, DIRECTORY_SEPARATOR . 'trunk' . DIRECTORY_SEPARATOR); - if ($pos === false) { - $pos = strpos($file, DIRECTORY_SEPARATOR . 'branches' . DIRECTORY_SEPARATOR); - } - $path['local']['base'] = substr($file, 0, $pos + 1); - - return $path; - } - - function _svnRemoveTag($version, $package, $tag, $packageFile, $options) - { - $command = 'svn'; - - if (isset($options['quiet'])) { - $command .= ' -q'; - } - - $command .= ' remove'; - $command .= ' -m "Removing tag for the ' . $version . ' release."'; - - $path = $this->_svnFindPath($packageFile); - $command .= ' ' . $path['base'] . 'tags/' . $tag; - - - if ($this->config->get('verbose') > 1) { - $this->output .= "+ $command\n"; - } - - $this->output .= "+ $command\n"; - if (empty($options['dry-run'])) { - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - - $this->ui->outputData($this->output, $command); - return true; - } - - function doCvsTag($command, $options, $params) - { - $this->output = ''; - $_cmd = $command; - if (count($params) < 1) { - $help = $this->getHelp($command); - return $this->raiseError("$command: missing parameter: $help[0]"); - } - - $packageFile = realpath($params[0]); - $obj = &$this->getPackageFile($this->config, $this->_debug); - $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $err = $warn = array(); - if (!$info->validate()) { - foreach ($info->getValidationWarnings() as $error) { - if ($error['level'] == 'warning') { - $warn[] = $error['message']; - } else { - $err[] = $error['message']; - } - } - } - - if (!$this->_displayValidationResults($err, $warn, true)) { - $this->ui->outputData($this->output, $command); - return $this->raiseError('CVS tag failed'); - } - - $version = $info->getVersion(); - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version); - $cvstag = "RELEASE_$cvsversion"; - $files = array_keys($info->getFilelist()); - $command = 'cvs'; - if (isset($options['quiet'])) { - $command .= ' -q'; - } - - if (isset($options['reallyquiet'])) { - $command .= ' -Q'; - } - - $command .= ' tag'; - if (isset($options['slide'])) { - $command .= ' -F'; - } - - if (isset($options['delete'])) { - $command .= ' -d'; - } - - $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]); - array_shift($params); - if (count($params)) { - // add in additional files to be tagged - $files = array_merge($files, $params); - } - - $dir = dirname($packageFile); - $dir = substr($dir, strrpos($dir, '/') + 1); - foreach ($files as $file) { - if (!file_exists($file)) { - $file = $dir . DIRECTORY_SEPARATOR . $file; - } - $command .= ' ' . escapeshellarg($file); - } - - if ($this->config->get('verbose') > 1) { - $this->output .= "+ $command\n"; - } - - $this->output .= "+ $command\n"; - if (empty($options['dry-run'])) { - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - - $this->ui->outputData($this->output, $_cmd); - return true; - } - - function doCvsDiff($command, $options, $params) - { - $this->output = ''; - if (sizeof($params) < 1) { - $help = $this->getHelp($command); - return $this->raiseError("$command: missing parameter: $help[0]"); - } - - $file = realpath($params[0]); - $obj = &$this->getPackageFile($this->config, $this->_debug); - $info = $obj->fromAnyFile($file, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $err = $warn = array(); - if (!$info->validate()) { - foreach ($info->getValidationWarnings() as $error) { - if ($error['level'] == 'warning') { - $warn[] = $error['message']; - } else { - $err[] = $error['message']; - } - } - } - - if (!$this->_displayValidationResults($err, $warn, true)) { - $this->ui->outputData($this->output, $command); - return $this->raiseError('CVS diff failed'); - } - - $info1 = $info->getFilelist(); - $files = $info1; - $cmd = "cvs"; - if (isset($options['quiet'])) { - $cmd .= ' -q'; - unset($options['quiet']); - } - - if (isset($options['reallyquiet'])) { - $cmd .= ' -Q'; - unset($options['reallyquiet']); - } - - if (isset($options['release'])) { - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']); - $cvstag = "RELEASE_$cvsversion"; - $options['revision'] = $cvstag; - unset($options['release']); - } - - $execute = true; - if (isset($options['dry-run'])) { - $execute = false; - unset($options['dry-run']); - } - - $cmd .= ' diff'; - // the rest of the options are passed right on to "cvs diff" - foreach ($options as $option => $optarg) { - $arg = $short = false; - if (isset($this->commands[$command]['options'][$option])) { - $arg = $this->commands[$command]['options'][$option]['arg']; - $short = $this->commands[$command]['options'][$option]['shortopt']; - } - $cmd .= $short ? " -$short" : " --$option"; - if ($arg && $optarg) { - $cmd .= ($short ? '' : '=') . escapeshellarg($optarg); - } - } - - foreach ($files as $file) { - $cmd .= ' ' . escapeshellarg($file['name']); - } - - if ($this->config->get('verbose') > 1) { - $this->output .= "+ $cmd\n"; - } - - if ($execute) { - $fp = popen($cmd, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - - $this->ui->outputData($this->output, $command); - return true; - } - - function doPackageDependencies($command, $options, $params) - { - // $params[0] -> the PEAR package to list its information - if (count($params) !== 1) { - return $this->raiseError("bad parameter(s), try \"help $command\""); - } - - $obj = &$this->getPackageFile($this->config, $this->_debug); - if (is_file($params[0]) || strpos($params[0], '.xml') > 0) { - $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); - } else { - $reg = $this->config->getRegistry(); - $info = $obj->fromArray($reg->packageInfo($params[0])); - } - - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $deps = $info->getDeps(); - if (is_array($deps)) { - if ($info->getPackagexmlVersion() == '1.0') { - $data = array( - 'caption' => 'Dependencies for pear/' . $info->getPackage(), - 'border' => true, - 'headline' => array("Required?", "Type", "Name", "Relation", "Version"), - ); - - foreach ($deps as $d) { - if (isset($d['optional'])) { - if ($d['optional'] == 'yes') { - $req = 'No'; - } else { - $req = 'Yes'; - } - } else { - $req = 'Yes'; - } - - if (isset($this->_deps_rel_trans[$d['rel']])) { - $rel = $this->_deps_rel_trans[$d['rel']]; - } else { - $rel = $d['rel']; - } - - if (isset($this->_deps_type_trans[$d['type']])) { - $type = ucfirst($this->_deps_type_trans[$d['type']]); - } else { - $type = $d['type']; - } - - if (isset($d['name'])) { - $name = $d['name']; - } else { - $name = ''; - } - - if (isset($d['version'])) { - $version = $d['version']; - } else { - $version = ''; - } - - $data['data'][] = array($req, $type, $name, $rel, $version); - } - } else { // package.xml 2.0 dependencies display - require_once 'PEAR/Dependency2.php'; - $deps = $info->getDependencies(); - $reg = &$this->config->getRegistry(); - if (is_array($deps)) { - $d = new PEAR_Dependency2($this->config, array(), ''); - $data = array( - 'caption' => 'Dependencies for ' . $info->getPackage(), - 'border' => true, - 'headline' => array("Required?", "Type", "Name", 'Versioning', 'Group'), - ); - foreach ($deps as $type => $subd) { - $req = ($type == 'required') ? 'Yes' : 'No'; - if ($type == 'group') { - $group = $subd['attribs']['name']; - } else { - $group = ''; - } - - if (!isset($subd[0])) { - $subd = array($subd); - } - - foreach ($subd as $groupa) { - foreach ($groupa as $deptype => $depinfo) { - if ($deptype == 'attribs') { - continue; - } - - if ($deptype == 'pearinstaller') { - $deptype = 'pear Installer'; - } - - if (!isset($depinfo[0])) { - $depinfo = array($depinfo); - } - - foreach ($depinfo as $inf) { - $name = ''; - if (isset($inf['channel'])) { - $alias = $reg->channelAlias($inf['channel']); - if (!$alias) { - $alias = '(channel?) ' .$inf['channel']; - } - $name = $alias . '/'; - - } - if (isset($inf['name'])) { - $name .= $inf['name']; - } elseif (isset($inf['pattern'])) { - $name .= $inf['pattern']; - } else { - $name .= ''; - } - - if (isset($inf['uri'])) { - $name .= ' [' . $inf['uri'] . ']'; - } - - if (isset($inf['conflicts'])) { - $ver = 'conflicts'; - } else { - $ver = $d->_getExtraString($inf); - } - - $data['data'][] = array($req, ucfirst($deptype), $name, - $ver, $group); - } - } - } - } - } - } - - $this->ui->outputData($data, $command); - return true; - } - - // Fallback - $this->ui->outputData("This package does not have any dependencies.", $command); - } - - function doSign($command, $options, $params) - { - // should move most of this code into PEAR_Packager - // so it'll be easy to implement "pear package --sign" - if (count($params) !== 1) { - return $this->raiseError("bad parameter(s), try \"help $command\""); - } - - require_once 'System.php'; - require_once 'Archive/Tar.php'; - - if (!file_exists($params[0])) { - return $this->raiseError("file does not exist: $params[0]"); - } - - $obj = $this->getPackageFile($this->config, $this->_debug); - $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $tar = new Archive_Tar($params[0]); - - $tmpdir = $this->config->get('temp_dir'); - $tmpdir = System::mktemp(' -t "' . $tmpdir . '" -d pearsign'); - if (!$tar->extractList('package2.xml package.xml package.sig', $tmpdir)) { - return $this->raiseError("failed to extract tar file"); - } - - if (file_exists("$tmpdir/package.sig")) { - return $this->raiseError("package already signed"); - } - - $packagexml = 'package.xml'; - if (file_exists("$tmpdir/package2.xml")) { - $packagexml = 'package2.xml'; - } - - if (file_exists("$tmpdir/package.sig")) { - unlink("$tmpdir/package.sig"); - } - - if (!file_exists("$tmpdir/$packagexml")) { - return $this->raiseError("Extracted file $tmpdir/$packagexml not found."); - } - - $input = $this->ui->userDialog($command, - array('GnuPG Passphrase'), - array('password')); - if (!isset($input[0])) { - //use empty passphrase - $input[0] = ''; - } - - $devnull = (isset($options['verbose'])) ? '' : ' 2>/dev/null'; - $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/$packagexml" . $devnull, "w"); - if (!$gpg) { - return $this->raiseError("gpg command failed"); - } - - fwrite($gpg, "$input[0]\n"); - if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) { - return $this->raiseError("gpg sign failed"); - } - - if (!$tar->addModify("$tmpdir/package.sig", '', $tmpdir)) { - return $this->raiseError('failed adding signature to file'); - } - - $this->ui->outputData("Package signed.", $command); - return true; - } - - /** - * For unit testing purposes - */ - function &getInstaller(&$ui) - { - if (!class_exists('PEAR_Installer')) { - require_once 'PEAR/Installer.php'; - } - $a = &new PEAR_Installer($ui); - return $a; - } - - /** - * For unit testing purposes - */ - function &getCommandPackaging(&$ui, &$config) - { - if (!class_exists('PEAR_Command_Packaging')) { - if ($fp = @fopen('PEAR/Command/Packaging.php', 'r', true)) { - fclose($fp); - include_once 'PEAR/Command/Packaging.php'; - } - } - - if (class_exists('PEAR_Command_Packaging')) { - $a = &new PEAR_Command_Packaging($ui, $config); - } else { - $a = null; - } - - return $a; - } - - function doMakeRPM($command, $options, $params) - { - - // Check to see if PEAR_Command_Packaging is installed, and - // transparently switch to use the "make-rpm-spec" command from it - // instead, if it does. Otherwise, continue to use the old version - // of "makerpm" supplied with this package (PEAR). - $packaging_cmd = $this->getCommandPackaging($this->ui, $this->config); - if ($packaging_cmd !== null) { - $this->ui->outputData('PEAR_Command_Packaging is installed; using '. - 'newer "make-rpm-spec" command instead'); - return $packaging_cmd->run('make-rpm-spec', $options, $params); - } - - $this->ui->outputData('WARNING: "pear makerpm" is no longer available; an '. - 'improved version is available via "pear make-rpm-spec", which '. - 'is available by installing PEAR_Command_Packaging'); - return true; - } - - function doConvert($command, $options, $params) - { - $packagexml = isset($params[0]) ? $params[0] : 'package.xml'; - $newpackagexml = isset($params[1]) ? $params[1] : dirname($packagexml) . - DIRECTORY_SEPARATOR . 'package2.xml'; - $pkg = &$this->getPackageFile($this->config, $this->_debug); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $pf = $pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($pf)) { - if (is_array($pf->getUserInfo())) { - foreach ($pf->getUserInfo() as $warning) { - $this->ui->outputData($warning['message']); - } - } - return $this->raiseError($pf); - } - - if (is_a($pf, 'PEAR_PackageFile_v2')) { - $this->ui->outputData($packagexml . ' is already a package.xml version 2.0'); - return true; - } - - $gen = &$pf->getDefaultGenerator(); - $newpf = &$gen->toV2(); - $newpf->setPackagefile($newpackagexml); - $gen = &$newpf->getDefaultGenerator(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $state = (isset($options['flat']) ? PEAR_VALIDATE_PACKAGING : PEAR_VALIDATE_NORMAL); - $saved = $gen->toPackageFile(dirname($newpackagexml), $state, basename($newpackagexml)); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($saved)) { - if (is_array($saved->getUserInfo())) { - foreach ($saved->getUserInfo() as $warning) { - $this->ui->outputData($warning['message']); - } - } - - $this->ui->outputData($saved->getMessage()); - return true; - } - - $this->ui->outputData('Wrote new version 2.0 package.xml to "' . $saved . '"'); - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Package.xml b/3rdparty/PEAR/Command/Package.xml deleted file mode 100644 index d1aff9d48d..0000000000 --- a/3rdparty/PEAR/Command/Package.xml +++ /dev/null @@ -1,237 +0,0 @@ - - - Build Package - doPackage - p - - - Z - Do not gzip the package file - - - n - Print the name of the packaged file. - - - [descfile] [descfile2] -Creates a PEAR package from its description file (usually called -package.xml). If a second packagefile is passed in, then -the packager will check to make sure that one is a package.xml -version 1.0, and the other is a package.xml version 2.0. The -package.xml version 1.0 will be saved as "package.xml" in the archive, -and the other as "package2.xml" in the archive" - - - - Validate Package Consistency - doPackageValidate - pv - - - - - - Run a "cvs diff" for all files in a package - doCvsDiff - cd - - - q - Be quiet - - - Q - Be really quiet - - - D - Diff against revision of DATE - DATE - - - R - Diff against tag for package release REL - REL - - - r - Diff against revision REV - REV - - - c - Generate context diff - - - u - Generate unified diff - - - i - Ignore case, consider upper- and lower-case letters equivalent - - - b - Ignore changes in amount of white space - - - B - Ignore changes that insert or delete blank lines - - - - Report only whether the files differ, no details - - - n - Don't do anything, just pretend - - - <package.xml> -Compares all the files in a package. Without any options, this -command will compare the current code with the last checked-in code. -Using the -r or -R option you may compare the current code with that -of a specific release. - - - - Set SVN Release Tag - doSvnTag - sv - - - q - Be quiet - - - F - Move (slide) tag if it exists - - - d - Remove tag - - - n - Don't do anything, just pretend - - - <package.xml> [files...] - Sets a SVN tag on all files in a package. Use this command after you have - packaged a distribution tarball with the "package" command to tag what - revisions of what files were in that release. If need to fix something - after running svntag once, but before the tarball is released to the public, - use the "slide" option to move the release tag. - - to include files (such as a second package.xml, or tests not included in the - release), pass them as additional parameters. - - - - Set CVS Release Tag - doCvsTag - ct - - - q - Be quiet - - - Q - Be really quiet - - - F - Move (slide) tag if it exists - - - d - Remove tag - - - n - Don't do anything, just pretend - - - <package.xml> [files...] -Sets a CVS tag on all files in a package. Use this command after you have -packaged a distribution tarball with the "package" command to tag what -revisions of what files were in that release. If need to fix something -after running cvstag once, but before the tarball is released to the public, -use the "slide" option to move the release tag. - -to include files (such as a second package.xml, or tests not included in the -release), pass them as additional parameters. - - - - Show package dependencies - doPackageDependencies - pd - - <package-file> or <package.xml> or <install-package-name> -List all dependencies the package has. -Can take a tgz / tar file, package.xml or a package name of an installed package. - - - Sign a package distribution file - doSign - si - - - v - Display GnuPG output - - - <package-file> -Signs a package distribution (.tar or .tgz) file with GnuPG. - - - Builds an RPM spec file from a PEAR package - doMakeRPM - rpm - - - t - Use FILE as RPM spec file template - FILE - - - p - Use FORMAT as format string for RPM package name, %s is replaced -by the PEAR package name, defaults to "PEAR::%s". - FORMAT - - - <package-file> - -Creates an RPM .spec file for wrapping a PEAR package inside an RPM -package. Intended to be used from the SPECS directory, with the PEAR -package tarball in the SOURCES directory: - -$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz -Wrote RPM spec file PEAR::Net_Geo-1.0.spec -$ rpm -bb PEAR::Net_Socket-1.0.spec -... -Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm - - - - Convert a package.xml 1.0 to package.xml 2.0 format - doConvert - c2 - - - f - do not beautify the filelist. - - - [descfile] [descfile2] -Converts a package.xml in 1.0 format into a package.xml -in 2.0 format. The new file will be named package2.xml by default, -and package.xml will be used as the old file by default. -This is not the most intelligent conversion, and should only be -used for automated conversion or learning the format. - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Pickle.php b/3rdparty/PEAR/Command/Pickle.php deleted file mode 100644 index 87aa25ea30..0000000000 --- a/3rdparty/PEAR/Command/Pickle.php +++ /dev/null @@ -1,421 +0,0 @@ - - * @copyright 2005-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Pickle.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for login/logout - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 2005-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.1 - */ - -class PEAR_Command_Pickle extends PEAR_Command_Common -{ - var $commands = array( - 'pickle' => array( - 'summary' => 'Build PECL Package', - 'function' => 'doPackage', - 'shortcut' => 'pi', - 'options' => array( - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'Do not gzip the package file' - ), - 'showname' => array( - 'shortopt' => 'n', - 'doc' => 'Print the name of the packaged file.', - ), - ), - 'doc' => '[descfile] -Creates a PECL package from its package2.xml file. - -An automatic conversion will be made to a package.xml 1.0 and written out to -disk in the current directory as "package.xml". Note that -only simple package.xml 2.0 will be converted. package.xml 2.0 with: - - - dependency types other than required/optional PECL package/ext/php/pearinstaller - - more than one extsrcrelease or zendextsrcrelease - - zendextbinrelease, extbinrelease, phprelease, or bundle release type - - dependency groups - - ignore tags in release filelist - - tasks other than replace - - custom roles - -will cause pickle to fail, and output an error message. If your package2.xml -uses any of these features, you are best off using PEAR_PackageFileManager to -generate both package.xml. -' - ), - ); - - /** - * PEAR_Command_Package constructor. - * - * @access public - */ - function PEAR_Command_Pickle(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - /** - * For unit-testing ease - * - * @return PEAR_Packager - */ - function &getPackager() - { - if (!class_exists('PEAR_Packager')) { - require_once 'PEAR/Packager.php'; - } - - $a = &new PEAR_Packager; - return $a; - } - - /** - * For unit-testing ease - * - * @param PEAR_Config $config - * @param bool $debug - * @param string|null $tmpdir - * @return PEAR_PackageFile - */ - function &getPackageFile($config, $debug = false) - { - if (!class_exists('PEAR_Common')) { - require_once 'PEAR/Common.php'; - } - - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - - $a = &new PEAR_PackageFile($config, $debug); - $common = new PEAR_Common; - $common->ui = $this->ui; - $a->setLogger($common); - return $a; - } - - function doPackage($command, $options, $params) - { - $this->output = ''; - $pkginfofile = isset($params[0]) ? $params[0] : 'package2.xml'; - $packager = &$this->getPackager(); - if (PEAR::isError($err = $this->_convertPackage($pkginfofile))) { - return $err; - } - - $compress = empty($options['nocompress']) ? true : false; - $result = $packager->package($pkginfofile, $compress, 'package.xml'); - if (PEAR::isError($result)) { - return $this->raiseError($result); - } - - // Don't want output, only the package file name just created - if (isset($options['showname'])) { - $this->ui->outputData($result, $command); - } - - return true; - } - - function _convertPackage($packagexml) - { - $pkg = &$this->getPackageFile($this->config); - $pf2 = &$pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL); - if (!is_a($pf2, 'PEAR_PackageFile_v2')) { - return $this->raiseError('Cannot process "' . - $packagexml . '", is not a package.xml 2.0'); - } - - require_once 'PEAR/PackageFile/v1.php'; - $pf = new PEAR_PackageFile_v1; - $pf->setConfig($this->config); - if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", is not an extension source package. Using a PEAR_PackageFileManager-based ' . - 'script is an option'); - } - - if (is_array($pf2->getUsesRole())) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains custom roles. Using a PEAR_PackageFileManager-based script or ' . - 'the convert command is an option'); - } - - if (is_array($pf2->getUsesTask())) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains custom tasks. Using a PEAR_PackageFileManager-based script or ' . - 'the convert command is an option'); - } - - $deps = $pf2->getDependencies(); - if (isset($deps['group'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains dependency groups. Using a PEAR_PackageFileManager-based script ' . - 'or the convert command is an option'); - } - - if (isset($deps['required']['subpackage']) || - isset($deps['optional']['subpackage'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains subpackage dependencies. Using a PEAR_PackageFileManager-based '. - 'script is an option'); - } - - if (isset($deps['required']['os'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains os dependencies. Using a PEAR_PackageFileManager-based '. - 'script is an option'); - } - - if (isset($deps['required']['arch'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains arch dependencies. Using a PEAR_PackageFileManager-based '. - 'script is an option'); - } - - $pf->setPackage($pf2->getPackage()); - $pf->setSummary($pf2->getSummary()); - $pf->setDescription($pf2->getDescription()); - foreach ($pf2->getMaintainers() as $maintainer) { - $pf->addMaintainer($maintainer['role'], $maintainer['handle'], - $maintainer['name'], $maintainer['email']); - } - - $pf->setVersion($pf2->getVersion()); - $pf->setDate($pf2->getDate()); - $pf->setLicense($pf2->getLicense()); - $pf->setState($pf2->getState()); - $pf->setNotes($pf2->getNotes()); - $pf->addPhpDep($deps['required']['php']['min'], 'ge'); - if (isset($deps['required']['php']['max'])) { - $pf->addPhpDep($deps['required']['php']['max'], 'le'); - } - - if (isset($deps['required']['package'])) { - if (!isset($deps['required']['package'][0])) { - $deps['required']['package'] = array($deps['required']['package']); - } - - foreach ($deps['required']['package'] as $dep) { - if (!isset($dep['channel'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains uri-based dependency on a package. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if ($dep['channel'] != 'pear.php.net' - && $dep['channel'] != 'pecl.php.net' - && $dep['channel'] != 'doc.php.net') { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains dependency on a non-standard channel package. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if (isset($dep['conflicts'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains conflicts dependency. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if (isset($dep['exclude'])) { - $this->ui->outputData('WARNING: exclude tags are ignored in conversion'); - } - - if (isset($dep['min'])) { - $pf->addPackageDep($dep['name'], $dep['min'], 'ge'); - } - - if (isset($dep['max'])) { - $pf->addPackageDep($dep['name'], $dep['max'], 'le'); - } - } - } - - if (isset($deps['required']['extension'])) { - if (!isset($deps['required']['extension'][0])) { - $deps['required']['extension'] = array($deps['required']['extension']); - } - - foreach ($deps['required']['extension'] as $dep) { - if (isset($dep['conflicts'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains conflicts dependency. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if (isset($dep['exclude'])) { - $this->ui->outputData('WARNING: exclude tags are ignored in conversion'); - } - - if (isset($dep['min'])) { - $pf->addExtensionDep($dep['name'], $dep['min'], 'ge'); - } - - if (isset($dep['max'])) { - $pf->addExtensionDep($dep['name'], $dep['max'], 'le'); - } - } - } - - if (isset($deps['optional']['package'])) { - if (!isset($deps['optional']['package'][0])) { - $deps['optional']['package'] = array($deps['optional']['package']); - } - - foreach ($deps['optional']['package'] as $dep) { - if (!isset($dep['channel'])) { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains uri-based dependency on a package. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if ($dep['channel'] != 'pear.php.net' - && $dep['channel'] != 'pecl.php.net' - && $dep['channel'] != 'doc.php.net') { - return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . - ' contains dependency on a non-standard channel package. Using a ' . - 'PEAR_PackageFileManager-based script is an option'); - } - - if (isset($dep['exclude'])) { - $this->ui->outputData('WARNING: exclude tags are ignored in conversion'); - } - - if (isset($dep['min'])) { - $pf->addPackageDep($dep['name'], $dep['min'], 'ge', 'yes'); - } - - if (isset($dep['max'])) { - $pf->addPackageDep($dep['name'], $dep['max'], 'le', 'yes'); - } - } - } - - if (isset($deps['optional']['extension'])) { - if (!isset($deps['optional']['extension'][0])) { - $deps['optional']['extension'] = array($deps['optional']['extension']); - } - - foreach ($deps['optional']['extension'] as $dep) { - if (isset($dep['exclude'])) { - $this->ui->outputData('WARNING: exclude tags are ignored in conversion'); - } - - if (isset($dep['min'])) { - $pf->addExtensionDep($dep['name'], $dep['min'], 'ge', 'yes'); - } - - if (isset($dep['max'])) { - $pf->addExtensionDep($dep['name'], $dep['max'], 'le', 'yes'); - } - } - } - - $contents = $pf2->getContents(); - $release = $pf2->getReleases(); - if (isset($releases[0])) { - return $this->raiseError('Cannot safely process "' . $packagexml . '" contains ' - . 'multiple extsrcrelease/zendextsrcrelease tags. Using a PEAR_PackageFileManager-based script ' . - 'or the convert command is an option'); - } - - if ($configoptions = $pf2->getConfigureOptions()) { - foreach ($configoptions as $option) { - $default = isset($option['default']) ? $option['default'] : false; - $pf->addConfigureOption($option['name'], $option['prompt'], $default); - } - } - - if (isset($release['filelist']['ignore'])) { - return $this->raiseError('Cannot safely process "' . $packagexml . '" contains ' - . 'ignore tags. Using a PEAR_PackageFileManager-based script or the convert' . - ' command is an option'); - } - - if (isset($release['filelist']['install']) && - !isset($release['filelist']['install'][0])) { - $release['filelist']['install'] = array($release['filelist']['install']); - } - - if (isset($contents['dir']['attribs']['baseinstalldir'])) { - $baseinstalldir = $contents['dir']['attribs']['baseinstalldir']; - } else { - $baseinstalldir = false; - } - - if (!isset($contents['dir']['file'][0])) { - $contents['dir']['file'] = array($contents['dir']['file']); - } - - foreach ($contents['dir']['file'] as $file) { - if ($baseinstalldir && !isset($file['attribs']['baseinstalldir'])) { - $file['attribs']['baseinstalldir'] = $baseinstalldir; - } - - $processFile = $file; - unset($processFile['attribs']); - if (count($processFile)) { - foreach ($processFile as $name => $task) { - if ($name != $pf2->getTasksNs() . ':replace') { - return $this->raiseError('Cannot safely process "' . $packagexml . - '" contains tasks other than replace. Using a ' . - 'PEAR_PackageFileManager-based script is an option.'); - } - $file['attribs']['replace'][] = $task; - } - } - - if (!in_array($file['attribs']['role'], PEAR_Common::getFileRoles())) { - return $this->raiseError('Cannot safely convert "' . $packagexml . - '", contains custom roles. Using a PEAR_PackageFileManager-based script ' . - 'or the convert command is an option'); - } - - if (isset($release['filelist']['install'])) { - foreach ($release['filelist']['install'] as $installas) { - if ($installas['attribs']['name'] == $file['attribs']['name']) { - $file['attribs']['install-as'] = $installas['attribs']['as']; - } - } - } - - $pf->addFile('/', $file['attribs']['name'], $file['attribs']); - } - - if ($pf2->getChangeLog()) { - $this->ui->outputData('WARNING: changelog is not translated to package.xml ' . - '1.0, use PEAR_PackageFileManager-based script if you need changelog-' . - 'translation for package.xml 1.0'); - } - - $gen = &$pf->getDefaultGenerator(); - $gen->toPackageFile('.'); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Pickle.xml b/3rdparty/PEAR/Command/Pickle.xml deleted file mode 100644 index 721ecea995..0000000000 --- a/3rdparty/PEAR/Command/Pickle.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - Build PECL Package - doPackage - pi - - - Z - Do not gzip the package file - - - n - Print the name of the packaged file. - - - [descfile] -Creates a PECL package from its package2.xml file. - -An automatic conversion will be made to a package.xml 1.0 and written out to -disk in the current directory as "package.xml". Note that -only simple package.xml 2.0 will be converted. package.xml 2.0 with: - - - dependency types other than required/optional PECL package/ext/php/pearinstaller - - more than one extsrcrelease or zendextsrcrelease - - zendextbinrelease, extbinrelease, phprelease, or bundle release type - - dependency groups - - ignore tags in release filelist - - tasks other than replace - - custom roles - -will cause pickle to fail, and output an error message. If your package2.xml -uses any of these features, you are best off using PEAR_PackageFileManager to -generate both package.xml. - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Registry.php b/3rdparty/PEAR/Command/Registry.php deleted file mode 100644 index 4304db5ddf..0000000000 --- a/3rdparty/PEAR/Command/Registry.php +++ /dev/null @@ -1,1145 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Registry.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for registry manipulation - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Registry extends PEAR_Command_Common -{ - var $commands = array( - 'list' => array( - 'summary' => 'List Installed Packages In The Default Channel', - 'function' => 'doList', - 'shortcut' => 'l', - 'options' => array( - 'channel' => array( - 'shortopt' => 'c', - 'doc' => 'list installed packages from this channel', - 'arg' => 'CHAN', - ), - 'allchannels' => array( - 'shortopt' => 'a', - 'doc' => 'list installed packages from all channels', - ), - 'channelinfo' => array( - 'shortopt' => 'i', - 'doc' => 'output fully channel-aware data, even on failure', - ), - ), - 'doc' => ' -If invoked without parameters, this command lists the PEAR packages -installed in your php_dir ({config php_dir}). With a parameter, it -lists the files in a package. -', - ), - 'list-files' => array( - 'summary' => 'List Files In Installed Package', - 'function' => 'doFileList', - 'shortcut' => 'fl', - 'options' => array(), - 'doc' => ' -List the files in an installed package. -' - ), - 'shell-test' => array( - 'summary' => 'Shell Script Test', - 'function' => 'doShellTest', - 'shortcut' => 'st', - 'options' => array(), - 'doc' => ' [[relation] version] -Tests if a package is installed in the system. Will exit(1) if it is not. - The version comparison operator. One of: - <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne - The version to compare with -'), - 'info' => array( - 'summary' => 'Display information about a package', - 'function' => 'doInfo', - 'shortcut' => 'in', - 'options' => array(), - 'doc' => ' -Displays information about a package. The package argument may be a -local package file, an URL to a package file, or the name of an -installed package.' - ) - ); - - /** - * PEAR_Command_Registry constructor. - * - * @access public - */ - function PEAR_Command_Registry(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function _sortinfo($a, $b) - { - $apackage = isset($a['package']) ? $a['package'] : $a['name']; - $bpackage = isset($b['package']) ? $b['package'] : $b['name']; - return strcmp($apackage, $bpackage); - } - - function doList($command, $options, $params) - { - $reg = &$this->config->getRegistry(); - $channelinfo = isset($options['channelinfo']); - if (isset($options['allchannels']) && !$channelinfo) { - return $this->doListAll($command, array(), $params); - } - - if (isset($options['allchannels']) && $channelinfo) { - // allchannels with $channelinfo - unset($options['allchannels']); - $channels = $reg->getChannels(); - $errors = array(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - foreach ($channels as $channel) { - $options['channel'] = $channel->getName(); - $ret = $this->doList($command, $options, $params); - - if (PEAR::isError($ret)) { - $errors[] = $ret; - } - } - - PEAR::staticPopErrorHandling(); - if (count($errors)) { - // for now, only give first error - return PEAR::raiseError($errors[0]); - } - - return true; - } - - if (count($params) === 1) { - return $this->doFileList($command, $options, $params); - } - - if (isset($options['channel'])) { - if (!$reg->channelExists($options['channel'])) { - return $this->raiseError('Channel "' . $options['channel'] .'" does not exist'); - } - - $channel = $reg->channelName($options['channel']); - } else { - $channel = $this->config->get('default_channel'); - } - - $installed = $reg->packageInfo(null, null, $channel); - usort($installed, array(&$this, '_sortinfo')); - - $data = array( - 'caption' => 'Installed packages, channel ' . - $channel . ':', - 'border' => true, - 'headline' => array('Package', 'Version', 'State'), - 'channel' => $channel, - ); - if ($channelinfo) { - $data['headline'] = array('Channel', 'Package', 'Version', 'State'); - } - - if (count($installed) && !isset($data['data'])) { - $data['data'] = array(); - } - - foreach ($installed as $package) { - $pobj = $reg->getPackage(isset($package['package']) ? - $package['package'] : $package['name'], $channel); - if ($channelinfo) { - $packageinfo = array($pobj->getChannel(), $pobj->getPackage(), $pobj->getVersion(), - $pobj->getState() ? $pobj->getState() : null); - } else { - $packageinfo = array($pobj->getPackage(), $pobj->getVersion(), - $pobj->getState() ? $pobj->getState() : null); - } - $data['data'][] = $packageinfo; - } - - if (count($installed) === 0) { - if (!$channelinfo) { - $data = '(no packages installed from channel ' . $channel . ')'; - } else { - $data = array( - 'caption' => 'Installed packages, channel ' . - $channel . ':', - 'border' => true, - 'channel' => $channel, - 'data' => array(array('(no packages installed)')), - ); - } - } - - $this->ui->outputData($data, $command); - return true; - } - - function doListAll($command, $options, $params) - { - // This duplicate code is deprecated over - // list --channelinfo, which gives identical - // output for list and list --allchannels. - $reg = &$this->config->getRegistry(); - $installed = $reg->packageInfo(null, null, null); - foreach ($installed as $channel => $packages) { - usort($packages, array($this, '_sortinfo')); - $data = array( - 'caption' => 'Installed packages, channel ' . $channel . ':', - 'border' => true, - 'headline' => array('Package', 'Version', 'State'), - 'channel' => $channel - ); - - foreach ($packages as $package) { - $p = isset($package['package']) ? $package['package'] : $package['name']; - $pobj = $reg->getPackage($p, $channel); - $data['data'][] = array($pobj->getPackage(), $pobj->getVersion(), - $pobj->getState() ? $pobj->getState() : null); - } - - // Adds a blank line after each section - $data['data'][] = array(); - - if (count($packages) === 0) { - $data = array( - 'caption' => 'Installed packages, channel ' . $channel . ':', - 'border' => true, - 'data' => array(array('(no packages installed)'), array()), - 'channel' => $channel - ); - } - $this->ui->outputData($data, $command); - } - return true; - } - - function doFileList($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError('list-files expects 1 parameter'); - } - - $reg = &$this->config->getRegistry(); - $fp = false; - if (!is_dir($params[0]) && (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))) { - if ($fp) { - fclose($fp); - } - - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - - $pkg = &new PEAR_PackageFile($this->config, $this->_debug); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $info = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); - PEAR::staticPopErrorHandling(); - $headings = array('Package File', 'Install Path'); - $installed = false; - } else { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($parsed)) { - return $this->raiseError($parsed); - } - - $info = &$reg->getPackage($parsed['package'], $parsed['channel']); - $headings = array('Type', 'Install Path'); - $installed = true; - } - - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - if ($info === null) { - return $this->raiseError("`$params[0]' not installed"); - } - - $list = ($info->getPackagexmlVersion() == '1.0' || $installed) ? - $info->getFilelist() : $info->getContents(); - if ($installed) { - $caption = 'Installed Files For ' . $params[0]; - } else { - $caption = 'Contents of ' . basename($params[0]); - } - - $data = array( - 'caption' => $caption, - 'border' => true, - 'headline' => $headings); - if ($info->getPackagexmlVersion() == '1.0' || $installed) { - foreach ($list as $file => $att) { - if ($installed) { - if (empty($att['installed_as'])) { - continue; - } - $data['data'][] = array($att['role'], $att['installed_as']); - } else { - if (isset($att['baseinstalldir']) && !in_array($att['role'], - array('test', 'data', 'doc'))) { - $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR . - $file; - } else { - $dest = $file; - } - switch ($att['role']) { - case 'test': - case 'data': - case 'doc': - $role = $att['role']; - if ($role == 'test') { - $role .= 's'; - } - $dest = $this->config->get($role . '_dir') . DIRECTORY_SEPARATOR . - $info->getPackage() . DIRECTORY_SEPARATOR . $dest; - break; - case 'php': - default: - $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR . - $dest; - } - $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; - $dest = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), - array(DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR), - $dest); - $file = preg_replace('!/+!', '/', $file); - $data['data'][] = array($file, $dest); - } - } - } else { // package.xml 2.0, not installed - if (!isset($list['dir']['file'][0])) { - $list['dir']['file'] = array($list['dir']['file']); - } - - foreach ($list['dir']['file'] as $att) { - $att = $att['attribs']; - $file = $att['name']; - $role = &PEAR_Installer_Role::factory($info, $att['role'], $this->config); - $role->setup($this, $info, $att, $file); - if (!$role->isInstallable()) { - $dest = '(not installable)'; - } else { - $dest = $role->processInstallation($info, $att, $file, ''); - if (PEAR::isError($dest)) { - $dest = '(Unknown role "' . $att['role'] . ')'; - } else { - list(,, $dest) = $dest; - } - } - $data['data'][] = array($file, $dest); - } - } - - $this->ui->outputData($data, $command); - return true; - } - - function doShellTest($command, $options, $params) - { - if (count($params) < 1) { - return PEAR::raiseError('ERROR, usage: pear shell-test packagename [[relation] version]'); - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $reg = &$this->config->getRegistry(); - $info = $reg->parsePackageName($params[0], $this->config->get('default_channel')); - if (PEAR::isError($info)) { - exit(1); // invalid package name - } - - $package = $info['package']; - $channel = $info['channel']; - // "pear shell-test Foo" - if (!$reg->packageExists($package, $channel)) { - if ($channel == 'pecl.php.net') { - if ($reg->packageExists($package, 'pear.php.net')) { - $channel = 'pear.php.net'; // magically change channels for extensions - } - } - } - - if (count($params) === 1) { - if (!$reg->packageExists($package, $channel)) { - exit(1); - } - // "pear shell-test Foo 1.0" - } elseif (count($params) === 2) { - $v = $reg->packageInfo($package, 'version', $channel); - if (!$v || !version_compare("$v", "{$params[1]}", "ge")) { - exit(1); - } - // "pear shell-test Foo ge 1.0" - } elseif (count($params) === 3) { - $v = $reg->packageInfo($package, 'version', $channel); - if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) { - exit(1); - } - } else { - PEAR::staticPopErrorHandling(); - $this->raiseError("$command: expects 1 to 3 parameters"); - exit(1); - } - } - - function doInfo($command, $options, $params) - { - if (count($params) !== 1) { - return $this->raiseError('pear info expects 1 parameter'); - } - - $info = $fp = false; - $reg = &$this->config->getRegistry(); - if (is_file($params[0]) && !is_dir($params[0]) && - (file_exists($params[0]) || $fp = @fopen($params[0], 'r')) - ) { - if ($fp) { - fclose($fp); - } - - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - - $pkg = &new PEAR_PackageFile($this->config, $this->_debug); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $obj = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($obj)) { - $uinfo = $obj->getUserInfo(); - if (is_array($uinfo)) { - foreach ($uinfo as $message) { - if (is_array($message)) { - $message = $message['message']; - } - $this->ui->outputData($message); - } - } - - return $this->raiseError($obj); - } - - if ($obj->getPackagexmlVersion() != '1.0') { - return $this->_doInfo2($command, $options, $params, $obj, false); - } - - $info = $obj->toArray(); - } else { - $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); - if (PEAR::isError($parsed)) { - return $this->raiseError($parsed); - } - - $package = $parsed['package']; - $channel = $parsed['channel']; - $info = $reg->packageInfo($package, null, $channel); - if (isset($info['old'])) { - $obj = $reg->getPackage($package, $channel); - return $this->_doInfo2($command, $options, $params, $obj, true); - } - } - - if (PEAR::isError($info)) { - return $info; - } - - if (empty($info)) { - $this->raiseError("No information found for `$params[0]'"); - return; - } - - unset($info['filelist']); - unset($info['dirtree']); - unset($info['changelog']); - if (isset($info['xsdversion'])) { - $info['package.xml version'] = $info['xsdversion']; - unset($info['xsdversion']); - } - - if (isset($info['packagerversion'])) { - $info['packaged with PEAR version'] = $info['packagerversion']; - unset($info['packagerversion']); - } - - $keys = array_keys($info); - $longtext = array('description', 'summary'); - foreach ($keys as $key) { - if (is_array($info[$key])) { - switch ($key) { - case 'maintainers': { - $i = 0; - $mstr = ''; - foreach ($info[$key] as $m) { - if ($i++ > 0) { - $mstr .= "\n"; - } - $mstr .= $m['name'] . " <"; - if (isset($m['email'])) { - $mstr .= $m['email']; - } else { - $mstr .= $m['handle'] . '@php.net'; - } - $mstr .= "> ($m[role])"; - } - $info[$key] = $mstr; - break; - } - case 'release_deps': { - $i = 0; - $dstr = ''; - foreach ($info[$key] as $d) { - if (isset($this->_deps_rel_trans[$d['rel']])) { - $rel = $this->_deps_rel_trans[$d['rel']]; - } else { - $rel = $d['rel']; - } - if (isset($this->_deps_type_trans[$d['type']])) { - $type = ucfirst($this->_deps_type_trans[$d['type']]); - } else { - $type = $d['type']; - } - if (isset($d['name'])) { - $name = $d['name'] . ' '; - } else { - $name = ''; - } - if (isset($d['version'])) { - $version = $d['version'] . ' '; - } else { - $version = ''; - } - if (isset($d['optional']) && $d['optional'] == 'yes') { - $optional = ' (optional)'; - } else { - $optional = ''; - } - $dstr .= "$type $name$rel $version$optional\n"; - } - $info[$key] = $dstr; - break; - } - case 'provides' : { - $debug = $this->config->get('verbose'); - if ($debug < 2) { - $pstr = 'Classes: '; - } else { - $pstr = ''; - } - $i = 0; - foreach ($info[$key] as $p) { - if ($debug < 2 && $p['type'] != "class") { - continue; - } - // Only print classes when verbosity mode is < 2 - if ($debug < 2) { - if ($i++ > 0) { - $pstr .= ", "; - } - $pstr .= $p['name']; - } else { - if ($i++ > 0) { - $pstr .= "\n"; - } - $pstr .= ucfirst($p['type']) . " " . $p['name']; - if (isset($p['explicit']) && $p['explicit'] == 1) { - $pstr .= " (explicit)"; - } - } - } - $info[$key] = $pstr; - break; - } - case 'configure_options' : { - foreach ($info[$key] as $i => $p) { - $info[$key][$i] = array_map(null, array_keys($p), array_values($p)); - $info[$key][$i] = array_map(create_function('$a', - 'return join(" = ",$a);'), $info[$key][$i]); - $info[$key][$i] = implode(', ', $info[$key][$i]); - } - $info[$key] = implode("\n", $info[$key]); - break; - } - default: { - $info[$key] = implode(", ", $info[$key]); - break; - } - } - } - - if ($key == '_lastmodified') { - $hdate = date('Y-m-d', $info[$key]); - unset($info[$key]); - $info['Last Modified'] = $hdate; - } elseif ($key == '_lastversion') { - $info['Previous Installed Version'] = $info[$key] ? $info[$key] : '- None -'; - unset($info[$key]); - } else { - $info[$key] = trim($info[$key]); - if (in_array($key, $longtext)) { - $info[$key] = preg_replace('/ +/', ' ', $info[$key]); - } - } - } - - $caption = 'About ' . $info['package'] . '-' . $info['version']; - $data = array( - 'caption' => $caption, - 'border' => true); - foreach ($info as $key => $value) { - $key = ucwords(trim(str_replace('_', ' ', $key))); - $data['data'][] = array($key, $value); - } - $data['raw'] = $info; - - $this->ui->outputData($data, 'package-info'); - } - - /** - * @access private - */ - function _doInfo2($command, $options, $params, &$obj, $installed) - { - $reg = &$this->config->getRegistry(); - $caption = 'About ' . $obj->getChannel() . '/' .$obj->getPackage() . '-' . - $obj->getVersion(); - $data = array( - 'caption' => $caption, - 'border' => true); - switch ($obj->getPackageType()) { - case 'php' : - $release = 'PEAR-style PHP-based Package'; - break; - case 'extsrc' : - $release = 'PECL-style PHP extension (source code)'; - break; - case 'zendextsrc' : - $release = 'PECL-style Zend extension (source code)'; - break; - case 'extbin' : - $release = 'PECL-style PHP extension (binary)'; - break; - case 'zendextbin' : - $release = 'PECL-style Zend extension (binary)'; - break; - case 'bundle' : - $release = 'Package bundle (collection of packages)'; - break; - } - $extends = $obj->getExtends(); - $extends = $extends ? - $obj->getPackage() . ' (extends ' . $extends . ')' : $obj->getPackage(); - if ($src = $obj->getSourcePackage()) { - $extends .= ' (source package ' . $src['channel'] . '/' . $src['package'] . ')'; - } - - $info = array( - 'Release Type' => $release, - 'Name' => $extends, - 'Channel' => $obj->getChannel(), - 'Summary' => preg_replace('/ +/', ' ', $obj->getSummary()), - 'Description' => preg_replace('/ +/', ' ', $obj->getDescription()), - ); - $info['Maintainers'] = ''; - foreach (array('lead', 'developer', 'contributor', 'helper') as $role) { - $leads = $obj->{"get{$role}s"}(); - if (!$leads) { - continue; - } - - if (isset($leads['active'])) { - $leads = array($leads); - } - - foreach ($leads as $lead) { - if (!empty($info['Maintainers'])) { - $info['Maintainers'] .= "\n"; - } - - $active = $lead['active'] == 'no' ? ', inactive' : ''; - $info['Maintainers'] .= $lead['name'] . ' <'; - $info['Maintainers'] .= $lead['email'] . "> ($role$active)"; - } - } - - $info['Release Date'] = $obj->getDate(); - if ($time = $obj->getTime()) { - $info['Release Date'] .= ' ' . $time; - } - - $info['Release Version'] = $obj->getVersion() . ' (' . $obj->getState() . ')'; - $info['API Version'] = $obj->getVersion('api') . ' (' . $obj->getState('api') . ')'; - $info['License'] = $obj->getLicense(); - $uri = $obj->getLicenseLocation(); - if ($uri) { - if (isset($uri['uri'])) { - $info['License'] .= ' (' . $uri['uri'] . ')'; - } else { - $extra = $obj->getInstalledLocation($info['filesource']); - if ($extra) { - $info['License'] .= ' (' . $uri['filesource'] . ')'; - } - } - } - - $info['Release Notes'] = $obj->getNotes(); - if ($compat = $obj->getCompatible()) { - if (!isset($compat[0])) { - $compat = array($compat); - } - - $info['Compatible with'] = ''; - foreach ($compat as $package) { - $info['Compatible with'] .= $package['channel'] . '/' . $package['name'] . - "\nVersions >= " . $package['min'] . ', <= ' . $package['max']; - if (isset($package['exclude'])) { - if (is_array($package['exclude'])) { - $package['exclude'] = implode(', ', $package['exclude']); - } - - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - $info['Not Compatible with'] .= $package['channel'] . '/' . - $package['name'] . "\nVersions " . $package['exclude']; - } - } - } - - $usesrole = $obj->getUsesrole(); - if ($usesrole) { - if (!isset($usesrole[0])) { - $usesrole = array($usesrole); - } - - foreach ($usesrole as $roledata) { - if (isset($info['Uses Custom Roles'])) { - $info['Uses Custom Roles'] .= "\n"; - } else { - $info['Uses Custom Roles'] = ''; - } - - if (isset($roledata['package'])) { - $rolepackage = $reg->parsedPackageNameToString($roledata, true); - } else { - $rolepackage = $roledata['uri']; - } - $info['Uses Custom Roles'] .= $roledata['role'] . ' (' . $rolepackage . ')'; - } - } - - $usestask = $obj->getUsestask(); - if ($usestask) { - if (!isset($usestask[0])) { - $usestask = array($usestask); - } - - foreach ($usestask as $taskdata) { - if (isset($info['Uses Custom Tasks'])) { - $info['Uses Custom Tasks'] .= "\n"; - } else { - $info['Uses Custom Tasks'] = ''; - } - - if (isset($taskdata['package'])) { - $taskpackage = $reg->parsedPackageNameToString($taskdata, true); - } else { - $taskpackage = $taskdata['uri']; - } - $info['Uses Custom Tasks'] .= $taskdata['task'] . ' (' . $taskpackage . ')'; - } - } - - $deps = $obj->getDependencies(); - $info['Required Dependencies'] = 'PHP version ' . $deps['required']['php']['min']; - if (isset($deps['required']['php']['max'])) { - $info['Required Dependencies'] .= '-' . $deps['required']['php']['max'] . "\n"; - } else { - $info['Required Dependencies'] .= "\n"; - } - - if (isset($deps['required']['php']['exclude'])) { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - - if (is_array($deps['required']['php']['exclude'])) { - $deps['required']['php']['exclude'] = - implode(', ', $deps['required']['php']['exclude']); - } - $info['Not Compatible with'] .= "PHP versions\n " . - $deps['required']['php']['exclude']; - } - - $info['Required Dependencies'] .= 'PEAR installer version'; - if (isset($deps['required']['pearinstaller']['max'])) { - $info['Required Dependencies'] .= 's ' . - $deps['required']['pearinstaller']['min'] . '-' . - $deps['required']['pearinstaller']['max']; - } else { - $info['Required Dependencies'] .= ' ' . - $deps['required']['pearinstaller']['min'] . ' or newer'; - } - - if (isset($deps['required']['pearinstaller']['exclude'])) { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - - if (is_array($deps['required']['pearinstaller']['exclude'])) { - $deps['required']['pearinstaller']['exclude'] = - implode(', ', $deps['required']['pearinstaller']['exclude']); - } - $info['Not Compatible with'] .= "PEAR installer\n Versions " . - $deps['required']['pearinstaller']['exclude']; - } - - foreach (array('Package', 'Extension') as $type) { - $index = strtolower($type); - if (isset($deps['required'][$index])) { - if (isset($deps['required'][$index]['name'])) { - $deps['required'][$index] = array($deps['required'][$index]); - } - - foreach ($deps['required'][$index] as $package) { - if (isset($package['conflicts'])) { - $infoindex = 'Not Compatible with'; - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - } else { - $infoindex = 'Required Dependencies'; - $info[$infoindex] .= "\n"; - } - - if ($index == 'extension') { - $name = $package['name']; - } else { - if (isset($package['channel'])) { - $name = $package['channel'] . '/' . $package['name']; - } else { - $name = '__uri/' . $package['name'] . ' (static URI)'; - } - } - - $info[$infoindex] .= "$type $name"; - if (isset($package['uri'])) { - $info[$infoindex] .= "\n Download URI: $package[uri]"; - continue; - } - - if (isset($package['max']) && isset($package['min'])) { - $info[$infoindex] .= " \n Versions " . - $package['min'] . '-' . $package['max']; - } elseif (isset($package['min'])) { - $info[$infoindex] .= " \n Version " . - $package['min'] . ' or newer'; - } elseif (isset($package['max'])) { - $info[$infoindex] .= " \n Version " . - $package['max'] . ' or older'; - } - - if (isset($package['recommended'])) { - $info[$infoindex] .= "\n Recommended version: $package[recommended]"; - } - - if (isset($package['exclude'])) { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - - if (is_array($package['exclude'])) { - $package['exclude'] = implode(', ', $package['exclude']); - } - - $package['package'] = $package['name']; // for parsedPackageNameToString - if (isset($package['conflicts'])) { - $info['Not Compatible with'] .= '=> except '; - } - $info['Not Compatible with'] .= 'Package ' . - $reg->parsedPackageNameToString($package, true); - $info['Not Compatible with'] .= "\n Versions " . $package['exclude']; - } - } - } - } - - if (isset($deps['required']['os'])) { - if (isset($deps['required']['os']['name'])) { - $dep['required']['os']['name'] = array($dep['required']['os']['name']); - } - - foreach ($dep['required']['os'] as $os) { - if (isset($os['conflicts']) && $os['conflicts'] == 'yes') { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - $info['Not Compatible with'] .= "$os[name] Operating System"; - } else { - $info['Required Dependencies'] .= "\n"; - $info['Required Dependencies'] .= "$os[name] Operating System"; - } - } - } - - if (isset($deps['required']['arch'])) { - if (isset($deps['required']['arch']['pattern'])) { - $dep['required']['arch']['pattern'] = array($dep['required']['os']['pattern']); - } - - foreach ($dep['required']['arch'] as $os) { - if (isset($os['conflicts']) && $os['conflicts'] == 'yes') { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - $info['Not Compatible with'] .= "OS/Arch matching pattern '/$os[pattern]/'"; - } else { - $info['Required Dependencies'] .= "\n"; - $info['Required Dependencies'] .= "OS/Arch matching pattern '/$os[pattern]/'"; - } - } - } - - if (isset($deps['optional'])) { - foreach (array('Package', 'Extension') as $type) { - $index = strtolower($type); - if (isset($deps['optional'][$index])) { - if (isset($deps['optional'][$index]['name'])) { - $deps['optional'][$index] = array($deps['optional'][$index]); - } - - foreach ($deps['optional'][$index] as $package) { - if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { - $infoindex = 'Not Compatible with'; - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - } else { - $infoindex = 'Optional Dependencies'; - if (!isset($info['Optional Dependencies'])) { - $info['Optional Dependencies'] = ''; - } else { - $info['Optional Dependencies'] .= "\n"; - } - } - - if ($index == 'extension') { - $name = $package['name']; - } else { - if (isset($package['channel'])) { - $name = $package['channel'] . '/' . $package['name']; - } else { - $name = '__uri/' . $package['name'] . ' (static URI)'; - } - } - - $info[$infoindex] .= "$type $name"; - if (isset($package['uri'])) { - $info[$infoindex] .= "\n Download URI: $package[uri]"; - continue; - } - - if ($infoindex == 'Not Compatible with') { - // conflicts is only used to say that all versions conflict - continue; - } - - if (isset($package['max']) && isset($package['min'])) { - $info[$infoindex] .= " \n Versions " . - $package['min'] . '-' . $package['max']; - } elseif (isset($package['min'])) { - $info[$infoindex] .= " \n Version " . - $package['min'] . ' or newer'; - } elseif (isset($package['max'])) { - $info[$infoindex] .= " \n Version " . - $package['min'] . ' or older'; - } - - if (isset($package['recommended'])) { - $info[$infoindex] .= "\n Recommended version: $package[recommended]"; - } - - if (isset($package['exclude'])) { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info['Not Compatible with'] .= "\n"; - } - - if (is_array($package['exclude'])) { - $package['exclude'] = implode(', ', $package['exclude']); - } - - $info['Not Compatible with'] .= "Package $package\n Versions " . - $package['exclude']; - } - } - } - } - } - - if (isset($deps['group'])) { - if (!isset($deps['group'][0])) { - $deps['group'] = array($deps['group']); - } - - foreach ($deps['group'] as $group) { - $info['Dependency Group ' . $group['attribs']['name']] = $group['attribs']['hint']; - $groupindex = $group['attribs']['name'] . ' Contents'; - $info[$groupindex] = ''; - foreach (array('Package', 'Extension') as $type) { - $index = strtolower($type); - if (isset($group[$index])) { - if (isset($group[$index]['name'])) { - $group[$index] = array($group[$index]); - } - - foreach ($group[$index] as $package) { - if (!empty($info[$groupindex])) { - $info[$groupindex] .= "\n"; - } - - if ($index == 'extension') { - $name = $package['name']; - } else { - if (isset($package['channel'])) { - $name = $package['channel'] . '/' . $package['name']; - } else { - $name = '__uri/' . $package['name'] . ' (static URI)'; - } - } - - if (isset($package['uri'])) { - if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { - $info[$groupindex] .= "Not Compatible with $type $name"; - } else { - $info[$groupindex] .= "$type $name"; - } - - $info[$groupindex] .= "\n Download URI: $package[uri]"; - continue; - } - - if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { - $info[$groupindex] .= "Not Compatible with $type $name"; - continue; - } - - $info[$groupindex] .= "$type $name"; - if (isset($package['max']) && isset($package['min'])) { - $info[$groupindex] .= " \n Versions " . - $package['min'] . '-' . $package['max']; - } elseif (isset($package['min'])) { - $info[$groupindex] .= " \n Version " . - $package['min'] . ' or newer'; - } elseif (isset($package['max'])) { - $info[$groupindex] .= " \n Version " . - $package['min'] . ' or older'; - } - - if (isset($package['recommended'])) { - $info[$groupindex] .= "\n Recommended version: $package[recommended]"; - } - - if (isset($package['exclude'])) { - if (!isset($info['Not Compatible with'])) { - $info['Not Compatible with'] = ''; - } else { - $info[$groupindex] .= "Not Compatible with\n"; - } - - if (is_array($package['exclude'])) { - $package['exclude'] = implode(', ', $package['exclude']); - } - $info[$groupindex] .= " Package $package\n Versions " . - $package['exclude']; - } - } - } - } - } - } - - if ($obj->getPackageType() == 'bundle') { - $info['Bundled Packages'] = ''; - foreach ($obj->getBundledPackages() as $package) { - if (!empty($info['Bundled Packages'])) { - $info['Bundled Packages'] .= "\n"; - } - - if (isset($package['uri'])) { - $info['Bundled Packages'] .= '__uri/' . $package['name']; - $info['Bundled Packages'] .= "\n (URI: $package[uri]"; - } else { - $info['Bundled Packages'] .= $package['channel'] . '/' . $package['name']; - } - } - } - - $info['package.xml version'] = '2.0'; - if ($installed) { - if ($obj->getLastModified()) { - $info['Last Modified'] = date('Y-m-d H:i', $obj->getLastModified()); - } - - $v = $obj->getLastInstalledVersion(); - $info['Previous Installed Version'] = $v ? $v : '- None -'; - } - - foreach ($info as $key => $value) { - $data['data'][] = array($key, $value); - } - - $data['raw'] = $obj->getArray(); // no validation needed - $this->ui->outputData($data, 'package-info'); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Registry.xml b/3rdparty/PEAR/Command/Registry.xml deleted file mode 100644 index 9f4e214967..0000000000 --- a/3rdparty/PEAR/Command/Registry.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - List Installed Packages In The Default Channel - doList - l - - - c - list installed packages from this channel - CHAN - - - a - list installed packages from all channels - - - i - output fully channel-aware data, even on failure - - - <package> -If invoked without parameters, this command lists the PEAR packages -installed in your php_dir ({config php_dir}). With a parameter, it -lists the files in a package. - - - - List Files In Installed Package - doFileList - fl - - <package> -List the files in an installed package. - - - - Shell Script Test - doShellTest - st - - <package> [[relation] version] -Tests if a package is installed in the system. Will exit(1) if it is not. - <relation> The version comparison operator. One of: - <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne - <version> The version to compare with - - - - Display information about a package - doInfo - in - - <package> -Displays information about a package. The package argument may be a -local package file, an URL to a package file, or the name of an -installed package. - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Remote.php b/3rdparty/PEAR/Command/Remote.php deleted file mode 100644 index 74478d83c7..0000000000 --- a/3rdparty/PEAR/Command/Remote.php +++ /dev/null @@ -1,810 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Remote.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; -require_once 'PEAR/REST.php'; - -/** - * PEAR commands for remote server querying - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Command_Remote extends PEAR_Command_Common -{ - var $commands = array( - 'remote-info' => array( - 'summary' => 'Information About Remote Packages', - 'function' => 'doRemoteInfo', - 'shortcut' => 'ri', - 'options' => array(), - 'doc' => ' -Get details on a package from the server.', - ), - 'list-upgrades' => array( - 'summary' => 'List Available Upgrades', - 'function' => 'doListUpgrades', - 'shortcut' => 'lu', - 'options' => array( - 'channelinfo' => array( - 'shortopt' => 'i', - 'doc' => 'output fully channel-aware data, even on failure', - ), - ), - 'doc' => '[preferred_state] -List releases on the server of packages you have installed where -a newer version is available with the same release state (stable etc.) -or the state passed as the second parameter.' - ), - 'remote-list' => array( - 'summary' => 'List Remote Packages', - 'function' => 'doRemoteList', - 'shortcut' => 'rl', - 'options' => array( - 'channel' => - array( - 'shortopt' => 'c', - 'doc' => 'specify a channel other than the default channel', - 'arg' => 'CHAN', - ) - ), - 'doc' => ' -Lists the packages available on the configured server along with the -latest stable release of each package.', - ), - 'search' => array( - 'summary' => 'Search remote package database', - 'function' => 'doSearch', - 'shortcut' => 'sp', - 'options' => array( - 'channel' => - array( - 'shortopt' => 'c', - 'doc' => 'specify a channel other than the default channel', - 'arg' => 'CHAN', - ), - 'allchannels' => array( - 'shortopt' => 'a', - 'doc' => 'search packages from all known channels', - ), - 'channelinfo' => array( - 'shortopt' => 'i', - 'doc' => 'output fully channel-aware data, even on failure', - ), - ), - 'doc' => '[packagename] [packageinfo] -Lists all packages which match the search parameters. The first -parameter is a fragment of a packagename. The default channel -will be used unless explicitly overridden. The second parameter -will be used to match any portion of the summary/description', - ), - 'list-all' => array( - 'summary' => 'List All Packages', - 'function' => 'doListAll', - 'shortcut' => 'la', - 'options' => array( - 'channel' => - array( - 'shortopt' => 'c', - 'doc' => 'specify a channel other than the default channel', - 'arg' => 'CHAN', - ), - 'channelinfo' => array( - 'shortopt' => 'i', - 'doc' => 'output fully channel-aware data, even on failure', - ), - ), - 'doc' => ' -Lists the packages available on the configured server along with the -latest stable release of each package.', - ), - 'download' => array( - 'summary' => 'Download Package', - 'function' => 'doDownload', - 'shortcut' => 'd', - 'options' => array( - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'download an uncompressed (.tar) file', - ), - ), - 'doc' => '... -Download package tarballs. The files will be named as suggested by the -server, for example if you download the DB package and the latest stable -version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.', - ), - 'clear-cache' => array( - 'summary' => 'Clear Web Services Cache', - 'function' => 'doClearCache', - 'shortcut' => 'cc', - 'options' => array(), - 'doc' => ' -Clear the REST cache. See also the cache_ttl configuration -parameter. -', - ), - ); - - /** - * PEAR_Command_Remote constructor. - * - * @access public - */ - function PEAR_Command_Remote(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function _checkChannelForStatus($channel, $chan) - { - if (PEAR::isError($chan)) { - $this->raiseError($chan); - } - if (!is_a($chan, 'PEAR_ChannelFile')) { - return $this->raiseError('Internal corruption error: invalid channel "' . - $channel . '"'); - } - $rest = new PEAR_REST($this->config); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $mirror = $this->config->get('preferred_mirror', null, - $channel); - $a = $rest->downloadHttp('http://' . $channel . - '/channel.xml', $chan->lastModified()); - PEAR::staticPopErrorHandling(); - if (!PEAR::isError($a) && $a) { - $this->ui->outputData('WARNING: channel "' . $channel . '" has ' . - 'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $channel . - '" to update'); - } - } - - function doRemoteInfo($command, $options, $params) - { - if (sizeof($params) != 1) { - return $this->raiseError("$command expects one param: the remote package name"); - } - $savechannel = $channel = $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - $package = $params[0]; - $parsed = $reg->parsePackageName($package, $channel); - if (PEAR::isError($parsed)) { - return $this->raiseError('Invalid package name "' . $package . '"'); - } - - $channel = $parsed['channel']; - $this->config->set('default_channel', $channel); - $chan = $reg->getChannel($channel); - if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { - return $e; - } - - $mirror = $this->config->get('preferred_mirror'); - if ($chan->supportsREST($mirror) && $base = $chan->getBaseURL('REST1.0', $mirror)) { - $rest = &$this->config->getREST('1.0', array()); - $info = $rest->packageInfo($base, $parsed['package'], $channel); - } - - if (!isset($info)) { - return $this->raiseError('No supported protocol was found'); - } - - if (PEAR::isError($info)) { - $this->config->set('default_channel', $savechannel); - return $this->raiseError($info); - } - - if (!isset($info['name'])) { - return $this->raiseError('No remote package "' . $package . '" was found'); - } - - $installed = $reg->packageInfo($info['name'], null, $channel); - $info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; - if (is_array($info['installed'])) { - $info['installed'] = $info['installed']['release']; - } - - $this->ui->outputData($info, $command); - $this->config->set('default_channel', $savechannel); - - return true; - } - - function doRemoteList($command, $options, $params) - { - $savechannel = $channel = $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - if (isset($options['channel'])) { - $channel = $options['channel']; - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - $this->config->set('default_channel', $channel); - } - - $chan = $reg->getChannel($channel); - if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { - return $e; - } - - $list_options = false; - if ($this->config->get('preferred_state') == 'stable') { - $list_options = true; - } - - $available = array(); - if ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror')) - ) { - // use faster list-all if available - $rest = &$this->config->getREST('1.1', array()); - $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName()); - } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { - $rest = &$this->config->getREST('1.0', array()); - $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName()); - } - - if (PEAR::isError($available)) { - $this->config->set('default_channel', $savechannel); - return $this->raiseError($available); - } - - $i = $j = 0; - $data = array( - 'caption' => 'Channel ' . $channel . ' Available packages:', - 'border' => true, - 'headline' => array('Package', 'Version'), - 'channel' => $channel - ); - - if (count($available) == 0) { - $data = '(no packages available yet)'; - } else { - foreach ($available as $name => $info) { - $version = (isset($info['stable']) && $info['stable']) ? $info['stable'] : '-n/a-'; - $data['data'][] = array($name, $version); - } - } - $this->ui->outputData($data, $command); - $this->config->set('default_channel', $savechannel); - return true; - } - - function doListAll($command, $options, $params) - { - $savechannel = $channel = $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - if (isset($options['channel'])) { - $channel = $options['channel']; - if (!$reg->channelExists($channel)) { - return $this->raiseError("Channel \"$channel\" does not exist"); - } - - $this->config->set('default_channel', $channel); - } - - $list_options = false; - if ($this->config->get('preferred_state') == 'stable') { - $list_options = true; - } - - $chan = $reg->getChannel($channel); - if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { - return $e; - } - - if ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) { - // use faster list-all if available - $rest = &$this->config->getREST('1.1', array()); - $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName()); - } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { - $rest = &$this->config->getREST('1.0', array()); - $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName()); - } - - if (PEAR::isError($available)) { - $this->config->set('default_channel', $savechannel); - return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $available->getMessage() . '")'); - } - - $data = array( - 'caption' => 'All packages [Channel ' . $channel . ']:', - 'border' => true, - 'headline' => array('Package', 'Latest', 'Local'), - 'channel' => $channel, - ); - - if (isset($options['channelinfo'])) { - // add full channelinfo - $data['caption'] = 'Channel ' . $channel . ' All packages:'; - $data['headline'] = array('Channel', 'Package', 'Latest', 'Local', - 'Description', 'Dependencies'); - } - $local_pkgs = $reg->listPackages($channel); - - foreach ($available as $name => $info) { - $installed = $reg->packageInfo($name, null, $channel); - if (is_array($installed['version'])) { - $installed['version'] = $installed['version']['release']; - } - $desc = $info['summary']; - if (isset($params[$name])) { - $desc .= "\n\n".$info['description']; - } - if (isset($options['mode'])) - { - if ($options['mode'] == 'installed' && !isset($installed['version'])) { - continue; - } - if ($options['mode'] == 'notinstalled' && isset($installed['version'])) { - continue; - } - if ($options['mode'] == 'upgrades' - && (!isset($installed['version']) || version_compare($installed['version'], - $info['stable'], '>='))) { - continue; - } - } - $pos = array_search(strtolower($name), $local_pkgs); - if ($pos !== false) { - unset($local_pkgs[$pos]); - } - - if (isset($info['stable']) && !$info['stable']) { - $info['stable'] = null; - } - - if (isset($options['channelinfo'])) { - // add full channelinfo - if ($info['stable'] === $info['unstable']) { - $state = $info['state']; - } else { - $state = 'stable'; - } - $latest = $info['stable'].' ('.$state.')'; - $local = ''; - if (isset($installed['version'])) { - $inst_state = $reg->packageInfo($name, 'release_state', $channel); - $local = $installed['version'].' ('.$inst_state.')'; - } - - $packageinfo = array( - $channel, - $name, - $latest, - $local, - isset($desc) ? $desc : null, - isset($info['deps']) ? $info['deps'] : null, - ); - } else { - $packageinfo = array( - $reg->channelAlias($channel) . '/' . $name, - isset($info['stable']) ? $info['stable'] : null, - isset($installed['version']) ? $installed['version'] : null, - isset($desc) ? $desc : null, - isset($info['deps']) ? $info['deps'] : null, - ); - } - $data['data'][$info['category']][] = $packageinfo; - } - - if (isset($options['mode']) && in_array($options['mode'], array('notinstalled', 'upgrades'))) { - $this->config->set('default_channel', $savechannel); - $this->ui->outputData($data, $command); - return true; - } - - foreach ($local_pkgs as $name) { - $info = &$reg->getPackage($name, $channel); - $data['data']['Local'][] = array( - $reg->channelAlias($channel) . '/' . $info->getPackage(), - '', - $info->getVersion(), - $info->getSummary(), - $info->getDeps() - ); - } - - $this->config->set('default_channel', $savechannel); - $this->ui->outputData($data, $command); - return true; - } - - function doSearch($command, $options, $params) - { - if ((!isset($params[0]) || empty($params[0])) - && (!isset($params[1]) || empty($params[1]))) - { - return $this->raiseError('no valid search string supplied'); - } - - $channelinfo = isset($options['channelinfo']); - $reg = &$this->config->getRegistry(); - if (isset($options['allchannels'])) { - // search all channels - unset($options['allchannels']); - $channels = $reg->getChannels(); - $errors = array(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - foreach ($channels as $channel) { - if ($channel->getName() != '__uri') { - $options['channel'] = $channel->getName(); - $ret = $this->doSearch($command, $options, $params); - if (PEAR::isError($ret)) { - $errors[] = $ret; - } - } - } - - PEAR::staticPopErrorHandling(); - if (count($errors) !== 0) { - // for now, only give first error - return PEAR::raiseError($errors[0]); - } - - return true; - } - - $savechannel = $channel = $this->config->get('default_channel'); - $package = strtolower($params[0]); - $summary = isset($params[1]) ? $params[1] : false; - if (isset($options['channel'])) { - $reg = &$this->config->getRegistry(); - $channel = $options['channel']; - if (!$reg->channelExists($channel)) { - return $this->raiseError('Channel "' . $channel . '" does not exist'); - } - - $this->config->set('default_channel', $channel); - } - - $chan = $reg->getChannel($channel); - if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { - return $e; - } - - if ($chan->supportsREST($this->config->get('preferred_mirror')) && - $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { - $rest = &$this->config->getREST('1.0', array()); - $available = $rest->listAll($base, false, false, $package, $summary, $chan->getName()); - } - - if (PEAR::isError($available)) { - $this->config->set('default_channel', $savechannel); - return $this->raiseError($available); - } - - if (!$available && !$channelinfo) { - // clean exit when not found, no error ! - $data = 'no packages found that match pattern "' . $package . '", for channel '.$channel.'.'; - $this->ui->outputData($data); - $this->config->set('default_channel', $channel); - return true; - } - - if ($channelinfo) { - $data = array( - 'caption' => 'Matched packages, channel ' . $channel . ':', - 'border' => true, - 'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'), - 'channel' => $channel - ); - } else { - $data = array( - 'caption' => 'Matched packages, channel ' . $channel . ':', - 'border' => true, - 'headline' => array('Package', 'Stable/(Latest)', 'Local'), - 'channel' => $channel - ); - } - - if (!$available && $channelinfo) { - unset($data['headline']); - $data['data'] = 'No packages found that match pattern "' . $package . '".'; - $available = array(); - } - - foreach ($available as $name => $info) { - $installed = $reg->packageInfo($name, null, $channel); - $desc = $info['summary']; - if (isset($params[$name])) - $desc .= "\n\n".$info['description']; - - if (!isset($info['stable']) || !$info['stable']) { - $version_remote = 'none'; - } else { - if ($info['unstable']) { - $version_remote = $info['unstable']; - } else { - $version_remote = $info['stable']; - } - $version_remote .= ' ('.$info['state'].')'; - } - $version = is_array($installed['version']) ? $installed['version']['release'] : - $installed['version']; - if ($channelinfo) { - $packageinfo = array( - $channel, - $name, - $version_remote, - $version, - $desc, - ); - } else { - $packageinfo = array( - $name, - $version_remote, - $version, - $desc, - ); - } - $data['data'][$info['category']][] = $packageinfo; - } - - $this->ui->outputData($data, $command); - $this->config->set('default_channel', $channel); - return true; - } - - function &getDownloader($options) - { - if (!class_exists('PEAR_Downloader')) { - require_once 'PEAR/Downloader.php'; - } - $a = &new PEAR_Downloader($this->ui, $options, $this->config); - return $a; - } - - function doDownload($command, $options, $params) - { - // make certain that dependencies are ignored - $options['downloadonly'] = 1; - - // eliminate error messages for preferred_state-related errors - /* TODO: Should be an option, but until now download does respect - prefered state */ - /* $options['ignorepreferred_state'] = 1; */ - // eliminate error messages for preferred_state-related errors - - $downloader = &$this->getDownloader($options); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $e = $downloader->setDownloadDir(getcwd()); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($e)) { - return $this->raiseError('Current directory is not writeable, cannot download'); - } - - $errors = array(); - $downloaded = array(); - $err = $downloader->download($params); - if (PEAR::isError($err)) { - return $err; - } - - $errors = $downloader->getErrorMsgs(); - if (count($errors)) { - foreach ($errors as $error) { - if ($error !== null) { - $this->ui->outputData($error); - } - } - - return $this->raiseError("$command failed"); - } - - $downloaded = $downloader->getDownloadedPackages(); - foreach ($downloaded as $pkg) { - $this->ui->outputData("File $pkg[file] downloaded", $command); - } - - return true; - } - - function downloadCallback($msg, $params = null) - { - if ($msg == 'done') { - $this->bytes_downloaded = $params; - } - } - - function doListUpgrades($command, $options, $params) - { - require_once 'PEAR/Common.php'; - if (isset($params[0]) && !is_array(PEAR_Common::betterStates($params[0]))) { - return $this->raiseError($params[0] . ' is not a valid state (stable/beta/alpha/devel/etc.) try "pear help list-upgrades"'); - } - - $savechannel = $channel = $this->config->get('default_channel'); - $reg = &$this->config->getRegistry(); - foreach ($reg->listChannels() as $channel) { - $inst = array_flip($reg->listPackages($channel)); - if (!count($inst)) { - continue; - } - - if ($channel == '__uri') { - continue; - } - - $this->config->set('default_channel', $channel); - $state = empty($params[0]) ? $this->config->get('preferred_state') : $params[0]; - - $caption = $channel . ' Available Upgrades'; - $chan = $reg->getChannel($channel); - if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { - return $e; - } - - $latest = array(); - $base2 = false; - $preferred_mirror = $this->config->get('preferred_mirror'); - if ($chan->supportsREST($preferred_mirror) && - ( - //($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) || - ($base = $chan->getBaseURL('REST1.0', $preferred_mirror)) - ) - - ) { - if ($base2) { - $rest = &$this->config->getREST('1.4', array()); - $base = $base2; - } else { - $rest = &$this->config->getREST('1.0', array()); - } - - if (empty($state) || $state == 'any') { - $state = false; - } else { - $caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')'; - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $latest = $rest->listLatestUpgrades($base, $state, $inst, $channel, $reg); - PEAR::staticPopErrorHandling(); - } - - if (PEAR::isError($latest)) { - $this->ui->outputData($latest->getMessage()); - continue; - } - - $caption .= ':'; - if (PEAR::isError($latest)) { - $this->config->set('default_channel', $savechannel); - return $latest; - } - - $data = array( - 'caption' => $caption, - 'border' => 1, - 'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Size'), - 'channel' => $channel - ); - - foreach ((array)$latest as $pkg => $info) { - $package = strtolower($pkg); - if (!isset($inst[$package])) { - // skip packages we don't have installed - continue; - } - - extract($info); - $inst_version = $reg->packageInfo($package, 'version', $channel); - $inst_state = $reg->packageInfo($package, 'release_state', $channel); - if (version_compare("$version", "$inst_version", "le")) { - // installed version is up-to-date - continue; - } - - if ($filesize >= 20480) { - $filesize += 1024 - ($filesize % 1024); - $fs = sprintf("%dkB", $filesize / 1024); - } elseif ($filesize > 0) { - $filesize += 103 - ($filesize % 103); - $fs = sprintf("%.1fkB", $filesize / 1024.0); - } else { - $fs = " -"; // XXX center instead - } - - $data['data'][] = array($channel, $pkg, "$inst_version ($inst_state)", "$version ($state)", $fs); - } - - if (isset($options['channelinfo'])) { - if (empty($data['data'])) { - unset($data['headline']); - if (count($inst) == 0) { - $data['data'] = '(no packages installed)'; - } else { - $data['data'] = '(no upgrades available)'; - } - } - $this->ui->outputData($data, $command); - } else { - if (empty($data['data'])) { - $this->ui->outputData('Channel ' . $channel . ': No upgrades available'); - } else { - $this->ui->outputData($data, $command); - } - } - } - - $this->config->set('default_channel', $savechannel); - return true; - } - - function doClearCache($command, $options, $params) - { - $cache_dir = $this->config->get('cache_dir'); - $verbose = $this->config->get('verbose'); - $output = ''; - if (!file_exists($cache_dir) || !is_dir($cache_dir)) { - return $this->raiseError("$cache_dir does not exist or is not a directory"); - } - - if (!($dp = @opendir($cache_dir))) { - return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); - } - - if ($verbose >= 1) { - $output .= "reading directory $cache_dir\n"; - } - - $num = 0; - while ($ent = readdir($dp)) { - if (preg_match('/rest.cache(file|id)\\z/', $ent)) { - $path = $cache_dir . DIRECTORY_SEPARATOR . $ent; - if (file_exists($path)) { - $ok = @unlink($path); - } else { - $ok = false; - $php_errormsg = ''; - } - - if ($ok) { - if ($verbose >= 2) { - $output .= "deleted $path\n"; - } - $num++; - } elseif ($verbose >= 1) { - $output .= "failed to delete $path $php_errormsg\n"; - } - } - } - - closedir($dp); - if ($verbose >= 1) { - $output .= "$num cache entries cleared\n"; - } - - $this->ui->outputData(rtrim($output), $command); - return $num; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Remote.xml b/3rdparty/PEAR/Command/Remote.xml deleted file mode 100644 index b4f6100c79..0000000000 --- a/3rdparty/PEAR/Command/Remote.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - Information About Remote Packages - doRemoteInfo - ri - - <package> -Get details on a package from the server. - - - List Available Upgrades - doListUpgrades - lu - - - i - output fully channel-aware data, even on failure - - - [preferred_state] -List releases on the server of packages you have installed where -a newer version is available with the same release state (stable etc.) -or the state passed as the second parameter. - - - List Remote Packages - doRemoteList - rl - - - c - specify a channel other than the default channel - CHAN - - - -Lists the packages available on the configured server along with the -latest stable release of each package. - - - Search remote package database - doSearch - sp - - - c - specify a channel other than the default channel - CHAN - - - a - search packages from all known channels - - - i - output fully channel-aware data, even on failure - - - [packagename] [packageinfo] -Lists all packages which match the search parameters. The first -parameter is a fragment of a packagename. The default channel -will be used unless explicitly overridden. The second parameter -will be used to match any portion of the summary/description - - - List All Packages - doListAll - la - - - c - specify a channel other than the default channel - CHAN - - - i - output fully channel-aware data, even on failure - - - -Lists the packages available on the configured server along with the -latest stable release of each package. - - - Download Package - doDownload - d - - - Z - download an uncompressed (.tar) file - - - <package>... -Download package tarballs. The files will be named as suggested by the -server, for example if you download the DB package and the latest stable -version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz. - - - Clear Web Services Cache - doClearCache - cc - - -Clear the XML-RPC/REST cache. See also the cache_ttl configuration -parameter. - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Test.php b/3rdparty/PEAR/Command/Test.php deleted file mode 100644 index a757d9e579..0000000000 --- a/3rdparty/PEAR/Command/Test.php +++ /dev/null @@ -1,337 +0,0 @@ - - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Test.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Command/Common.php'; - -/** - * PEAR commands for login/logout - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ - -class PEAR_Command_Test extends PEAR_Command_Common -{ - var $commands = array( - 'run-tests' => array( - 'summary' => 'Run Regression Tests', - 'function' => 'doRunTests', - 'shortcut' => 'rt', - 'options' => array( - 'recur' => array( - 'shortopt' => 'r', - 'doc' => 'Run tests in child directories, recursively. 4 dirs deep maximum', - ), - 'ini' => array( - 'shortopt' => 'i', - 'doc' => 'actual string of settings to pass to php in format " -d setting=blah"', - 'arg' => 'SETTINGS' - ), - 'realtimelog' => array( - 'shortopt' => 'l', - 'doc' => 'Log test runs/results as they are run', - ), - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Only display detail for failed tests', - ), - 'simple' => array( - 'shortopt' => 's', - 'doc' => 'Display simple output for all tests', - ), - 'package' => array( - 'shortopt' => 'p', - 'doc' => 'Treat parameters as installed packages from which to run tests', - ), - 'phpunit' => array( - 'shortopt' => 'u', - 'doc' => 'Search parameters for AllTests.php, and use that to run phpunit-based tests -If none is found, all .phpt tests will be tried instead.', - ), - 'tapoutput' => array( - 'shortopt' => 't', - 'doc' => 'Output run-tests.log in TAP-compliant format', - ), - 'cgi' => array( - 'shortopt' => 'c', - 'doc' => 'CGI php executable (needed for tests with POST/GET section)', - 'arg' => 'PHPCGI', - ), - 'coverage' => array( - 'shortopt' => 'x', - 'doc' => 'Generate a code coverage report (requires Xdebug 2.0.0+)', - ), - ), - 'doc' => '[testfile|dir ...] -Run regression tests with PHP\'s regression testing script (run-tests.php).', - ), - ); - - var $output; - - /** - * PEAR_Command_Test constructor. - * - * @access public - */ - function PEAR_Command_Test(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - function doRunTests($command, $options, $params) - { - if (isset($options['phpunit']) && isset($options['tapoutput'])) { - return $this->raiseError('ERROR: cannot use both --phpunit and --tapoutput at the same time'); - } - - require_once 'PEAR/Common.php'; - require_once 'System.php'; - $log = new PEAR_Common; - $log->ui = &$this->ui; // slightly hacky, but it will work - $tests = array(); - $depth = isset($options['recur']) ? 14 : 1; - - if (!count($params)) { - $params[] = '.'; - } - - if (isset($options['package'])) { - $oldparams = $params; - $params = array(); - $reg = &$this->config->getRegistry(); - foreach ($oldparams as $param) { - $pname = $reg->parsePackageName($param, $this->config->get('default_channel')); - if (PEAR::isError($pname)) { - return $this->raiseError($pname); - } - - $package = &$reg->getPackage($pname['package'], $pname['channel']); - if (!$package) { - return PEAR::raiseError('Unknown package "' . - $reg->parsedPackageNameToString($pname) . '"'); - } - - $filelist = $package->getFilelist(); - foreach ($filelist as $name => $atts) { - if (isset($atts['role']) && $atts['role'] != 'test') { - continue; - } - - if (isset($options['phpunit']) && preg_match('/AllTests\.php\\z/i', $name)) { - $params[] = $atts['installed_as']; - continue; - } elseif (!preg_match('/\.phpt\\z/', $name)) { - continue; - } - $params[] = $atts['installed_as']; - } - } - } - - foreach ($params as $p) { - if (is_dir($p)) { - if (isset($options['phpunit'])) { - $dir = System::find(array($p, '-type', 'f', - '-maxdepth', $depth, - '-name', 'AllTests.php')); - if (count($dir)) { - foreach ($dir as $p) { - $p = realpath($p); - if (!count($tests) || - (count($tests) && strlen($p) < strlen($tests[0]))) { - // this is in a higher-level directory, use this one instead. - $tests = array($p); - } - } - } - continue; - } - - $args = array($p, '-type', 'f', '-name', '*.phpt'); - } else { - if (isset($options['phpunit'])) { - if (preg_match('/AllTests\.php\\z/i', $p)) { - $p = realpath($p); - if (!count($tests) || - (count($tests) && strlen($p) < strlen($tests[0]))) { - // this is in a higher-level directory, use this one instead. - $tests = array($p); - } - } - continue; - } - - if (file_exists($p) && preg_match('/\.phpt$/', $p)) { - $tests[] = $p; - continue; - } - - if (!preg_match('/\.phpt\\z/', $p)) { - $p .= '.phpt'; - } - - $args = array(dirname($p), '-type', 'f', '-name', $p); - } - - if (!isset($options['recur'])) { - $args[] = '-maxdepth'; - $args[] = 1; - } - - $dir = System::find($args); - $tests = array_merge($tests, $dir); - } - - $ini_settings = ''; - if (isset($options['ini'])) { - $ini_settings .= $options['ini']; - } - - if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) { - $ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}"; - } - - if ($ini_settings) { - $this->ui->outputData('Using INI settings: "' . $ini_settings . '"'); - } - - $skipped = $passed = $failed = array(); - $tests_count = count($tests); - $this->ui->outputData('Running ' . $tests_count . ' tests', $command); - $start = time(); - if (isset($options['realtimelog']) && file_exists('run-tests.log')) { - unlink('run-tests.log'); - } - - if (isset($options['tapoutput'])) { - $tap = '1..' . $tests_count . "\n"; - } - - require_once 'PEAR/RunTest.php'; - $run = new PEAR_RunTest($log, $options); - $run->tests_count = $tests_count; - - if (isset($options['coverage']) && extension_loaded('xdebug')){ - $run->xdebug_loaded = true; - } else { - $run->xdebug_loaded = false; - } - - $j = $i = 1; - foreach ($tests as $t) { - if (isset($options['realtimelog'])) { - $fp = @fopen('run-tests.log', 'a'); - if ($fp) { - fwrite($fp, "Running test [$i / $tests_count] $t..."); - fclose($fp); - } - } - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - if (isset($options['phpunit'])) { - $result = $run->runPHPUnit($t, $ini_settings); - } else { - $result = $run->run($t, $ini_settings, $j); - } - PEAR::staticPopErrorHandling(); - if (PEAR::isError($result)) { - $this->ui->log($result->getMessage()); - continue; - } - - if (isset($options['tapoutput'])) { - $tap .= $result[0] . ' ' . $i . $result[1] . "\n"; - continue; - } - - if (isset($options['realtimelog'])) { - $fp = @fopen('run-tests.log', 'a'); - if ($fp) { - fwrite($fp, "$result\n"); - fclose($fp); - } - } - - if ($result == 'FAILED') { - $failed[] = $t; - } - if ($result == 'PASSED') { - $passed[] = $t; - } - if ($result == 'SKIPPED') { - $skipped[] = $t; - } - - $j++; - } - - $total = date('i:s', time() - $start); - if (isset($options['tapoutput'])) { - $fp = @fopen('run-tests.log', 'w'); - if ($fp) { - fwrite($fp, $tap, strlen($tap)); - fclose($fp); - $this->ui->outputData('wrote TAP-format log to "' .realpath('run-tests.log') . - '"', $command); - } - } else { - if (count($failed)) { - $output = "TOTAL TIME: $total\n"; - $output .= count($passed) . " PASSED TESTS\n"; - $output .= count($skipped) . " SKIPPED TESTS\n"; - $output .= count($failed) . " FAILED TESTS:\n"; - foreach ($failed as $failure) { - $output .= $failure . "\n"; - } - - $mode = isset($options['realtimelog']) ? 'a' : 'w'; - $fp = @fopen('run-tests.log', $mode); - - if ($fp) { - fwrite($fp, $output, strlen($output)); - fclose($fp); - $this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command); - } - } elseif (file_exists('run-tests.log') && !is_dir('run-tests.log')) { - @unlink('run-tests.log'); - } - } - $this->ui->outputData('TOTAL TIME: ' . $total); - $this->ui->outputData(count($passed) . ' PASSED TESTS', $command); - $this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command); - if (count($failed)) { - $this->ui->outputData(count($failed) . ' FAILED TESTS:', $command); - foreach ($failed as $failure) { - $this->ui->outputData($failure, $command); - } - } - - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Test.xml b/3rdparty/PEAR/Command/Test.xml deleted file mode 100644 index bbe9fcccc5..0000000000 --- a/3rdparty/PEAR/Command/Test.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - Run Regression Tests - doRunTests - rt - - - r - Run tests in child directories, recursively. 4 dirs deep maximum - - - i - actual string of settings to pass to php in format " -d setting=blah" - SETTINGS - - - l - Log test runs/results as they are run - - - q - Only display detail for failed tests - - - s - Display simple output for all tests - - - p - Treat parameters as installed packages from which to run tests - - - u - Search parameters for AllTests.php, and use that to run phpunit-based tests -If none is found, all .phpt tests will be tried instead. - - - t - Output run-tests.log in TAP-compliant format - - - c - CGI php executable (needed for tests with POST/GET section) - PHPCGI - - - x - Generate a code coverage report (requires Xdebug 2.0.0+) - - - [testfile|dir ...] -Run regression tests with PHP's regression testing script (run-tests.php). - - \ No newline at end of file diff --git a/3rdparty/PEAR/Common.php b/3rdparty/PEAR/Common.php deleted file mode 100644 index 83f2de742a..0000000000 --- a/3rdparty/PEAR/Common.php +++ /dev/null @@ -1,837 +0,0 @@ - - * @author Tomas V. V. Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1.0 - * @deprecated File deprecated since Release 1.4.0a1 - */ - -/** - * Include error handling - */ -require_once 'PEAR.php'; - -/** - * PEAR_Common error when an invalid PHP file is passed to PEAR_Common::analyzeSourceCode() - */ -define('PEAR_COMMON_ERROR_INVALIDPHP', 1); -define('_PEAR_COMMON_PACKAGE_NAME_PREG', '[A-Za-z][a-zA-Z0-9_]+'); -define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/'); - -// this should allow: 1, 1.0, 1.0RC1, 1.0dev, 1.0dev123234234234, 1.0a1, 1.0b1, 1.0pl1 -define('_PEAR_COMMON_PACKAGE_VERSION_PREG', '\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?'); -define('PEAR_COMMON_PACKAGE_VERSION_PREG', '/^' . _PEAR_COMMON_PACKAGE_VERSION_PREG . '\\z/i'); - -// XXX far from perfect :-) -define('_PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '(' . _PEAR_COMMON_PACKAGE_NAME_PREG . - ')(-([.0-9a-zA-Z]+))?'); -define('PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_PACKAGE_DOWNLOAD_PREG . - '\\z/'); - -define('_PEAR_CHANNELS_NAME_PREG', '[A-Za-z][a-zA-Z0-9\.]+'); -define('PEAR_CHANNELS_NAME_PREG', '/^' . _PEAR_CHANNELS_NAME_PREG . '\\z/'); - -// this should allow any dns or IP address, plus a path - NO UNDERSCORES ALLOWED -define('_PEAR_CHANNELS_SERVER_PREG', '[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*(\/[a-zA-Z0-9\-]+)*'); -define('PEAR_CHANNELS_SERVER_PREG', '/^' . _PEAR_CHANNELS_SERVER_PREG . '\\z/i'); - -define('_PEAR_CHANNELS_PACKAGE_PREG', '(' ._PEAR_CHANNELS_SERVER_PREG . ')\/(' - . _PEAR_COMMON_PACKAGE_NAME_PREG . ')'); -define('PEAR_CHANNELS_PACKAGE_PREG', '/^' . _PEAR_CHANNELS_PACKAGE_PREG . '\\z/i'); - -define('_PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '(' . _PEAR_CHANNELS_NAME_PREG . ')::(' - . _PEAR_COMMON_PACKAGE_NAME_PREG . ')(-([.0-9a-zA-Z]+))?'); -define('PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_CHANNEL_DOWNLOAD_PREG . '\\z/'); - -/** - * List of temporary files and directories registered by - * PEAR_Common::addTempFile(). - * @var array - */ -$GLOBALS['_PEAR_Common_tempfiles'] = array(); - -/** - * Valid maintainer roles - * @var array - */ -$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper'); - -/** - * Valid release states - * @var array - */ -$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel'); - -/** - * Valid dependency types - * @var array - */ -$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi'); - -/** - * Valid dependency relations - * @var array - */ -$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge','not', 'ne'); - -/** - * Valid file roles - * @var array - */ -$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script'); - -/** - * Valid replacement types - * @var array - */ -$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info'); - -/** - * Valid "provide" types - * @var array - */ -$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api'); - -/** - * Valid "provide" types - * @var array - */ -$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup'); - -/** - * Class providing common functionality for PEAR administration classes. - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V. V. Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - * @deprecated This class will disappear, and its components will be spread - * into smaller classes, like the AT&T breakup, as of Release 1.4.0a1 - */ -class PEAR_Common extends PEAR -{ - /** - * User Interface object (PEAR_Frontend_* class). If null, - * the log() method uses print. - * @var object - */ - var $ui = null; - - /** - * Configuration object (PEAR_Config). - * @var PEAR_Config - */ - var $config = null; - - /** stack of elements, gives some sort of XML context */ - var $element_stack = array(); - - /** name of currently parsed XML element */ - var $current_element; - - /** array of attributes of the currently parsed XML element */ - var $current_attributes = array(); - - /** assoc with information about a package */ - var $pkginfo = array(); - - var $current_path = null; - - /** - * Flag variable used to mark a valid package file - * @var boolean - * @access private - */ - var $_validPackageFile; - - /** - * PEAR_Common constructor - * - * @access public - */ - function PEAR_Common() - { - parent::PEAR(); - $this->config = PEAR_Config::singleton(); - $this->debug = $this->config->get('verbose'); - } - - /** - * PEAR_Common destructor - * - * @access private - */ - function _PEAR_Common() - { - // doesn't work due to bug #14744 - //$tempfiles = $this->_tempfiles; - $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles']; - while ($file = array_shift($tempfiles)) { - if (@is_dir($file)) { - if (!class_exists('System')) { - require_once 'System.php'; - } - - System::rm(array('-rf', $file)); - } elseif (file_exists($file)) { - unlink($file); - } - } - } - - /** - * Register a temporary file or directory. When the destructor is - * executed, all registered temporary files and directories are - * removed. - * - * @param string $file name of file or directory - * - * @return void - * - * @access public - */ - function addTempFile($file) - { - if (!class_exists('PEAR_Frontend')) { - require_once 'PEAR/Frontend.php'; - } - PEAR_Frontend::addTempFile($file); - } - - /** - * Wrapper to System::mkDir(), creates a directory as well as - * any necessary parent directories. - * - * @param string $dir directory name - * - * @return bool TRUE on success, or a PEAR error - * - * @access public - */ - function mkDirHier($dir) - { - // Only used in Installer - move it there ? - $this->log(2, "+ create dir $dir"); - if (!class_exists('System')) { - require_once 'System.php'; - } - return System::mkDir(array('-p', $dir)); - } - - /** - * Logging method. - * - * @param int $level log level (0 is quiet, higher is noisier) - * @param string $msg message to write to the log - * - * @return void - * - * @access public - * @static - */ - function log($level, $msg, $append_crlf = true) - { - if ($this->debug >= $level) { - if (!class_exists('PEAR_Frontend')) { - require_once 'PEAR/Frontend.php'; - } - - $ui = &PEAR_Frontend::singleton(); - if (is_a($ui, 'PEAR_Frontend')) { - $ui->log($msg, $append_crlf); - } else { - print "$msg\n"; - } - } - } - - /** - * Create and register a temporary directory. - * - * @param string $tmpdir (optional) Directory to use as tmpdir. - * Will use system defaults (for example - * /tmp or c:\windows\temp) if not specified - * - * @return string name of created directory - * - * @access public - */ - function mkTempDir($tmpdir = '') - { - $topt = $tmpdir ? array('-t', $tmpdir) : array(); - $topt = array_merge($topt, array('-d', 'pear')); - if (!class_exists('System')) { - require_once 'System.php'; - } - - if (!$tmpdir = System::mktemp($topt)) { - return false; - } - - $this->addTempFile($tmpdir); - return $tmpdir; - } - - /** - * Set object that represents the frontend to be used. - * - * @param object Reference of the frontend object - * @return void - * @access public - */ - function setFrontendObject(&$ui) - { - $this->ui = &$ui; - } - - /** - * Return an array containing all of the states that are more stable than - * or equal to the passed in state - * - * @param string Release state - * @param boolean Determines whether to include $state in the list - * @return false|array False if $state is not a valid release state - */ - function betterStates($state, $include = false) - { - static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); - $i = array_search($state, $states); - if ($i === false) { - return false; - } - if ($include) { - $i--; - } - return array_slice($states, $i + 1); - } - - /** - * Get the valid roles for a PEAR package maintainer - * - * @return array - * @static - */ - function getUserRoles() - { - return $GLOBALS['_PEAR_Common_maintainer_roles']; - } - - /** - * Get the valid package release states of packages - * - * @return array - * @static - */ - function getReleaseStates() - { - return $GLOBALS['_PEAR_Common_release_states']; - } - - /** - * Get the implemented dependency types (php, ext, pkg etc.) - * - * @return array - * @static - */ - function getDependencyTypes() - { - return $GLOBALS['_PEAR_Common_dependency_types']; - } - - /** - * Get the implemented dependency relations (has, lt, ge etc.) - * - * @return array - * @static - */ - function getDependencyRelations() - { - return $GLOBALS['_PEAR_Common_dependency_relations']; - } - - /** - * Get the implemented file roles - * - * @return array - * @static - */ - function getFileRoles() - { - return $GLOBALS['_PEAR_Common_file_roles']; - } - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getReplacementTypes() - { - return $GLOBALS['_PEAR_Common_replacement_types']; - } - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getProvideTypes() - { - return $GLOBALS['_PEAR_Common_provide_types']; - } - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getScriptPhases() - { - return $GLOBALS['_PEAR_Common_script_phases']; - } - - /** - * Test whether a string contains a valid package name. - * - * @param string $name the package name to test - * - * @return bool - * - * @access public - */ - function validPackageName($name) - { - return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name); - } - - /** - * Test whether a string contains a valid package version. - * - * @param string $ver the package version to test - * - * @return bool - * - * @access public - */ - function validPackageVersion($ver) - { - return (bool)preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver); - } - - /** - * @param string $path relative or absolute include path - * @return boolean - * @static - */ - function isIncludeable($path) - { - if (file_exists($path) && is_readable($path)) { - return true; - } - - $ipath = explode(PATH_SEPARATOR, ini_get('include_path')); - foreach ($ipath as $include) { - $test = realpath($include . DIRECTORY_SEPARATOR . $path); - if (file_exists($test) && is_readable($test)) { - return true; - } - } - - return false; - } - - function _postProcessChecks($pf) - { - if (!PEAR::isError($pf)) { - return $this->_postProcessValidPackagexml($pf); - } - - $errs = $pf->getUserinfo(); - if (is_array($errs)) { - foreach ($errs as $error) { - $e = $this->raiseError($error['message'], $error['code'], null, null, $error); - } - } - - return $pf; - } - - /** - * Returns information about a package file. Expects the name of - * a gzipped tar file as input. - * - * @param string $file name of .tgz file - * - * @return array array with package information - * - * @access public - * @deprecated use PEAR_PackageFile->fromTgzFile() instead - * - */ - function infoFromTgzFile($file) - { - $packagefile = &new PEAR_PackageFile($this->config); - $pf = &$packagefile->fromTgzFile($file, PEAR_VALIDATE_NORMAL); - return $this->_postProcessChecks($pf); - } - - /** - * Returns information about a package file. Expects the name of - * a package xml file as input. - * - * @param string $descfile name of package xml file - * - * @return array array with package information - * - * @access public - * @deprecated use PEAR_PackageFile->fromPackageFile() instead - * - */ - function infoFromDescriptionFile($descfile) - { - $packagefile = &new PEAR_PackageFile($this->config); - $pf = &$packagefile->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL); - return $this->_postProcessChecks($pf); - } - - /** - * Returns information about a package file. Expects the contents - * of a package xml file as input. - * - * @param string $data contents of package.xml file - * - * @return array array with package information - * - * @access public - * @deprecated use PEAR_PackageFile->fromXmlstring() instead - * - */ - function infoFromString($data) - { - $packagefile = &new PEAR_PackageFile($this->config); - $pf = &$packagefile->fromXmlString($data, PEAR_VALIDATE_NORMAL, false); - return $this->_postProcessChecks($pf); - } - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @return array - */ - function _postProcessValidPackagexml(&$pf) - { - if (!is_a($pf, 'PEAR_PackageFile_v2')) { - $this->pkginfo = $pf->toArray(); - return $this->pkginfo; - } - - // sort of make this into a package.xml 1.0-style array - // changelog is not converted to old format. - $arr = $pf->toArray(true); - $arr = array_merge($arr, $arr['old']); - unset($arr['old'], $arr['xsdversion'], $arr['contents'], $arr['compatible'], - $arr['channel'], $arr['uri'], $arr['dependencies'], $arr['phprelease'], - $arr['extsrcrelease'], $arr['zendextsrcrelease'], $arr['extbinrelease'], - $arr['zendextbinrelease'], $arr['bundle'], $arr['lead'], $arr['developer'], - $arr['helper'], $arr['contributor']); - $arr['filelist'] = $pf->getFilelist(); - $this->pkginfo = $arr; - return $arr; - } - - /** - * Returns package information from different sources - * - * This method is able to extract information about a package - * from a .tgz archive or from a XML package definition file. - * - * @access public - * @param string Filename of the source ('package.xml', '.tgz') - * @return string - * @deprecated use PEAR_PackageFile->fromAnyFile() instead - */ - function infoFromAny($info) - { - if (is_string($info) && file_exists($info)) { - $packagefile = &new PEAR_PackageFile($this->config); - $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL); - if (PEAR::isError($pf)) { - $errs = $pf->getUserinfo(); - if (is_array($errs)) { - foreach ($errs as $error) { - $e = $this->raiseError($error['message'], $error['code'], null, null, $error); - } - } - - return $pf; - } - - return $this->_postProcessValidPackagexml($pf); - } - - return $info; - } - - /** - * Return an XML document based on the package info (as returned - * by the PEAR_Common::infoFrom* methods). - * - * @param array $pkginfo package info - * - * @return string XML data - * - * @access public - * @deprecated use a PEAR_PackageFile_v* object's generator instead - */ - function xmlFromInfo($pkginfo) - { - $config = &PEAR_Config::singleton(); - $packagefile = &new PEAR_PackageFile($config); - $pf = &$packagefile->fromArray($pkginfo); - $gen = &$pf->getDefaultGenerator(); - return $gen->toXml(PEAR_VALIDATE_PACKAGING); - } - - /** - * Validate XML package definition file. - * - * @param string $info Filename of the package archive or of the - * package definition file - * @param array $errors Array that will contain the errors - * @param array $warnings Array that will contain the warnings - * @param string $dir_prefix (optional) directory where source files - * may be found, or empty if they are not available - * @access public - * @return boolean - * @deprecated use the validation of PEAR_PackageFile objects - */ - function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '') - { - $config = &PEAR_Config::singleton(); - $packagefile = &new PEAR_PackageFile($config); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - if (strpos($info, 'fromXmlString($info, PEAR_VALIDATE_NORMAL, ''); - } else { - $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL); - } - - PEAR::staticPopErrorHandling(); - if (PEAR::isError($pf)) { - $errs = $pf->getUserinfo(); - if (is_array($errs)) { - foreach ($errs as $error) { - if ($error['level'] == 'error') { - $errors[] = $error['message']; - } else { - $warnings[] = $error['message']; - } - } - } - - return false; - } - - return true; - } - - /** - * Build a "provides" array from data returned by - * analyzeSourceCode(). The format of the built array is like - * this: - * - * array( - * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), - * ... - * ) - * - * - * @param array $srcinfo array with information about a source file - * as returned by the analyzeSourceCode() method. - * - * @return void - * - * @access public - * - */ - function buildProvidesArray($srcinfo) - { - $file = basename($srcinfo['source_file']); - $pn = ''; - if (isset($this->_packageName)) { - $pn = $this->_packageName; - } - - $pnl = strlen($pn); - foreach ($srcinfo['declared_classes'] as $class) { - $key = "class;$class"; - if (isset($this->pkginfo['provides'][$key])) { - continue; - } - - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'class', 'name' => $class); - if (isset($srcinfo['inheritance'][$class])) { - $this->pkginfo['provides'][$key]['extends'] = - $srcinfo['inheritance'][$class]; - } - } - - foreach ($srcinfo['declared_methods'] as $class => $methods) { - foreach ($methods as $method) { - $function = "$class::$method"; - $key = "function;$function"; - if ($method{0} == '_' || !strcasecmp($method, $class) || - isset($this->pkginfo['provides'][$key])) { - continue; - } - - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - foreach ($srcinfo['declared_functions'] as $function) { - $key = "function;$function"; - if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) { - continue; - } - - if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) { - $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\""; - } - - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - /** - * Analyze the source code of the given PHP file - * - * @param string Filename of the PHP file - * @return mixed - * @access public - */ - function analyzeSourceCode($file) - { - if (!class_exists('PEAR_PackageFile_v2_Validator')) { - require_once 'PEAR/PackageFile/v2/Validator.php'; - } - - $a = new PEAR_PackageFile_v2_Validator; - return $a->analyzeSourceCode($file); - } - - function detectDependencies($any, $status_callback = null) - { - if (!function_exists("token_get_all")) { - return false; - } - - if (PEAR::isError($info = $this->infoFromAny($any))) { - return $this->raiseError($info); - } - - if (!is_array($info)) { - return false; - } - - $deps = array(); - $used_c = $decl_c = $decl_f = $decl_m = array(); - foreach ($info['filelist'] as $file => $fa) { - $tmp = $this->analyzeSourceCode($file); - $used_c = @array_merge($used_c, $tmp['used_classes']); - $decl_c = @array_merge($decl_c, $tmp['declared_classes']); - $decl_f = @array_merge($decl_f, $tmp['declared_functions']); - $decl_m = @array_merge($decl_m, $tmp['declared_methods']); - $inheri = @array_merge($inheri, $tmp['inheritance']); - } - - $used_c = array_unique($used_c); - $decl_c = array_unique($decl_c); - $undecl_c = array_diff($used_c, $decl_c); - - return array('used_classes' => $used_c, - 'declared_classes' => $decl_c, - 'declared_methods' => $decl_m, - 'declared_functions' => $decl_f, - 'undeclared_classes' => $undecl_c, - 'inheritance' => $inheri, - ); - } - - /** - * Download a file through HTTP. Considers suggested file name in - * Content-disposition: header and can run a callback function for - * different events. The callback will be called with two - * parameters: the callback type, and parameters. The implemented - * callback types are: - * - * 'setup' called at the very beginning, parameter is a UI object - * that should be used for all output - * 'message' the parameter is a string with an informational message - * 'saveas' may be used to save with a different file name, the - * parameter is the filename that is about to be used. - * If a 'saveas' callback returns a non-empty string, - * that file name will be used as the filename instead. - * Note that $save_dir will not be affected by this, only - * the basename of the file. - * 'start' download is starting, parameter is number of bytes - * that are expected, or -1 if unknown - * 'bytesread' parameter is the number of bytes read so far - * 'done' download is complete, parameter is the total number - * of bytes read - * 'connfailed' if the TCP connection fails, this callback is called - * with array(host,port,errno,errmsg) - * 'writefailed' if writing to disk fails, this callback is called - * with array(destfile,errmsg) - * - * If an HTTP proxy has been configured (http_proxy PEAR_Config - * setting), the proxy will be used. - * - * @param string $url the URL to download - * @param object $ui PEAR_Frontend_* instance - * @param object $config PEAR_Config instance - * @param string $save_dir (optional) directory to save file in - * @param mixed $callback (optional) function/method to call for status - * updates - * - * @return string Returns the full path of the downloaded file or a PEAR - * error on failure. If the error is caused by - * socket-related errors, the error object will - * have the fsockopen error code available through - * getCode(). - * - * @access public - * @deprecated in favor of PEAR_Downloader::downloadHttp() - */ - function downloadHttp($url, &$ui, $save_dir = '.', $callback = null) - { - if (!class_exists('PEAR_Downloader')) { - require_once 'PEAR/Downloader.php'; - } - return PEAR_Downloader::downloadHttp($url, $ui, $save_dir, $callback); - } -} - -require_once 'PEAR/Config.php'; -require_once 'PEAR/PackageFile.php'; \ No newline at end of file diff --git a/3rdparty/PEAR/Config.php b/3rdparty/PEAR/Config.php deleted file mode 100644 index 86a7db3f32..0000000000 --- a/3rdparty/PEAR/Config.php +++ /dev/null @@ -1,2097 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Config.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * Required for error handling - */ -require_once 'PEAR.php'; -require_once 'PEAR/Registry.php'; -require_once 'PEAR/Installer/Role.php'; -require_once 'System.php'; - -/** - * Last created PEAR_Config instance. - * @var object - */ -$GLOBALS['_PEAR_Config_instance'] = null; -if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) { - $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear'; -} else { - $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR; -} - -// Below we define constants with default values for all configuration -// parameters except username/password. All of them can have their -// defaults set through environment variables. The reason we use the -// PHP_ prefix is for some security, PHP protects environment -// variables starting with PHP_*. - -// default channel and preferred mirror is based on whether we are invoked through -// the "pear" or the "pecl" command -if (!defined('PEAR_RUNTYPE')) { - define('PEAR_RUNTYPE', 'pear'); -} - -if (PEAR_RUNTYPE == 'pear') { - define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pear.php.net'); -} else { - define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pecl.php.net'); -} - -if (getenv('PHP_PEAR_SYSCONF_DIR')) { - define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); -} elseif (getenv('SystemRoot')) { - define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); -} else { - define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); -} - -// Default for master_server -if (getenv('PHP_PEAR_MASTER_SERVER')) { - define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER')); -} else { - define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net'); -} - -// Default for http_proxy -if (getenv('PHP_PEAR_HTTP_PROXY')) { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY')); -} elseif (getenv('http_proxy')) { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy')); -} else { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', ''); -} - -// Default for php_dir -if (getenv('PHP_PEAR_INSTALL_DIR')) { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR')); -} else { - if (@file_exists($PEAR_INSTALL_DIR) && is_dir($PEAR_INSTALL_DIR)) { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR); - } else { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR); - } -} - -// Default for ext_dir -if (getenv('PHP_PEAR_EXTENSION_DIR')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR')); -} else { - if (ini_get('extension_dir')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir')); - } elseif (defined('PEAR_EXTENSION_DIR') && - file_exists(PEAR_EXTENSION_DIR) && is_dir(PEAR_EXTENSION_DIR)) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', PEAR_EXTENSION_DIR); - } elseif (defined('PHP_EXTENSION_DIR')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', PHP_EXTENSION_DIR); - } else { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', '.'); - } -} - -// Default for doc_dir -if (getenv('PHP_PEAR_DOC_DIR')) { - define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_DOC_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs'); -} - -// Default for bin_dir -if (getenv('PHP_PEAR_BIN_DIR')) { - define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR); -} - -// Default for data_dir -if (getenv('PHP_PEAR_DATA_DIR')) { - define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_DATA_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data'); -} - -// Default for cfg_dir -if (getenv('PHP_PEAR_CFG_DIR')) { - define('PEAR_CONFIG_DEFAULT_CFG_DIR', getenv('PHP_PEAR_CFG_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_CFG_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'cfg'); -} - -// Default for www_dir -if (getenv('PHP_PEAR_WWW_DIR')) { - define('PEAR_CONFIG_DEFAULT_WWW_DIR', getenv('PHP_PEAR_WWW_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_WWW_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'www'); -} - -// Default for test_dir -if (getenv('PHP_PEAR_TEST_DIR')) { - define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_TEST_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests'); -} - -// Default for temp_dir -if (getenv('PHP_PEAR_TEMP_DIR')) { - define('PEAR_CONFIG_DEFAULT_TEMP_DIR', getenv('PHP_PEAR_TEMP_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_TEMP_DIR', - System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . - DIRECTORY_SEPARATOR . 'temp'); -} - -// Default for cache_dir -if (getenv('PHP_PEAR_CACHE_DIR')) { - define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_CACHE_DIR', - System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . - DIRECTORY_SEPARATOR . 'cache'); -} - -// Default for download_dir -if (getenv('PHP_PEAR_DOWNLOAD_DIR')) { - define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR', getenv('PHP_PEAR_DOWNLOAD_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR', - System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . - DIRECTORY_SEPARATOR . 'download'); -} - -// Default for php_bin -if (getenv('PHP_PEAR_PHP_BIN')) { - define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN')); -} else { - define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR. - DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : '')); -} - -// Default for verbose -if (getenv('PHP_PEAR_VERBOSE')) { - define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE')); -} else { - define('PEAR_CONFIG_DEFAULT_VERBOSE', 1); -} - -// Default for preferred_state -if (getenv('PHP_PEAR_PREFERRED_STATE')) { - define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE')); -} else { - define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable'); -} - -// Default for umask -if (getenv('PHP_PEAR_UMASK')) { - define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK')); -} else { - define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask())); -} - -// Default for cache_ttl -if (getenv('PHP_PEAR_CACHE_TTL')) { - define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL')); -} else { - define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600); -} - -// Default for sig_type -if (getenv('PHP_PEAR_SIG_TYPE')) { - define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg'); -} - -// Default for sig_bin -if (getenv('PHP_PEAR_SIG_BIN')) { - define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_BIN', - System::which( - 'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg')); -} - -// Default for sig_keydir -if (getenv('PHP_PEAR_SIG_KEYDIR')) { - define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', - PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys'); -} - -/** - * This is a class for storing configuration data, keeping track of - * which are system-defined, user-defined or defaulted. - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Config extends PEAR -{ - /** - * Array of config files used. - * - * @var array layer => config file - */ - var $files = array( - 'system' => '', - 'user' => '', - ); - - var $layers = array(); - - /** - * Configuration data, two-dimensional array where the first - * dimension is the config layer ('user', 'system' and 'default'), - * and the second dimension is keyname => value. - * - * The order in the first dimension is important! Earlier - * layers will shadow later ones when a config value is - * requested (if a 'user' value exists, it will be returned first, - * then 'system' and finally 'default'). - * - * @var array layer => array(keyname => value, ...) - */ - var $configuration = array( - 'user' => array(), - 'system' => array(), - 'default' => array(), - ); - - /** - * Configuration values that can be set for a channel - * - * All other configuration values can only have a global value - * @var array - * @access private - */ - var $_channelConfigInfo = array( - 'php_dir', 'ext_dir', 'doc_dir', 'bin_dir', 'data_dir', 'cfg_dir', - 'test_dir', 'www_dir', 'php_bin', 'php_prefix', 'php_suffix', 'username', - 'password', 'verbose', 'preferred_state', 'umask', 'preferred_mirror', 'php_ini' - ); - - /** - * Channels that can be accessed - * @see setChannels() - * @var array - * @access private - */ - var $_channels = array('pear.php.net', 'pecl.php.net', '__uri'); - - /** - * This variable is used to control the directory values returned - * @see setInstallRoot(); - * @var string|false - * @access private - */ - var $_installRoot = false; - - /** - * If requested, this will always refer to the registry - * contained in php_dir - * @var PEAR_Registry - */ - var $_registry = array(); - - /** - * @var array - * @access private - */ - var $_regInitialized = array(); - - /** - * @var bool - * @access private - */ - var $_noRegistry = false; - - /** - * amount of errors found while parsing config - * @var integer - * @access private - */ - var $_errorsFound = 0; - var $_lastError = null; - - /** - * Information about the configuration data. Stores the type, - * default value and a documentation string for each configuration - * value. - * - * @var array layer => array(infotype => value, ...) - */ - var $configuration_info = array( - // Channels/Internet Access - 'default_channel' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_CHANNEL, - 'doc' => 'the default channel to use for all non explicit commands', - 'prompt' => 'Default Channel', - 'group' => 'Internet Access', - ), - 'preferred_mirror' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_CHANNEL, - 'doc' => 'the default server or mirror to use for channel actions', - 'prompt' => 'Default Channel Mirror', - 'group' => 'Internet Access', - ), - 'remote_config' => array( - 'type' => 'password', - 'default' => '', - 'doc' => 'ftp url of remote configuration file to use for synchronized install', - 'prompt' => 'Remote Configuration File', - 'group' => 'Internet Access', - ), - 'auto_discover' => array( - 'type' => 'integer', - 'default' => 0, - 'doc' => 'whether to automatically discover new channels', - 'prompt' => 'Auto-discover new Channels', - 'group' => 'Internet Access', - ), - // Internet Access - 'master_server' => array( - 'type' => 'string', - 'default' => 'pear.php.net', - 'doc' => 'name of the main PEAR server [NOT USED IN THIS VERSION]', - 'prompt' => 'PEAR server [DEPRECATED]', - 'group' => 'Internet Access', - ), - 'http_proxy' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY, - 'doc' => 'HTTP proxy (host:port) to use when downloading packages', - 'prompt' => 'HTTP Proxy Server Address', - 'group' => 'Internet Access', - ), - // File Locations - 'php_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_PHP_DIR, - 'doc' => 'directory where .php files are installed', - 'prompt' => 'PEAR directory', - 'group' => 'File Locations', - ), - 'ext_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, - 'doc' => 'directory where loadable extensions are installed', - 'prompt' => 'PHP extension directory', - 'group' => 'File Locations', - ), - 'doc_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_DOC_DIR, - 'doc' => 'directory where documentation is installed', - 'prompt' => 'PEAR documentation directory', - 'group' => 'File Locations', - ), - 'bin_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_BIN_DIR, - 'doc' => 'directory where executables are installed', - 'prompt' => 'PEAR executables directory', - 'group' => 'File Locations', - ), - 'data_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_DATA_DIR, - 'doc' => 'directory where data files are installed', - 'prompt' => 'PEAR data directory', - 'group' => 'File Locations (Advanced)', - ), - 'cfg_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_CFG_DIR, - 'doc' => 'directory where modifiable configuration files are installed', - 'prompt' => 'PEAR configuration file directory', - 'group' => 'File Locations (Advanced)', - ), - 'www_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_WWW_DIR, - 'doc' => 'directory where www frontend files (html/js) are installed', - 'prompt' => 'PEAR www files directory', - 'group' => 'File Locations (Advanced)', - ), - 'test_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_TEST_DIR, - 'doc' => 'directory where regression tests are installed', - 'prompt' => 'PEAR test directory', - 'group' => 'File Locations (Advanced)', - ), - 'cache_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR, - 'doc' => 'directory which is used for web service cache', - 'prompt' => 'PEAR Installer cache directory', - 'group' => 'File Locations (Advanced)', - ), - 'temp_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_TEMP_DIR, - 'doc' => 'directory which is used for all temp files', - 'prompt' => 'PEAR Installer temp directory', - 'group' => 'File Locations (Advanced)', - ), - 'download_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR, - 'doc' => 'directory which is used for all downloaded files', - 'prompt' => 'PEAR Installer download directory', - 'group' => 'File Locations (Advanced)', - ), - 'php_bin' => array( - 'type' => 'file', - 'default' => PEAR_CONFIG_DEFAULT_PHP_BIN, - 'doc' => 'PHP CLI/CGI binary for executing scripts', - 'prompt' => 'PHP CLI/CGI binary', - 'group' => 'File Locations (Advanced)', - ), - 'php_prefix' => array( - 'type' => 'string', - 'default' => '', - 'doc' => '--program-prefix for php_bin\'s ./configure, used for pecl installs', - 'prompt' => '--program-prefix passed to PHP\'s ./configure', - 'group' => 'File Locations (Advanced)', - ), - 'php_suffix' => array( - 'type' => 'string', - 'default' => '', - 'doc' => '--program-suffix for php_bin\'s ./configure, used for pecl installs', - 'prompt' => '--program-suffix passed to PHP\'s ./configure', - 'group' => 'File Locations (Advanced)', - ), - 'php_ini' => array( - 'type' => 'file', - 'default' => '', - 'doc' => 'location of php.ini in which to enable PECL extensions on install', - 'prompt' => 'php.ini location', - 'group' => 'File Locations (Advanced)', - ), - // Maintainers - 'username' => array( - 'type' => 'string', - 'default' => '', - 'doc' => '(maintainers) your PEAR account name', - 'prompt' => 'PEAR username (for maintainers)', - 'group' => 'Maintainers', - ), - 'password' => array( - 'type' => 'password', - 'default' => '', - 'doc' => '(maintainers) your PEAR account password', - 'prompt' => 'PEAR password (for maintainers)', - 'group' => 'Maintainers', - ), - // Advanced - 'verbose' => array( - 'type' => 'integer', - 'default' => PEAR_CONFIG_DEFAULT_VERBOSE, - 'doc' => 'verbosity level -0: really quiet -1: somewhat quiet -2: verbose -3: debug', - 'prompt' => 'Debug Log Level', - 'group' => 'Advanced', - ), - 'preferred_state' => array( - 'type' => 'set', - 'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE, - 'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified', - 'valid_set' => array( - 'stable', 'beta', 'alpha', 'devel', 'snapshot'), - 'prompt' => 'Preferred Package State', - 'group' => 'Advanced', - ), - 'umask' => array( - 'type' => 'mask', - 'default' => PEAR_CONFIG_DEFAULT_UMASK, - 'doc' => 'umask used when creating files (Unix-like systems only)', - 'prompt' => 'Unix file mask', - 'group' => 'Advanced', - ), - 'cache_ttl' => array( - 'type' => 'integer', - 'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL, - 'doc' => 'amount of secs where the local cache is used and not updated', - 'prompt' => 'Cache TimeToLive', - 'group' => 'Advanced', - ), - 'sig_type' => array( - 'type' => 'set', - 'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE, - 'doc' => 'which package signature mechanism to use', - 'valid_set' => array('gpg'), - 'prompt' => 'Package Signature Type', - 'group' => 'Maintainers', - ), - 'sig_bin' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_SIG_BIN, - 'doc' => 'which package signature mechanism to use', - 'prompt' => 'Signature Handling Program', - 'group' => 'Maintainers', - ), - 'sig_keyid' => array( - 'type' => 'string', - 'default' => '', - 'doc' => 'which key to use for signing with', - 'prompt' => 'Signature Key Id', - 'group' => 'Maintainers', - ), - 'sig_keydir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR, - 'doc' => 'directory where signature keys are located', - 'prompt' => 'Signature Key Directory', - 'group' => 'Maintainers', - ), - // __channels is reserved - used for channel-specific configuration - ); - - /** - * Constructor. - * - * @param string file to read user-defined options from - * @param string file to read system-wide defaults from - * @param bool determines whether a registry object "follows" - * the value of php_dir (is automatically created - * and moved when php_dir is changed) - * @param bool if true, fails if configuration files cannot be loaded - * - * @access public - * - * @see PEAR_Config::singleton - */ - function PEAR_Config($user_file = '', $system_file = '', $ftp_file = false, - $strict = true) - { - $this->PEAR(); - PEAR_Installer_Role::initializeConfig($this); - $sl = DIRECTORY_SEPARATOR; - if (empty($user_file)) { - if (OS_WINDOWS) { - $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; - } else { - $user_file = getenv('HOME') . $sl . '.pearrc'; - } - } - - if (empty($system_file)) { - $system_file = PEAR_CONFIG_SYSCONFDIR . $sl; - if (OS_WINDOWS) { - $system_file .= 'pearsys.ini'; - } else { - $system_file .= 'pear.conf'; - } - } - - $this->layers = array_keys($this->configuration); - $this->files['user'] = $user_file; - $this->files['system'] = $system_file; - if ($user_file && file_exists($user_file)) { - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $this->readConfigFile($user_file, 'user', $strict); - $this->popErrorHandling(); - if ($this->_errorsFound > 0) { - return; - } - } - - if ($system_file && @file_exists($system_file)) { - $this->mergeConfigFile($system_file, false, 'system', $strict); - if ($this->_errorsFound > 0) { - return; - } - - } - - if (!$ftp_file) { - $ftp_file = $this->get('remote_config'); - } - - if ($ftp_file && defined('PEAR_REMOTEINSTALL_OK')) { - $this->readFTPConfigFile($ftp_file); - } - - foreach ($this->configuration_info as $key => $info) { - $this->configuration['default'][$key] = $info['default']; - } - - $this->_registry['default'] = &new PEAR_Registry($this->configuration['default']['php_dir']); - $this->_registry['default']->setConfig($this, false); - $this->_regInitialized['default'] = false; - //$GLOBALS['_PEAR_Config_instance'] = &$this; - } - - /** - * Return the default locations of user and system configuration files - * @static - */ - function getDefaultConfigFiles() - { - $sl = DIRECTORY_SEPARATOR; - if (OS_WINDOWS) { - return array( - 'user' => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini', - 'system' => PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini' - ); - } - - return array( - 'user' => getenv('HOME') . $sl . '.pearrc', - 'system' => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf' - ); - } - - /** - * Static singleton method. If you want to keep only one instance - * of this class in use, this method will give you a reference to - * the last created PEAR_Config object if one exists, or create a - * new object. - * - * @param string (optional) file to read user-defined options from - * @param string (optional) file to read system-wide defaults from - * - * @return object an existing or new PEAR_Config instance - * - * @access public - * - * @see PEAR_Config::PEAR_Config - */ - function &singleton($user_file = '', $system_file = '', $strict = true) - { - if (is_object($GLOBALS['_PEAR_Config_instance'])) { - return $GLOBALS['_PEAR_Config_instance']; - } - - $t_conf = &new PEAR_Config($user_file, $system_file, false, $strict); - if ($t_conf->_errorsFound > 0) { - return $t_conf->lastError; - } - - $GLOBALS['_PEAR_Config_instance'] = &$t_conf; - return $GLOBALS['_PEAR_Config_instance']; - } - - /** - * Determine whether any configuration files have been detected, and whether a - * registry object can be retrieved from this configuration. - * @return bool - * @since PEAR 1.4.0a1 - */ - function validConfiguration() - { - if ($this->isDefinedLayer('user') || $this->isDefinedLayer('system')) { - return true; - } - - return false; - } - - /** - * Reads configuration data from a file. All existing values in - * the config layer are discarded and replaced with data from the - * file. - * @param string file to read from, if NULL or not specified, the - * last-used file for the same layer (second param) is used - * @param string config layer to insert data into ('user' or 'system') - * @return bool TRUE on success or a PEAR error on failure - */ - function readConfigFile($file = null, $layer = 'user', $strict = true) - { - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config layer `$layer'"); - } - - if ($file === null) { - $file = $this->files[$layer]; - } - - $data = $this->_readConfigDataFrom($file); - if (PEAR::isError($data)) { - if (!$strict) { - return true; - } - - $this->_errorsFound++; - $this->lastError = $data; - - return $data; - } - - $this->files[$layer] = $file; - $this->_decodeInput($data); - $this->configuration[$layer] = $data; - $this->_setupChannels(); - if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) { - $this->_registry[$layer] = &new PEAR_Registry($phpdir); - $this->_registry[$layer]->setConfig($this, false); - $this->_regInitialized[$layer] = false; - } else { - unset($this->_registry[$layer]); - } - return true; - } - - /** - * @param string url to the remote config file, like ftp://www.example.com/pear/config.ini - * @return true|PEAR_Error - */ - function readFTPConfigFile($path) - { - do { // poor man's try - if (!class_exists('PEAR_FTP')) { - if (!class_exists('PEAR_Common')) { - require_once 'PEAR/Common.php'; - } - if (PEAR_Common::isIncludeable('PEAR/FTP.php')) { - require_once 'PEAR/FTP.php'; - } - } - - if (!class_exists('PEAR_FTP')) { - return PEAR::raiseError('PEAR_RemoteInstaller must be installed to use remote config'); - } - - $this->_ftp = &new PEAR_FTP; - $this->_ftp->pushErrorHandling(PEAR_ERROR_RETURN); - $e = $this->_ftp->init($path); - if (PEAR::isError($e)) { - $this->_ftp->popErrorHandling(); - return $e; - } - - $tmp = System::mktemp('-d'); - PEAR_Common::addTempFile($tmp); - $e = $this->_ftp->get(basename($path), $tmp . DIRECTORY_SEPARATOR . - 'pear.ini', false, FTP_BINARY); - if (PEAR::isError($e)) { - $this->_ftp->popErrorHandling(); - return $e; - } - - PEAR_Common::addTempFile($tmp . DIRECTORY_SEPARATOR . 'pear.ini'); - $this->_ftp->disconnect(); - $this->_ftp->popErrorHandling(); - $this->files['ftp'] = $tmp . DIRECTORY_SEPARATOR . 'pear.ini'; - $e = $this->readConfigFile(null, 'ftp'); - if (PEAR::isError($e)) { - return $e; - } - - $fail = array(); - foreach ($this->configuration_info as $key => $val) { - if (in_array($this->getGroup($key), - array('File Locations', 'File Locations (Advanced)')) && - $this->getType($key) == 'directory') { - // any directory configs must be set for this to work - if (!isset($this->configuration['ftp'][$key])) { - $fail[] = $key; - } - } - } - - if (!count($fail)) { - return true; - } - - $fail = '"' . implode('", "', $fail) . '"'; - unset($this->files['ftp']); - unset($this->configuration['ftp']); - return PEAR::raiseError('ERROR: Ftp configuration file must set all ' . - 'directory configuration variables. These variables were not set: ' . - $fail); - } while (false); // poor man's catch - unset($this->files['ftp']); - return PEAR::raiseError('no remote host specified'); - } - - /** - * Reads the existing configurations and creates the _channels array from it - */ - function _setupChannels() - { - $set = array_flip(array_values($this->_channels)); - foreach ($this->configuration as $layer => $data) { - $i = 1000; - if (isset($data['__channels']) && is_array($data['__channels'])) { - foreach ($data['__channels'] as $channel => $info) { - $set[$channel] = $i++; - } - } - } - $this->_channels = array_values(array_flip($set)); - $this->setChannels($this->_channels); - } - - function deleteChannel($channel) - { - $ch = strtolower($channel); - foreach ($this->configuration as $layer => $data) { - if (isset($data['__channels']) && isset($data['__channels'][$ch])) { - unset($this->configuration[$layer]['__channels'][$ch]); - } - } - - $this->_channels = array_flip($this->_channels); - unset($this->_channels[$ch]); - $this->_channels = array_flip($this->_channels); - } - - /** - * Merges data into a config layer from a file. Does the same - * thing as readConfigFile, except it does not replace all - * existing values in the config layer. - * @param string file to read from - * @param bool whether to overwrite existing data (default TRUE) - * @param string config layer to insert data into ('user' or 'system') - * @param string if true, errors are returned if file opening fails - * @return bool TRUE on success or a PEAR error on failure - */ - function mergeConfigFile($file, $override = true, $layer = 'user', $strict = true) - { - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config layer `$layer'"); - } - - if ($file === null) { - $file = $this->files[$layer]; - } - - $data = $this->_readConfigDataFrom($file); - if (PEAR::isError($data)) { - if (!$strict) { - return true; - } - - $this->_errorsFound++; - $this->lastError = $data; - - return $data; - } - - $this->_decodeInput($data); - if ($override) { - $this->configuration[$layer] = - PEAR_Config::arrayMergeRecursive($this->configuration[$layer], $data); - } else { - $this->configuration[$layer] = - PEAR_Config::arrayMergeRecursive($data, $this->configuration[$layer]); - } - - $this->_setupChannels(); - if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) { - $this->_registry[$layer] = &new PEAR_Registry($phpdir); - $this->_registry[$layer]->setConfig($this, false); - $this->_regInitialized[$layer] = false; - } else { - unset($this->_registry[$layer]); - } - return true; - } - - /** - * @param array - * @param array - * @return array - * @static - */ - function arrayMergeRecursive($arr2, $arr1) - { - $ret = array(); - foreach ($arr2 as $key => $data) { - if (!isset($arr1[$key])) { - $ret[$key] = $data; - unset($arr1[$key]); - continue; - } - if (is_array($data)) { - if (!is_array($arr1[$key])) { - $ret[$key] = $arr1[$key]; - unset($arr1[$key]); - continue; - } - $ret[$key] = PEAR_Config::arrayMergeRecursive($arr1[$key], $arr2[$key]); - unset($arr1[$key]); - } - } - - return array_merge($ret, $arr1); - } - - /** - * Writes data into a config layer from a file. - * - * @param string|null file to read from, or null for default - * @param string config layer to insert data into ('user' or - * 'system') - * @param string|null data to write to config file or null for internal data [DEPRECATED] - * @return bool TRUE on success or a PEAR error on failure - */ - function writeConfigFile($file = null, $layer = 'user', $data = null) - { - $this->_lazyChannelSetup($layer); - if ($layer == 'both' || $layer == 'all') { - foreach ($this->files as $type => $file) { - $err = $this->writeConfigFile($file, $type, $data); - if (PEAR::isError($err)) { - return $err; - } - } - return true; - } - - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config file type `$layer'"); - } - - if ($file === null) { - $file = $this->files[$layer]; - } - - $data = ($data === null) ? $this->configuration[$layer] : $data; - $this->_encodeOutput($data); - $opt = array('-p', dirname($file)); - if (!@System::mkDir($opt)) { - return $this->raiseError("could not create directory: " . dirname($file)); - } - - if (file_exists($file) && is_file($file) && !is_writeable($file)) { - return $this->raiseError("no write access to $file!"); - } - - $fp = @fopen($file, "w"); - if (!$fp) { - return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed ($php_errormsg)"); - } - - $contents = "#PEAR_Config 0.9\n" . serialize($data); - if (!@fwrite($fp, $contents)) { - return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed ($php_errormsg)"); - } - return true; - } - - /** - * Reads configuration data from a file and returns the parsed data - * in an array. - * - * @param string file to read from - * @return array configuration data or a PEAR error on failure - * @access private - */ - function _readConfigDataFrom($file) - { - $fp = false; - if (file_exists($file)) { - $fp = @fopen($file, "r"); - } - - if (!$fp) { - return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed"); - } - - $size = filesize($file); - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - fclose($fp); - $contents = file_get_contents($file); - if (empty($contents)) { - return $this->raiseError('Configuration file "' . $file . '" is empty'); - } - - set_magic_quotes_runtime($rt); - - $version = false; - if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) { - $version = $matches[1]; - $contents = substr($contents, strlen($matches[0])); - } else { - // Museum config file - if (substr($contents,0,2) == 'a:') { - $version = '0.1'; - } - } - - if ($version && version_compare("$version", '1', '<')) { - // no '@', it is possible that unserialize - // raises a notice but it seems to block IO to - // STDOUT if a '@' is used and a notice is raise - $data = unserialize($contents); - - if (!is_array($data) && !$data) { - if ($contents == serialize(false)) { - $data = array(); - } else { - $err = $this->raiseError("PEAR_Config: bad data in $file"); - return $err; - } - } - if (!is_array($data)) { - if (strlen(trim($contents)) > 0) { - $error = "PEAR_Config: bad data in $file"; - $err = $this->raiseError($error); - return $err; - } - - $data = array(); - } - // add parsing of newer formats here... - } else { - $err = $this->raiseError("$file: unknown version `$version'"); - return $err; - } - - return $data; - } - - /** - * Gets the file used for storing the config for a layer - * - * @param string $layer 'user' or 'system' - */ - function getConfFile($layer) - { - return $this->files[$layer]; - } - - /** - * @param string Configuration class name, used for detecting duplicate calls - * @param array information on a role as parsed from its xml file - * @return true|PEAR_Error - * @access private - */ - function _addConfigVars($class, $vars) - { - static $called = array(); - if (isset($called[$class])) { - return; - } - - $called[$class] = 1; - if (count($vars) > 3) { - return $this->raiseError('Roles can only define 3 new config variables or less'); - } - - foreach ($vars as $name => $var) { - if (!is_array($var)) { - return $this->raiseError('Configuration information must be an array'); - } - - if (!isset($var['type'])) { - return $this->raiseError('Configuration information must contain a type'); - } elseif (!in_array($var['type'], - array('string', 'mask', 'password', 'directory', 'file', 'set'))) { - return $this->raiseError( - 'Configuration type must be one of directory, file, string, ' . - 'mask, set, or password'); - } - if (!isset($var['default'])) { - return $this->raiseError( - 'Configuration information must contain a default value ("default" index)'); - } - - if (is_array($var['default'])) { - $real_default = ''; - foreach ($var['default'] as $config_var => $val) { - if (strpos($config_var, 'text') === 0) { - $real_default .= $val; - } elseif (strpos($config_var, 'constant') === 0) { - if (!defined($val)) { - return $this->raiseError( - 'Unknown constant "' . $val . '" requested in ' . - 'default value for configuration variable "' . - $name . '"'); - } - - $real_default .= constant($val); - } elseif (isset($this->configuration_info[$config_var])) { - $real_default .= - $this->configuration_info[$config_var]['default']; - } else { - return $this->raiseError( - 'Unknown request for "' . $config_var . '" value in ' . - 'default value for configuration variable "' . - $name . '"'); - } - } - $var['default'] = $real_default; - } - - if ($var['type'] == 'integer') { - $var['default'] = (integer) $var['default']; - } - - if (!isset($var['doc'])) { - return $this->raiseError( - 'Configuration information must contain a summary ("doc" index)'); - } - - if (!isset($var['prompt'])) { - return $this->raiseError( - 'Configuration information must contain a simple prompt ("prompt" index)'); - } - - if (!isset($var['group'])) { - return $this->raiseError( - 'Configuration information must contain a simple group ("group" index)'); - } - - if (isset($this->configuration_info[$name])) { - return $this->raiseError('Configuration variable "' . $name . - '" already exists'); - } - - $this->configuration_info[$name] = $var; - // fix bug #7351: setting custom config variable in a channel fails - $this->_channelConfigInfo[] = $name; - } - - return true; - } - - /** - * Encodes/scrambles configuration data before writing to files. - * Currently, 'password' values will be base64-encoded as to avoid - * that people spot cleartext passwords by accident. - * - * @param array (reference) array to encode values in - * @return bool TRUE on success - * @access private - */ - function _encodeOutput(&$data) - { - foreach ($data as $key => $value) { - if ($key == '__channels') { - foreach ($data['__channels'] as $channel => $blah) { - $this->_encodeOutput($data['__channels'][$channel]); - } - } - - if (!isset($this->configuration_info[$key])) { - continue; - } - - $type = $this->configuration_info[$key]['type']; - switch ($type) { - // we base64-encode passwords so they are at least - // not shown in plain by accident - case 'password': { - $data[$key] = base64_encode($data[$key]); - break; - } - case 'mask': { - $data[$key] = octdec($data[$key]); - break; - } - } - } - - return true; - } - - /** - * Decodes/unscrambles configuration data after reading from files. - * - * @param array (reference) array to encode values in - * @return bool TRUE on success - * @access private - * - * @see PEAR_Config::_encodeOutput - */ - function _decodeInput(&$data) - { - if (!is_array($data)) { - return true; - } - - foreach ($data as $key => $value) { - if ($key == '__channels') { - foreach ($data['__channels'] as $channel => $blah) { - $this->_decodeInput($data['__channels'][$channel]); - } - } - - if (!isset($this->configuration_info[$key])) { - continue; - } - - $type = $this->configuration_info[$key]['type']; - switch ($type) { - case 'password': { - $data[$key] = base64_decode($data[$key]); - break; - } - case 'mask': { - $data[$key] = decoct($data[$key]); - break; - } - } - } - - return true; - } - - /** - * Retrieve the default channel. - * - * On startup, channels are not initialized, so if the default channel is not - * pear.php.net, then initialize the config. - * @param string registry layer - * @return string|false - */ - function getDefaultChannel($layer = null) - { - $ret = false; - if ($layer === null) { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer]['default_channel'])) { - $ret = $this->configuration[$layer]['default_channel']; - break; - } - } - } elseif (isset($this->configuration[$layer]['default_channel'])) { - $ret = $this->configuration[$layer]['default_channel']; - } - - if ($ret == 'pear.php.net' && defined('PEAR_RUNTYPE') && PEAR_RUNTYPE == 'pecl') { - $ret = 'pecl.php.net'; - } - - if ($ret) { - if ($ret != 'pear.php.net') { - $this->_lazyChannelSetup(); - } - - return $ret; - } - - return PEAR_CONFIG_DEFAULT_CHANNEL; - } - - /** - * Returns a configuration value, prioritizing layers as per the - * layers property. - * - * @param string config key - * @return mixed the config value, or NULL if not found - * @access public - */ - function get($key, $layer = null, $channel = false) - { - if (!isset($this->configuration_info[$key])) { - return null; - } - - if ($key == '__channels') { - return null; - } - - if ($key == 'default_channel') { - return $this->getDefaultChannel($layer); - } - - if (!$channel) { - $channel = $this->getDefaultChannel(); - } elseif ($channel != 'pear.php.net') { - $this->_lazyChannelSetup(); - } - $channel = strtolower($channel); - - $test = (in_array($key, $this->_channelConfigInfo)) ? - $this->_getChannelValue($key, $layer, $channel) : - null; - if ($test !== null) { - if ($this->_installRoot) { - if (in_array($this->getGroup($key), - array('File Locations', 'File Locations (Advanced)')) && - $this->getType($key) == 'directory') { - return $this->_prependPath($test, $this->_installRoot); - } - } - return $test; - } - - if ($layer === null) { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer][$key])) { - $test = $this->configuration[$layer][$key]; - if ($this->_installRoot) { - if (in_array($this->getGroup($key), - array('File Locations', 'File Locations (Advanced)')) && - $this->getType($key) == 'directory') { - return $this->_prependPath($test, $this->_installRoot); - } - } - - if ($key == 'preferred_mirror') { - $reg = &$this->getRegistry(); - if (is_object($reg)) { - $chan = &$reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $channel; - } - - if (!$chan->getMirror($test) && $chan->getName() != $test) { - return $channel; // mirror does not exist - } - } - } - return $test; - } - } - } elseif (isset($this->configuration[$layer][$key])) { - $test = $this->configuration[$layer][$key]; - if ($this->_installRoot) { - if (in_array($this->getGroup($key), - array('File Locations', 'File Locations (Advanced)')) && - $this->getType($key) == 'directory') { - return $this->_prependPath($test, $this->_installRoot); - } - } - - if ($key == 'preferred_mirror') { - $reg = &$this->getRegistry(); - if (is_object($reg)) { - $chan = &$reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $channel; - } - - if (!$chan->getMirror($test) && $chan->getName() != $test) { - return $channel; // mirror does not exist - } - } - } - - return $test; - } - - return null; - } - - /** - * Returns a channel-specific configuration value, prioritizing layers as per the - * layers property. - * - * @param string config key - * @return mixed the config value, or NULL if not found - * @access private - */ - function _getChannelValue($key, $layer, $channel) - { - if ($key == '__channels' || $channel == 'pear.php.net') { - return null; - } - - $ret = null; - if ($layer === null) { - foreach ($this->layers as $ilayer) { - if (isset($this->configuration[$ilayer]['__channels'][$channel][$key])) { - $ret = $this->configuration[$ilayer]['__channels'][$channel][$key]; - break; - } - } - } elseif (isset($this->configuration[$layer]['__channels'][$channel][$key])) { - $ret = $this->configuration[$layer]['__channels'][$channel][$key]; - } - - if ($key != 'preferred_mirror') { - return $ret; - } - - - if ($ret !== null) { - $reg = &$this->getRegistry($layer); - if (is_object($reg)) { - $chan = &$reg->getChannel($channel); - if (PEAR::isError($chan)) { - return $channel; - } - - if (!$chan->getMirror($ret) && $chan->getName() != $ret) { - return $channel; // mirror does not exist - } - } - - return $ret; - } - - if ($channel != $this->getDefaultChannel($layer)) { - return $channel; // we must use the channel name as the preferred mirror - // if the user has not chosen an alternate - } - - return $this->getDefaultChannel($layer); - } - - /** - * Set a config value in a specific layer (defaults to 'user'). - * Enforces the types defined in the configuration_info array. An - * integer config variable will be cast to int, and a set config - * variable will be validated against its legal values. - * - * @param string config key - * @param string config value - * @param string (optional) config layer - * @param string channel to set this value for, or null for global value - * @return bool TRUE on success, FALSE on failure - */ - function set($key, $value, $layer = 'user', $channel = false) - { - if ($key == '__channels') { - return false; - } - - if (!isset($this->configuration[$layer])) { - return false; - } - - if ($key == 'default_channel') { - // can only set this value globally - $channel = 'pear.php.net'; - if ($value != 'pear.php.net') { - $this->_lazyChannelSetup($layer); - } - } - - if ($key == 'preferred_mirror') { - if ($channel == '__uri') { - return false; // can't set the __uri pseudo-channel's mirror - } - - $reg = &$this->getRegistry($layer); - if (is_object($reg)) { - $chan = &$reg->getChannel($channel ? $channel : 'pear.php.net'); - if (PEAR::isError($chan)) { - return false; - } - - if (!$chan->getMirror($value) && $chan->getName() != $value) { - return false; // mirror does not exist - } - } - } - - if (!isset($this->configuration_info[$key])) { - return false; - } - - extract($this->configuration_info[$key]); - switch ($type) { - case 'integer': - $value = (int)$value; - break; - case 'set': { - // If a valid_set is specified, require the value to - // be in the set. If there is no valid_set, accept - // any value. - if ($valid_set) { - reset($valid_set); - if ((key($valid_set) === 0 && !in_array($value, $valid_set)) || - (key($valid_set) !== 0 && empty($valid_set[$value]))) - { - return false; - } - } - break; - } - } - - if (!$channel) { - $channel = $this->get('default_channel', null, 'pear.php.net'); - } - - if (!in_array($channel, $this->_channels)) { - $this->_lazyChannelSetup($layer); - $reg = &$this->getRegistry($layer); - if ($reg) { - $channel = $reg->channelName($channel); - } - - if (!in_array($channel, $this->_channels)) { - return false; - } - } - - if ($channel != 'pear.php.net') { - if (in_array($key, $this->_channelConfigInfo)) { - $this->configuration[$layer]['__channels'][$channel][$key] = $value; - return true; - } - - return false; - } - - if ($key == 'default_channel') { - if (!isset($reg)) { - $reg = &$this->getRegistry($layer); - if (!$reg) { - $reg = &$this->getRegistry(); - } - } - - if ($reg) { - $value = $reg->channelName($value); - } - - if (!$value) { - return false; - } - } - - $this->configuration[$layer][$key] = $value; - if ($key == 'php_dir' && !$this->_noRegistry) { - if (!isset($this->_registry[$layer]) || - $value != $this->_registry[$layer]->install_dir) { - $this->_registry[$layer] = &new PEAR_Registry($value); - $this->_regInitialized[$layer] = false; - $this->_registry[$layer]->setConfig($this, false); - } - } - - return true; - } - - function _lazyChannelSetup($uselayer = false) - { - if ($this->_noRegistry) { - return; - } - - $merge = false; - foreach ($this->_registry as $layer => $p) { - if ($uselayer && $uselayer != $layer) { - continue; - } - - if (!$this->_regInitialized[$layer]) { - if ($layer == 'default' && isset($this->_registry['user']) || - isset($this->_registry['system'])) { - // only use the default registry if there are no alternatives - continue; - } - - if (!is_object($this->_registry[$layer])) { - if ($phpdir = $this->get('php_dir', $layer, 'pear.php.net')) { - $this->_registry[$layer] = &new PEAR_Registry($phpdir); - $this->_registry[$layer]->setConfig($this, false); - $this->_regInitialized[$layer] = false; - } else { - unset($this->_registry[$layer]); - return; - } - } - - $this->setChannels($this->_registry[$layer]->listChannels(), $merge); - $this->_regInitialized[$layer] = true; - $merge = true; - } - } - } - - /** - * Set the list of channels. - * - * This should be set via a call to {@link PEAR_Registry::listChannels()} - * @param array - * @param bool - * @return bool success of operation - */ - function setChannels($channels, $merge = false) - { - if (!is_array($channels)) { - return false; - } - - if ($merge) { - $this->_channels = array_merge($this->_channels, $channels); - } else { - $this->_channels = $channels; - } - - foreach ($channels as $channel) { - $channel = strtolower($channel); - if ($channel == 'pear.php.net') { - continue; - } - - foreach ($this->layers as $layer) { - if (!isset($this->configuration[$layer]['__channels'])) { - $this->configuration[$layer]['__channels'] = array(); - } - if (!isset($this->configuration[$layer]['__channels'][$channel]) - || !is_array($this->configuration[$layer]['__channels'][$channel])) { - $this->configuration[$layer]['__channels'][$channel] = array(); - } - } - } - - return true; - } - - /** - * Get the type of a config value. - * - * @param string config key - * - * @return string type, one of "string", "integer", "file", - * "directory", "set" or "password". - * - * @access public - * - */ - function getType($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['type']; - } - return false; - } - - /** - * Get the documentation for a config value. - * - * @param string config key - * @return string documentation string - * - * @access public - * - */ - function getDocs($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['doc']; - } - - return false; - } - - /** - * Get the short documentation for a config value. - * - * @param string config key - * @return string short documentation string - * - * @access public - * - */ - function getPrompt($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['prompt']; - } - - return false; - } - - /** - * Get the parameter group for a config key. - * - * @param string config key - * @return string parameter group - * - * @access public - * - */ - function getGroup($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['group']; - } - - return false; - } - - /** - * Get the list of parameter groups. - * - * @return array list of parameter groups - * - * @access public - * - */ - function getGroups() - { - $tmp = array(); - foreach ($this->configuration_info as $key => $info) { - $tmp[$info['group']] = 1; - } - - return array_keys($tmp); - } - - /** - * Get the list of the parameters in a group. - * - * @param string $group parameter group - * @return array list of parameters in $group - * - * @access public - * - */ - function getGroupKeys($group) - { - $keys = array(); - foreach ($this->configuration_info as $key => $info) { - if ($info['group'] == $group) { - $keys[] = $key; - } - } - - return $keys; - } - - /** - * Get the list of allowed set values for a config value. Returns - * NULL for config values that are not sets. - * - * @param string config key - * @return array enumerated array of set values, or NULL if the - * config key is unknown or not a set - * - * @access public - * - */ - function getSetValues($key) - { - if (isset($this->configuration_info[$key]) && - isset($this->configuration_info[$key]['type']) && - $this->configuration_info[$key]['type'] == 'set') - { - $valid_set = $this->configuration_info[$key]['valid_set']; - reset($valid_set); - if (key($valid_set) === 0) { - return $valid_set; - } - - return array_keys($valid_set); - } - - return null; - } - - /** - * Get all the current config keys. - * - * @return array simple array of config keys - * - * @access public - */ - function getKeys() - { - $keys = array(); - foreach ($this->layers as $layer) { - $test = $this->configuration[$layer]; - if (isset($test['__channels'])) { - foreach ($test['__channels'] as $channel => $configs) { - $keys = array_merge($keys, $configs); - } - } - - unset($test['__channels']); - $keys = array_merge($keys, $test); - - } - return array_keys($keys); - } - - /** - * Remove the a config key from a specific config layer. - * - * @param string config key - * @param string (optional) config layer - * @param string (optional) channel (defaults to default channel) - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function remove($key, $layer = 'user', $channel = null) - { - if ($channel === null) { - $channel = $this->getDefaultChannel(); - } - - if ($channel !== 'pear.php.net') { - if (isset($this->configuration[$layer]['__channels'][$channel][$key])) { - unset($this->configuration[$layer]['__channels'][$channel][$key]); - return true; - } - } - - if (isset($this->configuration[$layer][$key])) { - unset($this->configuration[$layer][$key]); - return true; - } - - return false; - } - - /** - * Temporarily remove an entire config layer. USE WITH CARE! - * - * @param string config key - * @param string (optional) config layer - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function removeLayer($layer) - { - if (isset($this->configuration[$layer])) { - $this->configuration[$layer] = array(); - return true; - } - - return false; - } - - /** - * Stores configuration data in a layer. - * - * @param string config layer to store - * @return bool TRUE on success, or PEAR error on failure - * - * @access public - */ - function store($layer = 'user', $data = null) - { - return $this->writeConfigFile(null, $layer, $data); - } - - /** - * Tells what config layer that gets to define a key. - * - * @param string config key - * @param boolean return the defining channel - * - * @return string|array the config layer, or an empty string if not found. - * - * if $returnchannel, the return is an array array('layer' => layername, - * 'channel' => channelname), or an empty string if not found - * - * @access public - */ - function definedBy($key, $returnchannel = false) - { - foreach ($this->layers as $layer) { - $channel = $this->getDefaultChannel(); - if ($channel !== 'pear.php.net') { - if (isset($this->configuration[$layer]['__channels'][$channel][$key])) { - if ($returnchannel) { - return array('layer' => $layer, 'channel' => $channel); - } - return $layer; - } - } - - if (isset($this->configuration[$layer][$key])) { - if ($returnchannel) { - return array('layer' => $layer, 'channel' => 'pear.php.net'); - } - return $layer; - } - } - - return ''; - } - - /** - * Tells whether a given key exists as a config value. - * - * @param string config key - * @return bool whether exists in this object - * - * @access public - */ - function isDefined($key) - { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer][$key])) { - return true; - } - } - - return false; - } - - /** - * Tells whether a given config layer exists. - * - * @param string config layer - * @return bool whether exists in this object - * - * @access public - */ - function isDefinedLayer($layer) - { - return isset($this->configuration[$layer]); - } - - /** - * Returns the layers defined (except the 'default' one) - * - * @return array of the defined layers - */ - function getLayers() - { - $cf = $this->configuration; - unset($cf['default']); - return array_keys($cf); - } - - function apiVersion() - { - return '1.1'; - } - - /** - * @return PEAR_Registry - */ - function &getRegistry($use = null) - { - $layer = $use === null ? 'user' : $use; - if (isset($this->_registry[$layer])) { - return $this->_registry[$layer]; - } elseif ($use === null && isset($this->_registry['system'])) { - return $this->_registry['system']; - } elseif ($use === null && isset($this->_registry['default'])) { - return $this->_registry['default']; - } elseif ($use) { - $a = false; - return $a; - } - - // only go here if null was passed in - echo "CRITICAL ERROR: Registry could not be initialized from any value"; - exit(1); - } - - /** - * This is to allow customization like the use of installroot - * @param PEAR_Registry - * @return bool - */ - function setRegistry(&$reg, $layer = 'user') - { - if ($this->_noRegistry) { - return false; - } - - if (!in_array($layer, array('user', 'system'))) { - return false; - } - - $this->_registry[$layer] = &$reg; - if (is_object($reg)) { - $this->_registry[$layer]->setConfig($this, false); - } - - return true; - } - - function noRegistry() - { - $this->_noRegistry = true; - } - - /** - * @return PEAR_REST - */ - function &getREST($version, $options = array()) - { - $version = str_replace('.', '', $version); - if (!class_exists($class = 'PEAR_REST_' . $version)) { - require_once 'PEAR/REST/' . $version . '.php'; - } - - $remote = &new $class($this, $options); - return $remote; - } - - /** - * The ftp server is set in {@link readFTPConfigFile()}. It exists only if a - * remote configuration file has been specified - * @return PEAR_FTP|false - */ - function &getFTP() - { - if (isset($this->_ftp)) { - return $this->_ftp; - } - - $a = false; - return $a; - } - - function _prependPath($path, $prepend) - { - if (strlen($prepend) > 0) { - if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) { - if (preg_match('/^[a-z]:/i', $prepend)) { - $prepend = substr($prepend, 2); - } elseif ($prepend{0} != '\\') { - $prepend = "\\$prepend"; - } - $path = substr($path, 0, 2) . $prepend . substr($path, 2); - } else { - $path = $prepend . $path; - } - } - return $path; - } - - /** - * @param string|false installation directory to prepend to all _dir variables, or false to - * disable - */ - function setInstallRoot($root) - { - if (substr($root, -1) == DIRECTORY_SEPARATOR) { - $root = substr($root, 0, -1); - } - $old = $this->_installRoot; - $this->_installRoot = $root; - if (($old != $root) && !$this->_noRegistry) { - foreach (array_keys($this->_registry) as $layer) { - if ($layer == 'ftp' || !isset($this->_registry[$layer])) { - continue; - } - $this->_registry[$layer] = - &new PEAR_Registry($this->get('php_dir', $layer, 'pear.php.net')); - $this->_registry[$layer]->setConfig($this, false); - $this->_regInitialized[$layer] = false; - } - } - } -} diff --git a/3rdparty/PEAR/Dependency.php b/3rdparty/PEAR/Dependency.php deleted file mode 100644 index 705167aa70..0000000000 --- a/3rdparty/PEAR/Dependency.php +++ /dev/null @@ -1,487 +0,0 @@ - | -// | Stig Bakken | -// +----------------------------------------------------------------------+ -// -// $Id: Dependency.php,v 1.36.4.1 2004/12/27 07:04:19 cellog Exp $ - -require_once "PEAR.php"; - -define('PEAR_DEPENDENCY_MISSING', -1); -define('PEAR_DEPENDENCY_CONFLICT', -2); -define('PEAR_DEPENDENCY_UPGRADE_MINOR', -3); -define('PEAR_DEPENDENCY_UPGRADE_MAJOR', -4); -define('PEAR_DEPENDENCY_BAD_DEPENDENCY', -5); -define('PEAR_DEPENDENCY_MISSING_OPTIONAL', -6); -define('PEAR_DEPENDENCY_CONFLICT_OPTIONAL', -7); -define('PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL', -8); -define('PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL', -9); - -/** - * Dependency check for PEAR packages - * - * The class is based on the dependency RFC that can be found at - * http://cvs.php.net/cvs.php/pearweb/rfc. It requires PHP >= 4.1 - * - * @author Tomas V.V.Vox - * @author Stig Bakken - */ -class PEAR_Dependency -{ - // {{{ constructor - /** - * Constructor - * - * @access public - * @param object Registry object - * @return void - */ - function PEAR_Dependency(&$registry) - { - $this->registry = &$registry; - } - - // }}} - // {{{ callCheckMethod() - - /** - * This method maps the XML dependency definition to the - * corresponding one from PEAR_Dependency - * - *
    -    * $opts => Array
    -    *    (
    -    *        [type] => pkg
    -    *        [rel] => ge
    -    *        [version] => 3.4
    -    *        [name] => HTML_Common
    -    *        [optional] => false
    -    *    )
    -    * 
    - * - * @param string Error message - * @param array Options - * @return boolean - */ - function callCheckMethod(&$errmsg, $opts) - { - $rel = isset($opts['rel']) ? $opts['rel'] : 'has'; - $req = isset($opts['version']) ? $opts['version'] : null; - $name = isset($opts['name']) ? $opts['name'] : null; - $opt = (isset($opts['optional']) && $opts['optional'] == 'yes') ? - $opts['optional'] : null; - $errmsg = ''; - switch ($opts['type']) { - case 'pkg': - return $this->checkPackage($errmsg, $name, $req, $rel, $opt); - break; - case 'ext': - return $this->checkExtension($errmsg, $name, $req, $rel, $opt); - break; - case 'php': - return $this->checkPHP($errmsg, $req, $rel); - break; - case 'prog': - return $this->checkProgram($errmsg, $name); - break; - case 'os': - return $this->checkOS($errmsg, $name); - break; - case 'sapi': - return $this->checkSAPI($errmsg, $name); - break; - case 'zend': - return $this->checkZend($errmsg, $name); - break; - default: - return "'{$opts['type']}' dependency type not supported"; - } - } - - // }}} - // {{{ checkPackage() - - /** - * Package dependencies check method - * - * @param string $errmsg Empty string, it will be populated with an error message, if any - * @param string $name Name of the package to test - * @param string $req The package version required - * @param string $relation How to compare versions with each other - * @param bool $opt Whether the relationship is optional - * - * @return mixed bool false if no error or the error string - */ - function checkPackage(&$errmsg, $name, $req = null, $relation = 'has', - $opt = false) - { - if (is_string($req) && substr($req, 0, 2) == 'v.') { - $req = substr($req, 2); - } - switch ($relation) { - case 'has': - if (!$this->registry->packageExists($name)) { - if ($opt) { - $errmsg = "package `$name' is recommended to utilize some features."; - return PEAR_DEPENDENCY_MISSING_OPTIONAL; - } - $errmsg = "requires package `$name'"; - return PEAR_DEPENDENCY_MISSING; - } - return false; - case 'not': - if ($this->registry->packageExists($name)) { - $errmsg = "conflicts with package `$name'"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - case 'lt': - case 'le': - case 'eq': - case 'ne': - case 'ge': - case 'gt': - $version = $this->registry->packageInfo($name, 'version'); - if (!$this->registry->packageExists($name) - || !version_compare("$version", "$req", $relation)) - { - $code = $this->codeFromRelation($relation, $version, $req, $opt); - if ($opt) { - $errmsg = "package `$name' version " . $this->signOperator($relation) . - " $req is recommended to utilize some features."; - if ($version) { - $errmsg .= " Installed version is $version"; - } - return $code; - } - $errmsg = "requires package `$name' " . - $this->signOperator($relation) . " $req"; - return $code; - } - return false; - } - $errmsg = "relation '$relation' with requirement '$req' is not supported (name=$name)"; - return PEAR_DEPENDENCY_BAD_DEPENDENCY; - } - - // }}} - // {{{ checkPackageUninstall() - - /** - * Check package dependencies on uninstall - * - * @param string $error The resultant error string - * @param string $warning The resultant warning string - * @param string $name Name of the package to test - * - * @return bool true if there were errors - */ - function checkPackageUninstall(&$error, &$warning, $package) - { - $error = null; - $packages = $this->registry->listPackages(); - foreach ($packages as $pkg) { - if ($pkg == $package) { - continue; - } - $deps = $this->registry->packageInfo($pkg, 'release_deps'); - if (empty($deps)) { - continue; - } - foreach ($deps as $dep) { - if ($dep['type'] == 'pkg' && strcasecmp($dep['name'], $package) == 0) { - if ($dep['rel'] == 'ne' || $dep['rel'] == 'not') { - continue; - } - if (isset($dep['optional']) && $dep['optional'] == 'yes') { - $warning .= "\nWarning: Package '$pkg' optionally depends on '$package'"; - } else { - $error .= "Package '$pkg' depends on '$package'\n"; - } - } - } - } - return ($error) ? true : false; - } - - // }}} - // {{{ checkExtension() - - /** - * Extension dependencies check method - * - * @param string $name Name of the extension to test - * @param string $req_ext_ver Required extension version to compare with - * @param string $relation How to compare versions with eachother - * @param bool $opt Whether the relationship is optional - * - * @return mixed bool false if no error or the error string - */ - function checkExtension(&$errmsg, $name, $req = null, $relation = 'has', - $opt = false) - { - if ($relation == 'not') { - if (extension_loaded($name)) { - $errmsg = "conflicts with PHP extension '$name'"; - return PEAR_DEPENDENCY_CONFLICT; - } else { - return false; - } - } - - if (!extension_loaded($name)) { - if ($relation == 'not') { - return false; - } - if ($opt) { - $errmsg = "'$name' PHP extension is recommended to utilize some features"; - return PEAR_DEPENDENCY_MISSING_OPTIONAL; - } - $errmsg = "'$name' PHP extension is not installed"; - return PEAR_DEPENDENCY_MISSING; - } - if ($relation == 'has') { - return false; - } - $code = false; - if (is_string($req) && substr($req, 0, 2) == 'v.') { - $req = substr($req, 2); - } - $ext_ver = phpversion($name); - $operator = $relation; - // Force params to be strings, otherwise the comparation will fail (ex. 0.9==0.90) - if (!version_compare("$ext_ver", "$req", $operator)) { - $errmsg = "'$name' PHP extension version " . - $this->signOperator($operator) . " $req is required"; - $code = $this->codeFromRelation($relation, $ext_ver, $req, $opt); - if ($opt) { - $errmsg = "'$name' PHP extension version " . $this->signOperator($operator) . - " $req is recommended to utilize some features"; - return $code; - } - } - return $code; - } - - // }}} - // {{{ checkOS() - - /** - * Operating system dependencies check method - * - * @param string $os Name of the operating system - * - * @return mixed bool false if no error or the error string - */ - function checkOS(&$errmsg, $os) - { - // XXX Fixme: Implement a more flexible way, like - // comma separated values or something similar to PEAR_OS - static $myos; - if (empty($myos)) { - include_once "OS/Guess.php"; - $myos = new OS_Guess(); - } - // only 'has' relation is currently supported - if ($myos->matchSignature($os)) { - return false; - } - $errmsg = "'$os' operating system not supported"; - return PEAR_DEPENDENCY_CONFLICT; - } - - // }}} - // {{{ checkPHP() - - /** - * PHP version check method - * - * @param string $req which version to compare - * @param string $relation how to compare the version - * - * @return mixed bool false if no error or the error string - */ - function checkPHP(&$errmsg, $req, $relation = 'ge') - { - // this would be a bit stupid, but oh well :) - if ($relation == 'has') { - return false; - } - if ($relation == 'not') { - $errmsg = 'Invalid dependency - "not" is not allowed for php dependencies, ' . - 'php cannot conflict with itself'; - return PEAR_DEPENDENCY_BAD_DEPENDENCY; - } - if (substr($req, 0, 2) == 'v.') { - $req = substr($req,2, strlen($req) - 2); - } - $php_ver = phpversion(); - $operator = $relation; - if (!version_compare("$php_ver", "$req", $operator)) { - $errmsg = "PHP version " . $this->signOperator($operator) . - " $req is required"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - } - - // }}} - // {{{ checkProgram() - - /** - * External program check method. Looks for executable files in - * directories listed in the PATH environment variable. - * - * @param string $program which program to look for - * - * @return mixed bool false if no error or the error string - */ - function checkProgram(&$errmsg, $program) - { - // XXX FIXME honor safe mode - $exe_suffix = OS_WINDOWS ? '.exe' : ''; - $path_elements = explode(PATH_SEPARATOR, getenv('PATH')); - foreach ($path_elements as $dir) { - $file = $dir . DIRECTORY_SEPARATOR . $program . $exe_suffix; - if (@file_exists($file) && @is_executable($file)) { - return false; - } - } - $errmsg = "'$program' program is not present in the PATH"; - return PEAR_DEPENDENCY_MISSING; - } - - // }}} - // {{{ checkSAPI() - - /** - * SAPI backend check method. Version comparison is not yet - * available here. - * - * @param string $name name of SAPI backend - * @param string $req which version to compare - * @param string $relation how to compare versions (currently - * hardcoded to 'has') - * @return mixed bool false if no error or the error string - */ - function checkSAPI(&$errmsg, $name, $req = null, $relation = 'has') - { - // XXX Fixme: There is no way to know if the user has or - // not other SAPI backends installed than the installer one - - $sapi_backend = php_sapi_name(); - // Version comparisons not supported, sapi backends don't have - // version information yet. - if ($sapi_backend == $name) { - return false; - } - $errmsg = "'$sapi_backend' SAPI backend not supported"; - return PEAR_DEPENDENCY_CONFLICT; - } - - // }}} - // {{{ checkZend() - - /** - * Zend version check method - * - * @param string $req which version to compare - * @param string $relation how to compare the version - * - * @return mixed bool false if no error or the error string - */ - function checkZend(&$errmsg, $req, $relation = 'ge') - { - if (substr($req, 0, 2) == 'v.') { - $req = substr($req,2, strlen($req) - 2); - } - $zend_ver = zend_version(); - $operator = substr($relation,0,2); - if (!version_compare("$zend_ver", "$req", $operator)) { - $errmsg = "Zend version " . $this->signOperator($operator) . - " $req is required"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - } - - // }}} - // {{{ signOperator() - - /** - * Converts text comparing operators to them sign equivalents - * - * Example: 'ge' to '>=' - * - * @access public - * @param string Operator - * @return string Sign equivalent - */ - function signOperator($operator) - { - switch($operator) { - case 'lt': return '<'; - case 'le': return '<='; - case 'gt': return '>'; - case 'ge': return '>='; - case 'eq': return '=='; - case 'ne': return '!='; - default: - return $operator; - } - } - - // }}} - // {{{ codeFromRelation() - - /** - * Convert relation into corresponding code - * - * @access public - * @param string Relation - * @param string Version - * @param string Requirement - * @param bool Optional dependency indicator - * @return integer - */ - function codeFromRelation($relation, $version, $req, $opt = false) - { - $code = PEAR_DEPENDENCY_BAD_DEPENDENCY; - switch ($relation) { - case 'gt': case 'ge': case 'eq': - // upgrade - $have_major = preg_replace('/\D.*/', '', $version); - $need_major = preg_replace('/\D.*/', '', $req); - if ($need_major > $have_major) { - $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL : - PEAR_DEPENDENCY_UPGRADE_MAJOR; - } else { - $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL : - PEAR_DEPENDENCY_UPGRADE_MINOR; - } - break; - case 'lt': case 'le': case 'ne': - $code = $opt ? PEAR_DEPENDENCY_CONFLICT_OPTIONAL : - PEAR_DEPENDENCY_CONFLICT; - break; - } - return $code; - } - - // }}} -} -?> diff --git a/3rdparty/PEAR/Dependency2.php b/3rdparty/PEAR/Dependency2.php deleted file mode 100644 index f3ddeb1cf1..0000000000 --- a/3rdparty/PEAR/Dependency2.php +++ /dev/null @@ -1,1358 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Dependency2.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Required for the PEAR_VALIDATE_* constants - */ -require_once 'PEAR/Validate.php'; - -/** - * Dependency check for PEAR packages - * - * This class handles both version 1.0 and 2.0 dependencies - * WARNING: *any* changes to this class must be duplicated in the - * test_PEAR_Dependency2 class found in tests/PEAR_Dependency2/setup.php.inc, - * or unit tests will not actually validate the changes - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Dependency2 -{ - /** - * One of the PEAR_VALIDATE_* states - * @see PEAR_VALIDATE_NORMAL - * @var integer - */ - var $_state; - - /** - * Command-line options to install/upgrade/uninstall commands - * @param array - */ - var $_options; - - /** - * @var OS_Guess - */ - var $_os; - - /** - * @var PEAR_Registry - */ - var $_registry; - - /** - * @var PEAR_Config - */ - var $_config; - - /** - * @var PEAR_DependencyDB - */ - var $_dependencydb; - - /** - * Output of PEAR_Registry::parsedPackageName() - * @var array - */ - var $_currentPackage; - - /** - * @param PEAR_Config - * @param array installation options - * @param array format of PEAR_Registry::parsedPackageName() - * @param int installation state (one of PEAR_VALIDATE_*) - */ - function PEAR_Dependency2(&$config, $installoptions, $package, - $state = PEAR_VALIDATE_INSTALLING) - { - $this->_config = &$config; - if (!class_exists('PEAR_DependencyDB')) { - require_once 'PEAR/DependencyDB.php'; - } - - if (isset($installoptions['packagingroot'])) { - // make sure depdb is in the right location - $config->setInstallRoot($installoptions['packagingroot']); - } - - $this->_registry = &$config->getRegistry(); - $this->_dependencydb = &PEAR_DependencyDB::singleton($config); - if (isset($installoptions['packagingroot'])) { - $config->setInstallRoot(false); - } - - $this->_options = $installoptions; - $this->_state = $state; - if (!class_exists('OS_Guess')) { - require_once 'OS/Guess.php'; - } - - $this->_os = new OS_Guess; - $this->_currentPackage = $package; - } - - function _getExtraString($dep) - { - $extra = ' ('; - if (isset($dep['uri'])) { - return ''; - } - - if (isset($dep['recommended'])) { - $extra .= 'recommended version ' . $dep['recommended']; - } else { - if (isset($dep['min'])) { - $extra .= 'version >= ' . $dep['min']; - } - - if (isset($dep['max'])) { - if ($extra != ' (') { - $extra .= ', '; - } - $extra .= 'version <= ' . $dep['max']; - } - - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - - if ($extra != ' (') { - $extra .= ', '; - } - - $extra .= 'excluded versions: '; - foreach ($dep['exclude'] as $i => $exclude) { - if ($i) { - $extra .= ', '; - } - $extra .= $exclude; - } - } - } - - $extra .= ')'; - if ($extra == ' ()') { - $extra = ''; - } - - return $extra; - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function getPHP_OS() - { - return PHP_OS; - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function getsysname() - { - return $this->_os->getSysname(); - } - - /** - * Specify a dependency on an OS. Use arch for detailed os/processor information - * - * There are two generic OS dependencies that will be the most common, unix and windows. - * Other options are linux, freebsd, darwin (OS X), sunos, irix, hpux, aix - */ - function validateOsDependency($dep) - { - if ($this->_state != PEAR_VALIDATE_INSTALLING && $this->_state != PEAR_VALIDATE_DOWNLOADING) { - return true; - } - - if ($dep['name'] == '*') { - return true; - } - - $not = isset($dep['conflicts']) ? true : false; - switch (strtolower($dep['name'])) { - case 'windows' : - if ($not) { - if (strtolower(substr($this->getPHP_OS(), 0, 3)) == 'win') { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError("Cannot install %s on Windows"); - } - - return $this->warning("warning: Cannot install %s on Windows"); - } - } else { - if (strtolower(substr($this->getPHP_OS(), 0, 3)) != 'win') { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError("Can only install %s on Windows"); - } - - return $this->warning("warning: Can only install %s on Windows"); - } - } - break; - case 'unix' : - $unices = array('linux', 'freebsd', 'darwin', 'sunos', 'irix', 'hpux', 'aix'); - if ($not) { - if (in_array($this->getSysname(), $unices)) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError("Cannot install %s on any Unix system"); - } - - return $this->warning( "warning: Cannot install %s on any Unix system"); - } - } else { - if (!in_array($this->getSysname(), $unices)) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError("Can only install %s on a Unix system"); - } - - return $this->warning("warning: Can only install %s on a Unix system"); - } - } - break; - default : - if ($not) { - if (strtolower($dep['name']) == strtolower($this->getSysname())) { - if (!isset($this->_options['nodeps']) && - !isset($this->_options['force'])) { - return $this->raiseError('Cannot install %s on ' . $dep['name'] . - ' operating system'); - } - - return $this->warning('warning: Cannot install %s on ' . - $dep['name'] . ' operating system'); - } - } else { - if (strtolower($dep['name']) != strtolower($this->getSysname())) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('Cannot install %s on ' . - $this->getSysname() . - ' operating system, can only install on ' . $dep['name']); - } - - return $this->warning('warning: Cannot install %s on ' . - $this->getSysname() . - ' operating system, can only install on ' . $dep['name']); - } - } - } - return true; - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function matchSignature($pattern) - { - return $this->_os->matchSignature($pattern); - } - - /** - * Specify a complex dependency on an OS/processor/kernel version, - * Use OS for simple operating system dependency. - * - * This is the only dependency that accepts an eregable pattern. The pattern - * will be matched against the php_uname() output parsed by OS_Guess - */ - function validateArchDependency($dep) - { - if ($this->_state != PEAR_VALIDATE_INSTALLING) { - return true; - } - - $not = isset($dep['conflicts']) ? true : false; - if (!$this->matchSignature($dep['pattern'])) { - if (!$not) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s Architecture dependency failed, does not ' . - 'match "' . $dep['pattern'] . '"'); - } - - return $this->warning('warning: %s Architecture dependency failed, does ' . - 'not match "' . $dep['pattern'] . '"'); - } - - return true; - } - - if ($not) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s Architecture dependency failed, required "' . - $dep['pattern'] . '"'); - } - - return $this->warning('warning: %s Architecture dependency failed, ' . - 'required "' . $dep['pattern'] . '"'); - } - - return true; - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function extension_loaded($name) - { - return extension_loaded($name); - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function phpversion($name = null) - { - if ($name !== null) { - return phpversion($name); - } - - return phpversion(); - } - - function validateExtensionDependency($dep, $required = true) - { - if ($this->_state != PEAR_VALIDATE_INSTALLING && - $this->_state != PEAR_VALIDATE_DOWNLOADING) { - return true; - } - - $loaded = $this->extension_loaded($dep['name']); - $extra = $this->_getExtraString($dep); - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - } - - if (!isset($dep['min']) && !isset($dep['max']) && - !isset($dep['recommended']) && !isset($dep['exclude']) - ) { - if ($loaded) { - if (isset($dep['conflicts'])) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra); - } - - return $this->warning('warning: %s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra); - } - - return true; - } - - if (isset($dep['conflicts'])) { - return true; - } - - if ($required) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PHP extension "' . - $dep['name'] . '"' . $extra); - } - - return $this->warning('warning: %s requires PHP extension "' . - $dep['name'] . '"' . $extra); - } - - return $this->warning('%s can optionally use PHP extension "' . - $dep['name'] . '"' . $extra); - } - - if (!$loaded) { - if (isset($dep['conflicts'])) { - return true; - } - - if (!$required) { - return $this->warning('%s can optionally use PHP extension "' . - $dep['name'] . '"' . $extra); - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PHP extension "' . $dep['name'] . - '"' . $extra); - } - - return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . - '"' . $extra); - } - - $version = (string) $this->phpversion($dep['name']); - if (empty($version)) { - $version = '0'; - } - - $fail = false; - if (isset($dep['min']) && !version_compare($version, $dep['min'], '>=')) { - $fail = true; - } - - if (isset($dep['max']) && !version_compare($version, $dep['max'], '<=')) { - $fail = true; - } - - if ($fail && !isset($dep['conflicts'])) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PHP extension "' . $dep['name'] . - '"' . $extra . ', installed version is ' . $version); - } - - return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . - '"' . $extra . ', installed version is ' . $version); - } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && isset($dep['conflicts'])) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra . ', installed version is ' . $version); - } - - return $this->warning('warning: %s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra . ', installed version is ' . $version); - } - - if (isset($dep['exclude'])) { - foreach ($dep['exclude'] as $exclude) { - if (version_compare($version, $exclude, '==')) { - if (isset($dep['conflicts'])) { - continue; - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s is not compatible with PHP extension "' . - $dep['name'] . '" version ' . - $exclude); - } - - return $this->warning('warning: %s is not compatible with PHP extension "' . - $dep['name'] . '" version ' . - $exclude); - } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra . ', installed version is ' . $version); - } - - return $this->warning('warning: %s conflicts with PHP extension "' . - $dep['name'] . '"' . $extra . ', installed version is ' . $version); - } - } - } - - if (isset($dep['recommended'])) { - if (version_compare($version, $dep['recommended'], '==')) { - return true; - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s dependency: PHP extension ' . $dep['name'] . - ' version "' . $version . '"' . - ' is not the recommended version "' . $dep['recommended'] . - '", but may be compatible, use --force to install'); - } - - return $this->warning('warning: %s dependency: PHP extension ' . - $dep['name'] . ' version "' . $version . '"' . - ' is not the recommended version "' . $dep['recommended'].'"'); - } - - return true; - } - - function validatePhpDependency($dep) - { - if ($this->_state != PEAR_VALIDATE_INSTALLING && - $this->_state != PEAR_VALIDATE_DOWNLOADING) { - return true; - } - - $version = $this->phpversion(); - $extra = $this->_getExtraString($dep); - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - } - - if (isset($dep['min'])) { - if (!version_compare($version, $dep['min'], '>=')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PHP' . - $extra . ', installed version is ' . $version); - } - - return $this->warning('warning: %s requires PHP' . - $extra . ', installed version is ' . $version); - } - } - - if (isset($dep['max'])) { - if (!version_compare($version, $dep['max'], '<=')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PHP' . - $extra . ', installed version is ' . $version); - } - - return $this->warning('warning: %s requires PHP' . - $extra . ', installed version is ' . $version); - } - } - - if (isset($dep['exclude'])) { - foreach ($dep['exclude'] as $exclude) { - if (version_compare($version, $exclude, '==')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s is not compatible with PHP version ' . - $exclude); - } - - return $this->warning( - 'warning: %s is not compatible with PHP version ' . - $exclude); - } - } - } - - return true; - } - - /** - * This makes unit-testing a heck of a lot easier - */ - function getPEARVersion() - { - return '1.9.4'; - } - - function validatePearinstallerDependency($dep) - { - $pearversion = $this->getPEARVersion(); - $extra = $this->_getExtraString($dep); - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - } - - if (version_compare($pearversion, $dep['min'], '<')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PEAR Installer' . $extra . - ', installed version is ' . $pearversion); - } - - return $this->warning('warning: %s requires PEAR Installer' . $extra . - ', installed version is ' . $pearversion); - } - - if (isset($dep['max'])) { - if (version_compare($pearversion, $dep['max'], '>')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires PEAR Installer' . $extra . - ', installed version is ' . $pearversion); - } - - return $this->warning('warning: %s requires PEAR Installer' . $extra . - ', installed version is ' . $pearversion); - } - } - - if (isset($dep['exclude'])) { - if (!isset($dep['exclude'][0])) { - $dep['exclude'] = array($dep['exclude']); - } - - foreach ($dep['exclude'] as $exclude) { - if (version_compare($exclude, $pearversion, '==')) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s is not compatible with PEAR Installer ' . - 'version ' . $exclude); - } - - return $this->warning('warning: %s is not compatible with PEAR ' . - 'Installer version ' . $exclude); - } - } - } - - return true; - } - - function validateSubpackageDependency($dep, $required, $params) - { - return $this->validatePackageDependency($dep, $required, $params); - } - - /** - * @param array dependency information (2.0 format) - * @param boolean whether this is a required dependency - * @param array a list of downloaded packages to be installed, if any - * @param boolean if true, then deps on pear.php.net that fail will also check - * against pecl.php.net packages to accomodate extensions that have - * moved to pecl.php.net from pear.php.net - */ - function validatePackageDependency($dep, $required, $params, $depv1 = false) - { - if ($this->_state != PEAR_VALIDATE_INSTALLING && - $this->_state != PEAR_VALIDATE_DOWNLOADING) { - return true; - } - - if (isset($dep['providesextension'])) { - if ($this->extension_loaded($dep['providesextension'])) { - $save = $dep; - $subdep = $dep; - $subdep['name'] = $subdep['providesextension']; - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $ret = $this->validateExtensionDependency($subdep, $required); - PEAR::popErrorHandling(); - if (!PEAR::isError($ret)) { - return true; - } - } - } - - if ($this->_state == PEAR_VALIDATE_INSTALLING) { - return $this->_validatePackageInstall($dep, $required, $depv1); - } - - if ($this->_state == PEAR_VALIDATE_DOWNLOADING) { - return $this->_validatePackageDownload($dep, $required, $params, $depv1); - } - } - - function _validatePackageDownload($dep, $required, $params, $depv1 = false) - { - $dep['package'] = $dep['name']; - if (isset($dep['uri'])) { - $dep['channel'] = '__uri'; - } - - $depname = $this->_registry->parsedPackageNameToString($dep, true); - $found = false; - foreach ($params as $param) { - if ($param->isEqual( - array('package' => $dep['name'], - 'channel' => $dep['channel']))) { - $found = true; - break; - } - - if ($depv1 && $dep['channel'] == 'pear.php.net') { - if ($param->isEqual( - array('package' => $dep['name'], - 'channel' => 'pecl.php.net'))) { - $found = true; - break; - } - } - } - - if (!$found && isset($dep['providesextension'])) { - foreach ($params as $param) { - if ($param->isExtension($dep['providesextension'])) { - $found = true; - break; - } - } - } - - if ($found) { - $version = $param->getVersion(); - $installed = false; - $downloaded = true; - } else { - if ($this->_registry->packageExists($dep['name'], $dep['channel'])) { - $installed = true; - $downloaded = false; - $version = $this->_registry->packageinfo($dep['name'], 'version', - $dep['channel']); - } else { - if ($dep['channel'] == 'pecl.php.net' && $this->_registry->packageExists($dep['name'], - 'pear.php.net')) { - $installed = true; - $downloaded = false; - $version = $this->_registry->packageinfo($dep['name'], 'version', - 'pear.php.net'); - } else { - $version = 'not installed or downloaded'; - $installed = false; - $downloaded = false; - } - } - } - - $extra = $this->_getExtraString($dep); - if (isset($dep['exclude']) && !is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - - if (!isset($dep['min']) && !isset($dep['max']) && - !isset($dep['recommended']) && !isset($dep['exclude']) - ) { - if ($installed || $downloaded) { - $installed = $installed ? 'installed' : 'downloaded'; - if (isset($dep['conflicts'])) { - $rest = ''; - if ($version) { - $rest = ", $installed version is " . $version; - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . $rest); - } - - return $this->warning('warning: %s conflicts with package "' . $depname . '"' . $extra . $rest); - } - - return true; - } - - if (isset($dep['conflicts'])) { - return true; - } - - if ($required) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires package "' . $depname . '"' . $extra); - } - - return $this->warning('warning: %s requires package "' . $depname . '"' . $extra); - } - - return $this->warning('%s can optionally use package "' . $depname . '"' . $extra); - } - - if (!$installed && !$downloaded) { - if (isset($dep['conflicts'])) { - return true; - } - - if ($required) { - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires package "' . $depname . '"' . $extra); - } - - return $this->warning('warning: %s requires package "' . $depname . '"' . $extra); - } - - return $this->warning('%s can optionally use package "' . $depname . '"' . $extra); - } - - $fail = false; - if (isset($dep['min']) && version_compare($version, $dep['min'], '<')) { - $fail = true; - } - - if (isset($dep['max']) && version_compare($version, $dep['max'], '>')) { - $fail = true; - } - - if ($fail && !isset($dep['conflicts'])) { - $installed = $installed ? 'installed' : 'downloaded'; - $dep['package'] = $dep['name']; - $dep = $this->_registry->parsedPackageNameToString($dep, true); - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s requires package "' . $depname . '"' . - $extra . ", $installed version is " . $version); - } - - return $this->warning('warning: %s requires package "' . $depname . '"' . - $extra . ", $installed version is " . $version); - } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && - isset($dep['conflicts']) && !isset($dep['exclude'])) { - $installed = $installed ? 'installed' : 'downloaded'; - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . - ", $installed version is " . $version); - } - - return $this->warning('warning: %s conflicts with package "' . $depname . '"' . - $extra . ", $installed version is " . $version); - } - - if (isset($dep['exclude'])) { - $installed = $installed ? 'installed' : 'downloaded'; - foreach ($dep['exclude'] as $exclude) { - if (version_compare($version, $exclude, '==') && !isset($dep['conflicts'])) { - if (!isset($this->_options['nodeps']) && - !isset($this->_options['force']) - ) { - return $this->raiseError('%s is not compatible with ' . - $installed . ' package "' . - $depname . '" version ' . - $exclude); - } - - return $this->warning('warning: %s is not compatible with ' . - $installed . ' package "' . - $depname . '" version ' . - $exclude); - } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) { - $installed = $installed ? 'installed' : 'downloaded'; - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('%s conflicts with package "' . $depname . '"' . - $extra . ", $installed version is " . $version); - } - - return $this->warning('warning: %s conflicts with package "' . $depname . '"' . - $extra . ", $installed version is " . $version); - } - } - } - - if (isset($dep['recommended'])) { - $installed = $installed ? 'installed' : 'downloaded'; - if (version_compare($version, $dep['recommended'], '==')) { - return true; - } - - if (!$found && $installed) { - $param = $this->_registry->getPackage($dep['name'], $dep['channel']); - } - - if ($param) { - $found = false; - foreach ($params as $parent) { - if ($parent->isEqual($this->_currentPackage)) { - $found = true; - break; - } - } - - if ($found) { - if ($param->isCompatible($parent)) { - return true; - } - } else { // this is for validPackage() calls - $parent = $this->_registry->getPackage($this->_currentPackage['package'], - $this->_currentPackage['channel']); - if ($parent !== null && $param->isCompatible($parent)) { - return true; - } - } - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force']) && - !isset($this->_options['loose']) - ) { - return $this->raiseError('%s dependency package "' . $depname . - '" ' . $installed . ' version ' . $version . - ' is not the recommended version ' . $dep['recommended'] . - ', but may be compatible, use --force to install'); - } - - return $this->warning('warning: %s dependency package "' . $depname . - '" ' . $installed . ' version ' . $version . - ' is not the recommended version ' . $dep['recommended']); - } - - return true; - } - - function _validatePackageInstall($dep, $required, $depv1 = false) - { - return $this->_validatePackageDownload($dep, $required, array(), $depv1); - } - - /** - * Verify that uninstalling packages passed in to command line is OK. - * - * @param PEAR_Installer $dl - * @return PEAR_Error|true - */ - function validatePackageUninstall(&$dl) - { - if (PEAR::isError($this->_dependencydb)) { - return $this->_dependencydb; - } - - $params = array(); - // construct an array of "downloaded" packages to fool the package dependency checker - // into using these to validate uninstalls of circular dependencies - $downloaded = &$dl->getUninstallPackages(); - foreach ($downloaded as $i => $pf) { - if (!class_exists('PEAR_Downloader_Package')) { - require_once 'PEAR/Downloader/Package.php'; - } - $dp = &new PEAR_Downloader_Package($dl); - $dp->setPackageFile($downloaded[$i]); - $params[$i] = &$dp; - } - - // check cache - $memyselfandI = strtolower($this->_currentPackage['channel']) . '/' . - strtolower($this->_currentPackage['package']); - if (isset($dl->___uninstall_package_cache)) { - $badpackages = $dl->___uninstall_package_cache; - if (isset($badpackages[$memyselfandI]['warnings'])) { - foreach ($badpackages[$memyselfandI]['warnings'] as $warning) { - $dl->log(0, $warning[0]); - } - } - - if (isset($badpackages[$memyselfandI]['errors'])) { - foreach ($badpackages[$memyselfandI]['errors'] as $error) { - if (is_array($error)) { - $dl->log(0, $error[0]); - } else { - $dl->log(0, $error->getMessage()); - } - } - - if (isset($this->_options['nodeps']) || isset($this->_options['force'])) { - return $this->warning( - 'warning: %s should not be uninstalled, other installed packages depend ' . - 'on this package'); - } - - return $this->raiseError( - '%s cannot be uninstalled, other installed packages depend on this package'); - } - - return true; - } - - // first, list the immediate parents of each package to be uninstalled - $perpackagelist = array(); - $allparents = array(); - foreach ($params as $i => $param) { - $a = array( - 'channel' => strtolower($param->getChannel()), - 'package' => strtolower($param->getPackage()) - ); - - $deps = $this->_dependencydb->getDependentPackages($a); - if ($deps) { - foreach ($deps as $d) { - $pardeps = $this->_dependencydb->getDependencies($d); - foreach ($pardeps as $dep) { - if (strtolower($dep['dep']['channel']) == $a['channel'] && - strtolower($dep['dep']['name']) == $a['package']) { - if (!isset($perpackagelist[$a['channel'] . '/' . $a['package']])) { - $perpackagelist[$a['channel'] . '/' . $a['package']] = array(); - } - $perpackagelist[$a['channel'] . '/' . $a['package']][] - = array($d['channel'] . '/' . $d['package'], $dep); - if (!isset($allparents[$d['channel'] . '/' . $d['package']])) { - $allparents[$d['channel'] . '/' . $d['package']] = array(); - } - if (!isset($allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']])) { - $allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']] = array(); - } - $allparents[$d['channel'] . '/' . $d['package']] - [$a['channel'] . '/' . $a['package']][] - = array($d, $dep); - } - } - } - } - } - - // next, remove any packages from the parents list that are not installed - $remove = array(); - foreach ($allparents as $parent => $d1) { - foreach ($d1 as $d) { - if ($this->_registry->packageExists($d[0][0]['package'], $d[0][0]['channel'])) { - continue; - } - $remove[$parent] = true; - } - } - - // next remove any packages from the parents list that are not passed in for - // uninstallation - foreach ($allparents as $parent => $d1) { - foreach ($d1 as $d) { - foreach ($params as $param) { - if (strtolower($param->getChannel()) == $d[0][0]['channel'] && - strtolower($param->getPackage()) == $d[0][0]['package']) { - // found it - continue 3; - } - } - $remove[$parent] = true; - } - } - - // remove all packages whose dependencies fail - // save which ones failed for error reporting - $badchildren = array(); - do { - $fail = false; - foreach ($remove as $package => $unused) { - if (!isset($allparents[$package])) { - continue; - } - - foreach ($allparents[$package] as $kid => $d1) { - foreach ($d1 as $depinfo) { - if ($depinfo[1]['type'] != 'optional') { - if (isset($badchildren[$kid])) { - continue; - } - $badchildren[$kid] = true; - $remove[$kid] = true; - $fail = true; - continue 2; - } - } - } - if ($fail) { - // start over, we removed some children - continue 2; - } - } - } while ($fail); - - // next, construct the list of packages that can't be uninstalled - $badpackages = array(); - $save = $this->_currentPackage; - foreach ($perpackagelist as $package => $packagedeps) { - foreach ($packagedeps as $parent) { - if (!isset($remove[$parent[0]])) { - continue; - } - - $packagename = $this->_registry->parsePackageName($parent[0]); - $packagename['channel'] = $this->_registry->channelAlias($packagename['channel']); - $pa = $this->_registry->getPackage($packagename['package'], $packagename['channel']); - $packagename['package'] = $pa->getPackage(); - $this->_currentPackage = $packagename; - // parent is not present in uninstall list, make sure we can actually - // uninstall it (parent dep is optional) - $parentname['channel'] = $this->_registry->channelAlias($parent[1]['dep']['channel']); - $pa = $this->_registry->getPackage($parent[1]['dep']['name'], $parent[1]['dep']['channel']); - $parentname['package'] = $pa->getPackage(); - $parent[1]['dep']['package'] = $parentname['package']; - $parent[1]['dep']['channel'] = $parentname['channel']; - if ($parent[1]['type'] == 'optional') { - $test = $this->_validatePackageUninstall($parent[1]['dep'], false, $dl); - if ($test !== true) { - $badpackages[$package]['warnings'][] = $test; - } - } else { - $test = $this->_validatePackageUninstall($parent[1]['dep'], true, $dl); - if ($test !== true) { - $badpackages[$package]['errors'][] = $test; - } - } - } - } - - $this->_currentPackage = $save; - $dl->___uninstall_package_cache = $badpackages; - if (isset($badpackages[$memyselfandI])) { - if (isset($badpackages[$memyselfandI]['warnings'])) { - foreach ($badpackages[$memyselfandI]['warnings'] as $warning) { - $dl->log(0, $warning[0]); - } - } - - if (isset($badpackages[$memyselfandI]['errors'])) { - foreach ($badpackages[$memyselfandI]['errors'] as $error) { - if (is_array($error)) { - $dl->log(0, $error[0]); - } else { - $dl->log(0, $error->getMessage()); - } - } - - if (isset($this->_options['nodeps']) || isset($this->_options['force'])) { - return $this->warning( - 'warning: %s should not be uninstalled, other installed packages depend ' . - 'on this package'); - } - - return $this->raiseError( - '%s cannot be uninstalled, other installed packages depend on this package'); - } - } - - return true; - } - - function _validatePackageUninstall($dep, $required, $dl) - { - $depname = $this->_registry->parsedPackageNameToString($dep, true); - $version = $this->_registry->packageinfo($dep['package'], 'version', $dep['channel']); - if (!$version) { - return true; - } - - $extra = $this->_getExtraString($dep); - if (isset($dep['exclude']) && !is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - - if (isset($dep['conflicts'])) { - return true; // uninstall OK - these packages conflict (probably installed with --force) - } - - if (!isset($dep['min']) && !isset($dep['max'])) { - if (!$required) { - return $this->warning('"' . $depname . '" can be optionally used by ' . - 'installed package %s' . $extra); - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError('"' . $depname . '" is required by ' . - 'installed package %s' . $extra); - } - - return $this->warning('warning: "' . $depname . '" is required by ' . - 'installed package %s' . $extra); - } - - $fail = false; - if (isset($dep['min']) && version_compare($version, $dep['min'], '>=')) { - $fail = true; - } - - if (isset($dep['max']) && version_compare($version, $dep['max'], '<=')) { - $fail = true; - } - - // we re-use this variable, preserve the original value - $saverequired = $required; - if (!$required) { - return $this->warning($depname . $extra . ' can be optionally used by installed package' . - ' "%s"'); - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { - return $this->raiseError($depname . $extra . ' is required by installed package' . - ' "%s"'); - } - - return $this->raiseError('warning: ' . $depname . $extra . - ' is required by installed package "%s"'); - } - - /** - * validate a downloaded package against installed packages - * - * As of PEAR 1.4.3, this will only validate - * - * @param array|PEAR_Downloader_Package|PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * $pkg package identifier (either - * array('package' => blah, 'channel' => blah) or an array with - * index 'info' referencing an object) - * @param PEAR_Downloader $dl - * @param array $params full list of packages to install - * @return true|PEAR_Error - */ - function validatePackage($pkg, &$dl, $params = array()) - { - if (is_array($pkg) && isset($pkg['info'])) { - $deps = $this->_dependencydb->getDependentPackageDependencies($pkg['info']); - } else { - $deps = $this->_dependencydb->getDependentPackageDependencies($pkg); - } - - $fail = false; - if ($deps) { - if (!class_exists('PEAR_Downloader_Package')) { - require_once 'PEAR/Downloader/Package.php'; - } - - $dp = &new PEAR_Downloader_Package($dl); - if (is_object($pkg)) { - $dp->setPackageFile($pkg); - } else { - $dp->setDownloadURL($pkg); - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - foreach ($deps as $channel => $info) { - foreach ($info as $package => $ds) { - foreach ($params as $packd) { - if (strtolower($packd->getPackage()) == strtolower($package) && - $packd->getChannel() == $channel) { - $dl->log(3, 'skipping installed package check of "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $channel, 'package' => $package), - true) . - '", version "' . $packd->getVersion() . '" will be ' . - 'downloaded and installed'); - continue 2; // jump to next package - } - } - - foreach ($ds as $d) { - $checker = &new PEAR_Dependency2($this->_config, $this->_options, - array('channel' => $channel, 'package' => $package), $this->_state); - $dep = $d['dep']; - $required = $d['type'] == 'required'; - $ret = $checker->_validatePackageDownload($dep, $required, array(&$dp)); - if (is_array($ret)) { - $dl->log(0, $ret[0]); - } elseif (PEAR::isError($ret)) { - $dl->log(0, $ret->getMessage()); - $fail = true; - } - } - } - } - PEAR::popErrorHandling(); - } - - if ($fail) { - return $this->raiseError( - '%s cannot be installed, conflicts with installed packages'); - } - - return true; - } - - /** - * validate a package.xml 1.0 dependency - */ - function validateDependency1($dep, $params = array()) - { - if (!isset($dep['optional'])) { - $dep['optional'] = 'no'; - } - - list($newdep, $type) = $this->normalizeDep($dep); - if (!$newdep) { - return $this->raiseError("Invalid Dependency"); - } - - if (method_exists($this, "validate{$type}Dependency")) { - return $this->{"validate{$type}Dependency"}($newdep, $dep['optional'] == 'no', - $params, true); - } - } - - /** - * Convert a 1.0 dep into a 2.0 dep - */ - function normalizeDep($dep) - { - $types = array( - 'pkg' => 'Package', - 'ext' => 'Extension', - 'os' => 'Os', - 'php' => 'Php' - ); - - if (!isset($types[$dep['type']])) { - return array(false, false); - } - - $type = $types[$dep['type']]; - - $newdep = array(); - switch ($type) { - case 'Package' : - $newdep['channel'] = 'pear.php.net'; - case 'Extension' : - case 'Os' : - $newdep['name'] = $dep['name']; - break; - } - - $dep['rel'] = PEAR_Dependency2::signOperator($dep['rel']); - switch ($dep['rel']) { - case 'has' : - return array($newdep, $type); - break; - case 'not' : - $newdep['conflicts'] = true; - break; - case '>=' : - case '>' : - $newdep['min'] = $dep['version']; - if ($dep['rel'] == '>') { - $newdep['exclude'] = $dep['version']; - } - break; - case '<=' : - case '<' : - $newdep['max'] = $dep['version']; - if ($dep['rel'] == '<') { - $newdep['exclude'] = $dep['version']; - } - break; - case 'ne' : - case '!=' : - $newdep['min'] = '0'; - $newdep['max'] = '100000'; - $newdep['exclude'] = $dep['version']; - break; - case '==' : - $newdep['min'] = $dep['version']; - $newdep['max'] = $dep['version']; - break; - } - if ($type == 'Php') { - if (!isset($newdep['min'])) { - $newdep['min'] = '4.4.0'; - } - - if (!isset($newdep['max'])) { - $newdep['max'] = '6.0.0'; - } - } - return array($newdep, $type); - } - - /** - * Converts text comparing operators to them sign equivalents - * - * Example: 'ge' to '>=' - * - * @access public - * @param string Operator - * @return string Sign equivalent - */ - function signOperator($operator) - { - switch($operator) { - case 'lt': return '<'; - case 'le': return '<='; - case 'gt': return '>'; - case 'ge': return '>='; - case 'eq': return '=='; - case 'ne': return '!='; - default: - return $operator; - } - } - - function raiseError($msg) - { - if (isset($this->_options['ignore-errors'])) { - return $this->warning($msg); - } - - return PEAR::raiseError(sprintf($msg, $this->_registry->parsedPackageNameToString( - $this->_currentPackage, true))); - } - - function warning($msg) - { - return array(sprintf($msg, $this->_registry->parsedPackageNameToString( - $this->_currentPackage, true))); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/DependencyDB.php b/3rdparty/PEAR/DependencyDB.php deleted file mode 100644 index 948f0c9d70..0000000000 --- a/3rdparty/PEAR/DependencyDB.php +++ /dev/null @@ -1,769 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: DependencyDB.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Needed for error handling - */ -require_once 'PEAR.php'; -require_once 'PEAR/Config.php'; - -$GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'] = array(); -/** - * Track dependency relationships between installed packages - * @category pear - * @package PEAR - * @author Greg Beaver - * @author Tomas V.V.Cox - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_DependencyDB -{ - // {{{ properties - - /** - * This is initialized by {@link setConfig()} - * @var PEAR_Config - * @access private - */ - var $_config; - /** - * This is initialized by {@link setConfig()} - * @var PEAR_Registry - * @access private - */ - var $_registry; - /** - * Filename of the dependency DB (usually .depdb) - * @var string - * @access private - */ - var $_depdb = false; - /** - * File name of the lockfile (usually .depdblock) - * @var string - * @access private - */ - var $_lockfile = false; - /** - * Open file resource for locking the lockfile - * @var resource|false - * @access private - */ - var $_lockFp = false; - /** - * API version of this class, used to validate a file on-disk - * @var string - * @access private - */ - var $_version = '1.0'; - /** - * Cached dependency database file - * @var array|null - * @access private - */ - var $_cache; - - // }}} - // {{{ & singleton() - - /** - * Get a raw dependency database. Calls setConfig() and assertDepsDB() - * @param PEAR_Config - * @param string|false full path to the dependency database, or false to use default - * @return PEAR_DependencyDB|PEAR_Error - * @static - */ - function &singleton(&$config, $depdb = false) - { - $phpdir = $config->get('php_dir', null, 'pear.php.net'); - if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir])) { - $a = new PEAR_DependencyDB; - $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir] = &$a; - $a->setConfig($config, $depdb); - $e = $a->assertDepsDB(); - if (PEAR::isError($e)) { - return $e; - } - } - - return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir]; - } - - /** - * Set up the registry/location of dependency DB - * @param PEAR_Config|false - * @param string|false full path to the dependency database, or false to use default - */ - function setConfig(&$config, $depdb = false) - { - if (!$config) { - $this->_config = &PEAR_Config::singleton(); - } else { - $this->_config = &$config; - } - - $this->_registry = &$this->_config->getRegistry(); - if (!$depdb) { - $this->_depdb = $this->_config->get('php_dir', null, 'pear.php.net') . - DIRECTORY_SEPARATOR . '.depdb'; - } else { - $this->_depdb = $depdb; - } - - $this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock'; - } - // }}} - - function hasWriteAccess() - { - if (!file_exists($this->_depdb)) { - $dir = $this->_depdb; - while ($dir && $dir != '.') { - $dir = dirname($dir); // cd .. - if ($dir != '.' && file_exists($dir)) { - if (is_writeable($dir)) { - return true; - } - - return false; - } - } - - return false; - } - - return is_writeable($this->_depdb); - } - - // {{{ assertDepsDB() - - /** - * Create the dependency database, if it doesn't exist. Error if the database is - * newer than the code reading it. - * @return void|PEAR_Error - */ - function assertDepsDB() - { - if (!is_file($this->_depdb)) { - $this->rebuildDB(); - return; - } - - $depdb = $this->_getDepDB(); - // Datatype format has been changed, rebuild the Deps DB - if ($depdb['_version'] < $this->_version) { - $this->rebuildDB(); - } - - if ($depdb['_version']{0} > $this->_version{0}) { - return PEAR::raiseError('Dependency database is version ' . - $depdb['_version'] . ', and we are version ' . - $this->_version . ', cannot continue'); - } - } - - /** - * Get a list of installed packages that depend on this package - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array - * @return array|false - */ - function getDependentPackages(&$pkg) - { - $data = $this->_getDepDB(); - if (is_object($pkg)) { - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - } else { - $channel = strtolower($pkg['channel']); - $package = strtolower($pkg['package']); - } - - if (isset($data['packages'][$channel][$package])) { - return $data['packages'][$channel][$package]; - } - - return false; - } - - /** - * Get a list of the actual dependencies of installed packages that depend on - * a package. - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array - * @return array|false - */ - function getDependentPackageDependencies(&$pkg) - { - $data = $this->_getDepDB(); - if (is_object($pkg)) { - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - } else { - $channel = strtolower($pkg['channel']); - $package = strtolower($pkg['package']); - } - - $depend = $this->getDependentPackages($pkg); - if (!$depend) { - return false; - } - - $dependencies = array(); - foreach ($depend as $info) { - $temp = $this->getDependencies($info); - foreach ($temp as $dep) { - if ( - isset($dep['dep'], $dep['dep']['channel'], $dep['dep']['name']) && - strtolower($dep['dep']['channel']) == $channel && - strtolower($dep['dep']['name']) == $package - ) { - if (!isset($dependencies[$info['channel']])) { - $dependencies[$info['channel']] = array(); - } - - if (!isset($dependencies[$info['channel']][$info['package']])) { - $dependencies[$info['channel']][$info['package']] = array(); - } - $dependencies[$info['channel']][$info['package']][] = $dep; - } - } - } - - return $dependencies; - } - - /** - * Get a list of dependencies of this installed package - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array - * @return array|false - */ - function getDependencies(&$pkg) - { - if (is_object($pkg)) { - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - } else { - $channel = strtolower($pkg['channel']); - $package = strtolower($pkg['package']); - } - - $data = $this->_getDepDB(); - if (isset($data['dependencies'][$channel][$package])) { - return $data['dependencies'][$channel][$package]; - } - - return false; - } - - /** - * Determine whether $parent depends on $child, near or deep - * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2 - * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2 - */ - function dependsOn($parent, $child) - { - $c = array(); - $this->_getDepDB(); - return $this->_dependsOn($parent, $child, $c); - } - - function _dependsOn($parent, $child, &$checked) - { - if (is_object($parent)) { - $channel = strtolower($parent->getChannel()); - $package = strtolower($parent->getPackage()); - } else { - $channel = strtolower($parent['channel']); - $package = strtolower($parent['package']); - } - - if (is_object($child)) { - $depchannel = strtolower($child->getChannel()); - $deppackage = strtolower($child->getPackage()); - } else { - $depchannel = strtolower($child['channel']); - $deppackage = strtolower($child['package']); - } - - if (isset($checked[$channel][$package][$depchannel][$deppackage])) { - return false; // avoid endless recursion - } - - $checked[$channel][$package][$depchannel][$deppackage] = true; - if (!isset($this->_cache['dependencies'][$channel][$package])) { - return false; - } - - foreach ($this->_cache['dependencies'][$channel][$package] as $info) { - if (isset($info['dep']['uri'])) { - if (is_object($child)) { - if ($info['dep']['uri'] == $child->getURI()) { - return true; - } - } elseif (isset($child['uri'])) { - if ($info['dep']['uri'] == $child['uri']) { - return true; - } - } - return false; - } - - if (strtolower($info['dep']['channel']) == $depchannel && - strtolower($info['dep']['name']) == $deppackage) { - return true; - } - } - - foreach ($this->_cache['dependencies'][$channel][$package] as $info) { - if (isset($info['dep']['uri'])) { - if ($this->_dependsOn(array( - 'uri' => $info['dep']['uri'], - 'package' => $info['dep']['name']), $child, $checked)) { - return true; - } - } else { - if ($this->_dependsOn(array( - 'channel' => $info['dep']['channel'], - 'package' => $info['dep']['name']), $child, $checked)) { - return true; - } - } - } - - return false; - } - - /** - * Register dependencies of a package that is being installed or upgraded - * @param PEAR_PackageFile_v2|PEAR_PackageFile_v2 - */ - function installPackage(&$package) - { - $data = $this->_getDepDB(); - unset($this->_cache); - $this->_setPackageDeps($data, $package); - $this->_writeDepDB($data); - } - - /** - * Remove dependencies of a package that is being uninstalled, or upgraded. - * - * Upgraded packages first uninstall, then install - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array If an array, then it must have - * indices 'channel' and 'package' - */ - function uninstallPackage(&$pkg) - { - $data = $this->_getDepDB(); - unset($this->_cache); - if (is_object($pkg)) { - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - } else { - $channel = strtolower($pkg['channel']); - $package = strtolower($pkg['package']); - } - - if (!isset($data['dependencies'][$channel][$package])) { - return true; - } - - foreach ($data['dependencies'][$channel][$package] as $dep) { - $found = false; - $depchannel = isset($dep['dep']['uri']) ? '__uri' : strtolower($dep['dep']['channel']); - $depname = strtolower($dep['dep']['name']); - if (isset($data['packages'][$depchannel][$depname])) { - foreach ($data['packages'][$depchannel][$depname] as $i => $info) { - if ($info['channel'] == $channel && $info['package'] == $package) { - $found = true; - break; - } - } - } - - if ($found) { - unset($data['packages'][$depchannel][$depname][$i]); - if (!count($data['packages'][$depchannel][$depname])) { - unset($data['packages'][$depchannel][$depname]); - if (!count($data['packages'][$depchannel])) { - unset($data['packages'][$depchannel]); - } - } else { - $data['packages'][$depchannel][$depname] = - array_values($data['packages'][$depchannel][$depname]); - } - } - } - - unset($data['dependencies'][$channel][$package]); - if (!count($data['dependencies'][$channel])) { - unset($data['dependencies'][$channel]); - } - - if (!count($data['dependencies'])) { - unset($data['dependencies']); - } - - if (!count($data['packages'])) { - unset($data['packages']); - } - - $this->_writeDepDB($data); - } - - /** - * Rebuild the dependency DB by reading registry entries. - * @return true|PEAR_Error - */ - function rebuildDB() - { - $depdb = array('_version' => $this->_version); - if (!$this->hasWriteAccess()) { - // allow startup for read-only with older Registry - return $depdb; - } - - $packages = $this->_registry->listAllPackages(); - if (PEAR::isError($packages)) { - return $packages; - } - - foreach ($packages as $channel => $ps) { - foreach ($ps as $package) { - $package = $this->_registry->getPackage($package, $channel); - if (PEAR::isError($package)) { - return $package; - } - $this->_setPackageDeps($depdb, $package); - } - } - - $error = $this->_writeDepDB($depdb); - if (PEAR::isError($error)) { - return $error; - } - - $this->_cache = $depdb; - return true; - } - - /** - * Register usage of the dependency DB to prevent race conditions - * @param int one of the LOCK_* constants - * @return true|PEAR_Error - * @access private - */ - function _lock($mode = LOCK_EX) - { - if (stristr(php_uname(), 'Windows 9')) { - return true; - } - - if ($mode != LOCK_UN && is_resource($this->_lockFp)) { - // XXX does not check type of lock (LOCK_SH/LOCK_EX) - return true; - } - - $open_mode = 'w'; - // XXX People reported problems with LOCK_SH and 'w' - if ($mode === LOCK_SH) { - if (!file_exists($this->_lockfile)) { - touch($this->_lockfile); - } elseif (!is_file($this->_lockfile)) { - return PEAR::raiseError('could not create Dependency lock file, ' . - 'it exists and is not a regular file'); - } - $open_mode = 'r'; - } - - if (!is_resource($this->_lockFp)) { - $this->_lockFp = @fopen($this->_lockfile, $open_mode); - } - - if (!is_resource($this->_lockFp)) { - return PEAR::raiseError("could not create Dependency lock file" . - (isset($php_errormsg) ? ": " . $php_errormsg : "")); - } - - if (!(int)flock($this->_lockFp, $mode)) { - switch ($mode) { - case LOCK_SH: $str = 'shared'; break; - case LOCK_EX: $str = 'exclusive'; break; - case LOCK_UN: $str = 'unlock'; break; - default: $str = 'unknown'; break; - } - - return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)"); - } - - return true; - } - - /** - * Release usage of dependency DB - * @return true|PEAR_Error - * @access private - */ - function _unlock() - { - $ret = $this->_lock(LOCK_UN); - if (is_resource($this->_lockFp)) { - fclose($this->_lockFp); - } - $this->_lockFp = null; - return $ret; - } - - /** - * Load the dependency database from disk, or return the cache - * @return array|PEAR_Error - */ - function _getDepDB() - { - if (!$this->hasWriteAccess()) { - return array('_version' => $this->_version); - } - - if (isset($this->_cache)) { - return $this->_cache; - } - - if (!$fp = fopen($this->_depdb, 'r')) { - $err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'"); - return $err; - } - - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - clearstatcache(); - fclose($fp); - $data = unserialize(file_get_contents($this->_depdb)); - set_magic_quotes_runtime($rt); - $this->_cache = $data; - return $data; - } - - /** - * Write out the dependency database to disk - * @param array the database - * @return true|PEAR_Error - * @access private - */ - function _writeDepDB(&$deps) - { - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - - if (!$fp = fopen($this->_depdb, 'wb')) { - $this->_unlock(); - return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing"); - } - - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - fwrite($fp, serialize($deps)); - set_magic_quotes_runtime($rt); - fclose($fp); - $this->_unlock(); - $this->_cache = $deps; - return true; - } - - /** - * Register all dependencies from a package in the dependencies database, in essence - * "installing" the package's dependency information - * @param array the database - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @access private - */ - function _setPackageDeps(&$data, &$pkg) - { - $pkg->setConfig($this->_config); - if ($pkg->getPackagexmlVersion() == '1.0') { - $gen = &$pkg->getDefaultGenerator(); - $deps = $gen->dependenciesToV2(); - } else { - $deps = $pkg->getDeps(true); - } - - if (!$deps) { - return; - } - - if (!is_array($data)) { - $data = array(); - } - - if (!isset($data['dependencies'])) { - $data['dependencies'] = array(); - } - - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - - if (!isset($data['dependencies'][$channel])) { - $data['dependencies'][$channel] = array(); - } - - $data['dependencies'][$channel][$package] = array(); - if (isset($deps['required']['package'])) { - if (!isset($deps['required']['package'][0])) { - $deps['required']['package'] = array($deps['required']['package']); - } - - foreach ($deps['required']['package'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'required'); - } - } - - if (isset($deps['optional']['package'])) { - if (!isset($deps['optional']['package'][0])) { - $deps['optional']['package'] = array($deps['optional']['package']); - } - - foreach ($deps['optional']['package'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'optional'); - } - } - - if (isset($deps['required']['subpackage'])) { - if (!isset($deps['required']['subpackage'][0])) { - $deps['required']['subpackage'] = array($deps['required']['subpackage']); - } - - foreach ($deps['required']['subpackage'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'required'); - } - } - - if (isset($deps['optional']['subpackage'])) { - if (!isset($deps['optional']['subpackage'][0])) { - $deps['optional']['subpackage'] = array($deps['optional']['subpackage']); - } - - foreach ($deps['optional']['subpackage'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'optional'); - } - } - - if (isset($deps['group'])) { - if (!isset($deps['group'][0])) { - $deps['group'] = array($deps['group']); - } - - foreach ($deps['group'] as $group) { - if (isset($group['package'])) { - if (!isset($group['package'][0])) { - $group['package'] = array($group['package']); - } - - foreach ($group['package'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'optional', - $group['attribs']['name']); - } - } - - if (isset($group['subpackage'])) { - if (!isset($group['subpackage'][0])) { - $group['subpackage'] = array($group['subpackage']); - } - - foreach ($group['subpackage'] as $dep) { - $this->_registerDep($data, $pkg, $dep, 'optional', - $group['attribs']['name']); - } - } - } - } - - if ($data['dependencies'][$channel][$package] == array()) { - unset($data['dependencies'][$channel][$package]); - if (!count($data['dependencies'][$channel])) { - unset($data['dependencies'][$channel]); - } - } - } - - /** - * @param array the database - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param array the specific dependency - * @param required|optional whether this is a required or an optional dep - * @param string|false dependency group this dependency is from, or false for ordinary dep - */ - function _registerDep(&$data, &$pkg, $dep, $type, $group = false) - { - $info = array( - 'dep' => $dep, - 'type' => $type, - 'group' => $group - ); - - $dep = array_map('strtolower', $dep); - $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri'; - if (!isset($data['dependencies'])) { - $data['dependencies'] = array(); - } - - $channel = strtolower($pkg->getChannel()); - $package = strtolower($pkg->getPackage()); - - if (!isset($data['dependencies'][$channel])) { - $data['dependencies'][$channel] = array(); - } - - if (!isset($data['dependencies'][$channel][$package])) { - $data['dependencies'][$channel][$package] = array(); - } - - $data['dependencies'][$channel][$package][] = $info; - if (isset($data['packages'][$depchannel][$dep['name']])) { - $found = false; - foreach ($data['packages'][$depchannel][$dep['name']] as $i => $p) { - if ($p['channel'] == $channel && $p['package'] == $package) { - $found = true; - break; - } - } - } else { - if (!isset($data['packages'])) { - $data['packages'] = array(); - } - - if (!isset($data['packages'][$depchannel])) { - $data['packages'][$depchannel] = array(); - } - - if (!isset($data['packages'][$depchannel][$dep['name']])) { - $data['packages'][$depchannel][$dep['name']] = array(); - } - - $found = false; - } - - if (!$found) { - $data['packages'][$depchannel][$dep['name']][] = array( - 'channel' => $channel, - 'package' => $package - ); - } - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Downloader.php b/3rdparty/PEAR/Downloader.php deleted file mode 100644 index 730df0b738..0000000000 --- a/3rdparty/PEAR/Downloader.php +++ /dev/null @@ -1,1766 +0,0 @@ - - * @author Stig Bakken - * @author Tomas V. V. Cox - * @author Martin Jansen - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Downloader.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.3.0 - */ - -/** - * Needed for constants, extending - */ -require_once 'PEAR/Common.php'; - -define('PEAR_INSTALLER_OK', 1); -define('PEAR_INSTALLER_FAILED', 0); -define('PEAR_INSTALLER_SKIPPED', -1); -define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2); - -/** - * Administration class used to download anything from the internet (PEAR Packages, - * static URLs, xml files) - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @author Stig Bakken - * @author Tomas V. V. Cox - * @author Martin Jansen - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.3.0 - */ -class PEAR_Downloader extends PEAR_Common -{ - /** - * @var PEAR_Registry - * @access private - */ - var $_registry; - - /** - * Preferred Installation State (snapshot, devel, alpha, beta, stable) - * @var string|null - * @access private - */ - var $_preferredState; - - /** - * Options from command-line passed to Install. - * - * Recognized options:
    - * - onlyreqdeps : install all required dependencies as well - * - alldeps : install all dependencies, including optional - * - installroot : base relative path to install files in - * - force : force a download even if warnings would prevent it - * - nocompress : download uncompressed tarballs - * @see PEAR_Command_Install - * @access private - * @var array - */ - var $_options; - - /** - * Downloaded Packages after a call to download(). - * - * Format of each entry: - * - * - * array('pkg' => 'package_name', 'file' => '/path/to/local/file', - * 'info' => array() // parsed package.xml - * ); - * - * @access private - * @var array - */ - var $_downloadedPackages = array(); - - /** - * Packages slated for download. - * - * This is used to prevent downloading a package more than once should it be a dependency - * for two packages to be installed. - * Format of each entry: - * - *
    -     * array('package_name1' => parsed package.xml, 'package_name2' => parsed package.xml,
    -     * );
    -     * 
    - * @access private - * @var array - */ - var $_toDownload = array(); - - /** - * Array of every package installed, with names lower-cased. - * - * Format: - * - * array('package1' => 0, 'package2' => 1, ); - * - * @var array - */ - var $_installed = array(); - - /** - * @var array - * @access private - */ - var $_errorStack = array(); - - /** - * @var boolean - * @access private - */ - var $_internalDownload = false; - - /** - * Temporary variable used in sorting packages by dependency in {@link sortPkgDeps()} - * @var array - * @access private - */ - var $_packageSortTree; - - /** - * Temporary directory, or configuration value where downloads will occur - * @var string - */ - var $_downloadDir; - - /** - * @param PEAR_Frontend_* - * @param array - * @param PEAR_Config - */ - function PEAR_Downloader(&$ui, $options, &$config) - { - parent::PEAR_Common(); - $this->_options = $options; - $this->config = &$config; - $this->_preferredState = $this->config->get('preferred_state'); - $this->ui = &$ui; - if (!$this->_preferredState) { - // don't inadvertantly use a non-set preferred_state - $this->_preferredState = null; - } - - if (isset($this->_options['installroot'])) { - $this->config->setInstallRoot($this->_options['installroot']); - } - $this->_registry = &$config->getRegistry(); - - if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { - $this->_installed = $this->_registry->listAllPackages(); - foreach ($this->_installed as $key => $unused) { - if (!count($unused)) { - continue; - } - $strtolower = create_function('$a','return strtolower($a);'); - array_walk($this->_installed[$key], $strtolower); - } - } - } - - /** - * Attempt to discover a channel's remote capabilities from - * its server name - * @param string - * @return boolean - */ - function discover($channel) - { - $this->log(1, 'Attempting to discover channel "' . $channel . '"...'); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $callback = $this->ui ? array(&$this, '_downloadCallback') : null; - if (!class_exists('System')) { - require_once 'System.php'; - } - - $tmpdir = $this->config->get('temp_dir'); - $tmp = System::mktemp('-d -t "' . $tmpdir . '"'); - $a = $this->downloadHttp('http://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false); - PEAR::popErrorHandling(); - if (PEAR::isError($a)) { - // Attempt to fallback to https automatically. - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $this->log(1, 'Attempting fallback to https instead of http on channel "' . $channel . '"...'); - $a = $this->downloadHttp('https://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false); - PEAR::popErrorHandling(); - if (PEAR::isError($a)) { - return false; - } - } - - list($a, $lastmodified) = $a; - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $b = new PEAR_ChannelFile; - if ($b->fromXmlFile($a)) { - unlink($a); - if ($this->config->get('auto_discover')) { - $this->_registry->addChannel($b, $lastmodified); - $alias = $b->getName(); - if ($b->getName() == $this->_registry->channelName($b->getAlias())) { - $alias = $b->getAlias(); - } - - $this->log(1, 'Auto-discovered channel "' . $channel . - '", alias "' . $alias . '", adding to registry'); - } - - return true; - } - - unlink($a); - return false; - } - - /** - * For simpler unit-testing - * @param PEAR_Downloader - * @return PEAR_Downloader_Package - */ - function &newDownloaderPackage(&$t) - { - if (!class_exists('PEAR_Downloader_Package')) { - require_once 'PEAR/Downloader/Package.php'; - } - $a = &new PEAR_Downloader_Package($t); - return $a; - } - - /** - * For simpler unit-testing - * @param PEAR_Config - * @param array - * @param array - * @param int - */ - function &getDependency2Object(&$c, $i, $p, $s) - { - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - $z = &new PEAR_Dependency2($c, $i, $p, $s); - return $z; - } - - function &download($params) - { - if (!count($params)) { - $a = array(); - return $a; - } - - if (!isset($this->_registry)) { - $this->_registry = &$this->config->getRegistry(); - } - - $channelschecked = array(); - // convert all parameters into PEAR_Downloader_Package objects - foreach ($params as $i => $param) { - $params[$i] = &$this->newDownloaderPackage($this); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = $params[$i]->initialize($param); - PEAR::staticPopErrorHandling(); - if (!$err) { - // skip parameters that were missed by preferred_state - continue; - } - - if (PEAR::isError($err)) { - if (!isset($this->_options['soft']) && $err->getMessage() !== '') { - $this->log(0, $err->getMessage()); - } - - $params[$i] = false; - if (is_object($param)) { - $param = $param->getChannel() . '/' . $param->getPackage(); - } - - if (!isset($this->_options['soft'])) { - $this->log(2, 'Package "' . $param . '" is not valid'); - } - - // Message logged above in a specific verbose mode, passing null to not show up on CLI - $this->pushError(null, PEAR_INSTALLER_SKIPPED); - } else { - do { - if ($params[$i] && $params[$i]->getType() == 'local') { - // bug #7090 skip channel.xml check for local packages - break; - } - - if ($params[$i] && !isset($channelschecked[$params[$i]->getChannel()]) && - !isset($this->_options['offline']) - ) { - $channelschecked[$params[$i]->getChannel()] = true; - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - if (!class_exists('System')) { - require_once 'System.php'; - } - - $curchannel = &$this->_registry->getChannel($params[$i]->getChannel()); - if (PEAR::isError($curchannel)) { - PEAR::staticPopErrorHandling(); - return $this->raiseError($curchannel); - } - - if (PEAR::isError($dir = $this->getDownloadDir())) { - PEAR::staticPopErrorHandling(); - break; - } - - $mirror = $this->config->get('preferred_mirror', null, $params[$i]->getChannel()); - $url = 'http://' . $mirror . '/channel.xml'; - $a = $this->downloadHttp($url, $this->ui, $dir, null, $curchannel->lastModified()); - - PEAR::staticPopErrorHandling(); - if (PEAR::isError($a) || !$a) { - // Attempt fallback to https automatically - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $a = $this->downloadHttp('https://' . $mirror . - '/channel.xml', $this->ui, $dir, null, $curchannel->lastModified()); - - PEAR::staticPopErrorHandling(); - if (PEAR::isError($a) || !$a) { - break; - } - } - $this->log(0, 'WARNING: channel "' . $params[$i]->getChannel() . '" has ' . - 'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $params[$i]->getChannel() . - '" to update'); - } - } while (false); - - if ($params[$i] && !isset($this->_options['downloadonly'])) { - if (isset($this->_options['packagingroot'])) { - $checkdir = $this->_prependPath( - $this->config->get('php_dir', null, $params[$i]->getChannel()), - $this->_options['packagingroot']); - } else { - $checkdir = $this->config->get('php_dir', - null, $params[$i]->getChannel()); - } - - while ($checkdir && $checkdir != '/' && !file_exists($checkdir)) { - $checkdir = dirname($checkdir); - } - - if ($checkdir == '.') { - $checkdir = '/'; - } - - if (!is_writeable($checkdir)) { - return PEAR::raiseError('Cannot install, php_dir for channel "' . - $params[$i]->getChannel() . '" is not writeable by the current user'); - } - } - } - } - - unset($channelschecked); - PEAR_Downloader_Package::removeDuplicates($params); - if (!count($params)) { - $a = array(); - return $a; - } - - if (!isset($this->_options['nodeps']) && !isset($this->_options['offline'])) { - $reverify = true; - while ($reverify) { - $reverify = false; - foreach ($params as $i => $param) { - //PHP Bug 40768 / PEAR Bug #10944 - //Nested foreaches fail in PHP 5.2.1 - key($params); - $ret = $params[$i]->detectDependencies($params); - if (PEAR::isError($ret)) { - $reverify = true; - $params[$i] = false; - PEAR_Downloader_Package::removeDuplicates($params); - if (!isset($this->_options['soft'])) { - $this->log(0, $ret->getMessage()); - } - continue 2; - } - } - } - } - - if (isset($this->_options['offline'])) { - $this->log(3, 'Skipping dependency download check, --offline specified'); - } - - if (!count($params)) { - $a = array(); - return $a; - } - - while (PEAR_Downloader_Package::mergeDependencies($params)); - PEAR_Downloader_Package::removeDuplicates($params, true); - $errorparams = array(); - if (PEAR_Downloader_Package::detectStupidDuplicates($params, $errorparams)) { - if (count($errorparams)) { - foreach ($errorparams as $param) { - $name = $this->_registry->parsedPackageNameToString($param->getParsedPackage()); - $this->pushError('Duplicate package ' . $name . ' found', PEAR_INSTALLER_FAILED); - } - $a = array(); - return $a; - } - } - - PEAR_Downloader_Package::removeInstalled($params); - if (!count($params)) { - $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED); - $a = array(); - return $a; - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->analyzeDependencies($params); - PEAR::popErrorHandling(); - if (!count($params)) { - $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED); - $a = array(); - return $a; - } - - $ret = array(); - $newparams = array(); - if (isset($this->_options['pretend'])) { - return $params; - } - - $somefailed = false; - foreach ($params as $i => $package) { - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $pf = &$params[$i]->download(); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($pf)) { - if (!isset($this->_options['soft'])) { - $this->log(1, $pf->getMessage()); - $this->log(0, 'Error: cannot download "' . - $this->_registry->parsedPackageNameToString($package->getParsedPackage(), - true) . - '"'); - } - $somefailed = true; - continue; - } - - $newparams[] = &$params[$i]; - $ret[] = array( - 'file' => $pf->getArchiveFile(), - 'info' => &$pf, - 'pkg' => $pf->getPackage() - ); - } - - if ($somefailed) { - // remove params that did not download successfully - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->analyzeDependencies($newparams, true); - PEAR::popErrorHandling(); - if (!count($newparams)) { - $this->pushError('Download failed', PEAR_INSTALLER_FAILED); - $a = array(); - return $a; - } - } - - $this->_downloadedPackages = $ret; - return $newparams; - } - - /** - * @param array all packages to be installed - */ - function analyzeDependencies(&$params, $force = false) - { - if (isset($this->_options['downloadonly'])) { - return; - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $redo = true; - $reset = $hasfailed = $failed = false; - while ($redo) { - $redo = false; - foreach ($params as $i => $param) { - $deps = $param->getDeps(); - if (!$deps) { - $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(), - $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING); - $send = $param->getPackageFile(); - - $installcheck = $depchecker->validatePackage($send, $this, $params); - if (PEAR::isError($installcheck)) { - if (!isset($this->_options['soft'])) { - $this->log(0, $installcheck->getMessage()); - } - $hasfailed = true; - $params[$i] = false; - $reset = true; - $redo = true; - $failed = false; - PEAR_Downloader_Package::removeDuplicates($params); - continue 2; - } - continue; - } - - if (!$reset && $param->alreadyValidated() && !$force) { - continue; - } - - if (count($deps)) { - $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(), - $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING); - $send = $param->getPackageFile(); - if ($send === null) { - $send = $param->getDownloadURL(); - } - - $installcheck = $depchecker->validatePackage($send, $this, $params); - if (PEAR::isError($installcheck)) { - if (!isset($this->_options['soft'])) { - $this->log(0, $installcheck->getMessage()); - } - $hasfailed = true; - $params[$i] = false; - $reset = true; - $redo = true; - $failed = false; - PEAR_Downloader_Package::removeDuplicates($params); - continue 2; - } - - $failed = false; - if (isset($deps['required']) && is_array($deps['required'])) { - foreach ($deps['required'] as $type => $dep) { - // note: Dependency2 will never return a PEAR_Error if ignore-errors - // is specified, so soft is needed to turn off logging - if (!isset($dep[0])) { - if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep, - true, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } else { - foreach ($dep as $d) { - if (PEAR::isError($e = - $depchecker->{"validate{$type}Dependency"}($d, - true, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } - } - } - - if (isset($deps['optional']) && is_array($deps['optional'])) { - foreach ($deps['optional'] as $type => $dep) { - if (!isset($dep[0])) { - if (PEAR::isError($e = - $depchecker->{"validate{$type}Dependency"}($dep, - false, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } else { - foreach ($dep as $d) { - if (PEAR::isError($e = - $depchecker->{"validate{$type}Dependency"}($d, - false, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } - } - } - } - - $groupname = $param->getGroup(); - if (isset($deps['group']) && $groupname) { - if (!isset($deps['group'][0])) { - $deps['group'] = array($deps['group']); - } - - $found = false; - foreach ($deps['group'] as $group) { - if ($group['attribs']['name'] == $groupname) { - $found = true; - break; - } - } - - if ($found) { - unset($group['attribs']); - foreach ($group as $type => $dep) { - if (!isset($dep[0])) { - if (PEAR::isError($e = - $depchecker->{"validate{$type}Dependency"}($dep, - false, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } else { - foreach ($dep as $d) { - if (PEAR::isError($e = - $depchecker->{"validate{$type}Dependency"}($d, - false, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } - } - } - } - } - } else { - foreach ($deps as $dep) { - if (PEAR::isError($e = $depchecker->validateDependency1($dep, $params))) { - $failed = true; - if (!isset($this->_options['soft'])) { - $this->log(0, $e->getMessage()); - } - } elseif (is_array($e) && !$param->alreadyValidated()) { - if (!isset($this->_options['soft'])) { - $this->log(0, $e[0]); - } - } - } - } - $params[$i]->setValidated(); - } - - if ($failed) { - $hasfailed = true; - $params[$i] = false; - $reset = true; - $redo = true; - $failed = false; - PEAR_Downloader_Package::removeDuplicates($params); - continue 2; - } - } - } - - PEAR::staticPopErrorHandling(); - if ($hasfailed && (isset($this->_options['ignore-errors']) || - isset($this->_options['nodeps']))) { - // this is probably not needed, but just in case - if (!isset($this->_options['soft'])) { - $this->log(0, 'WARNING: dependencies failed'); - } - } - } - - /** - * Retrieve the directory that downloads will happen in - * @access private - * @return string - */ - function getDownloadDir() - { - if (isset($this->_downloadDir)) { - return $this->_downloadDir; - } - - $downloaddir = $this->config->get('download_dir'); - if (empty($downloaddir) || (is_dir($downloaddir) && !is_writable($downloaddir))) { - if (is_dir($downloaddir) && !is_writable($downloaddir)) { - $this->log(0, 'WARNING: configuration download directory "' . $downloaddir . - '" is not writeable. Change download_dir config variable to ' . - 'a writeable dir to avoid this warning'); - } - - if (!class_exists('System')) { - require_once 'System.php'; - } - - if (PEAR::isError($downloaddir = System::mktemp('-d'))) { - return $downloaddir; - } - $this->log(3, '+ tmp dir created at ' . $downloaddir); - } - - if (!is_writable($downloaddir)) { - if (PEAR::isError(System::mkdir(array('-p', $downloaddir))) || - !is_writable($downloaddir)) { - return PEAR::raiseError('download directory "' . $downloaddir . - '" is not writeable. Change download_dir config variable to ' . - 'a writeable dir'); - } - } - - return $this->_downloadDir = $downloaddir; - } - - function setDownloadDir($dir) - { - if (!@is_writable($dir)) { - if (PEAR::isError(System::mkdir(array('-p', $dir)))) { - return PEAR::raiseError('download directory "' . $dir . - '" is not writeable. Change download_dir config variable to ' . - 'a writeable dir'); - } - } - $this->_downloadDir = $dir; - } - - function configSet($key, $value, $layer = 'user', $channel = false) - { - $this->config->set($key, $value, $layer, $channel); - $this->_preferredState = $this->config->get('preferred_state', null, $channel); - if (!$this->_preferredState) { - // don't inadvertantly use a non-set preferred_state - $this->_preferredState = null; - } - } - - function setOptions($options) - { - $this->_options = $options; - } - - function getOptions() - { - return $this->_options; - } - - - /** - * @param array output of {@link parsePackageName()} - * @access private - */ - function _getPackageDownloadUrl($parr) - { - $curchannel = $this->config->get('default_channel'); - $this->configSet('default_channel', $parr['channel']); - // getDownloadURL returns an array. On error, it only contains information - // on the latest release as array(version, info). On success it contains - // array(version, info, download url string) - $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state'); - if (!$this->_registry->channelExists($parr['channel'])) { - do { - if ($this->config->get('auto_discover') && $this->discover($parr['channel'])) { - break; - } - - $this->configSet('default_channel', $curchannel); - return PEAR::raiseError('Unknown remote channel: ' . $parr['channel']); - } while (false); - } - - $chan = &$this->_registry->getChannel($parr['channel']); - if (PEAR::isError($chan)) { - return $chan; - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $version = $this->_registry->packageInfo($parr['package'], 'version', $parr['channel']); - $stability = $this->_registry->packageInfo($parr['package'], 'stability', $parr['channel']); - // package is installed - use the installed release stability level - if (!isset($parr['state']) && $stability !== null) { - $state = $stability['release']; - } - PEAR::staticPopErrorHandling(); - $base2 = false; - - $preferred_mirror = $this->config->get('preferred_mirror'); - if (!$chan->supportsREST($preferred_mirror) || - ( - !($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror)) - && - !($base = $chan->getBaseURL('REST1.0', $preferred_mirror)) - ) - ) { - return $this->raiseError($parr['channel'] . ' is using a unsupported protocol - This should never happen.'); - } - - if ($base2) { - $rest = &$this->config->getREST('1.3', $this->_options); - $base = $base2; - } else { - $rest = &$this->config->getREST('1.0', $this->_options); - } - - $downloadVersion = false; - if (!isset($parr['version']) && !isset($parr['state']) && $version - && !PEAR::isError($version) - && !isset($this->_options['downloadonly']) - ) { - $downloadVersion = $version; - } - - $url = $rest->getDownloadURL($base, $parr, $state, $downloadVersion, $chan->getName()); - if (PEAR::isError($url)) { - $this->configSet('default_channel', $curchannel); - return $url; - } - - if ($parr['channel'] != $curchannel) { - $this->configSet('default_channel', $curchannel); - } - - if (!is_array($url)) { - return $url; - } - - $url['raw'] = false; // no checking is necessary for REST - if (!is_array($url['info'])) { - return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' . - 'this should never happen'); - } - - if (!isset($this->_options['force']) && - !isset($this->_options['downloadonly']) && - $version && - !PEAR::isError($version) && - !isset($parr['group']) - ) { - if (version_compare($version, $url['version'], '=')) { - return PEAR::raiseError($this->_registry->parsedPackageNameToString( - $parr, true) . ' is already installed and is the same as the ' . - 'released version ' . $url['version'], -976); - } - - if (version_compare($version, $url['version'], '>')) { - return PEAR::raiseError($this->_registry->parsedPackageNameToString( - $parr, true) . ' is already installed and is newer than detected ' . - 'released version ' . $url['version'], -976); - } - } - - if (isset($url['info']['required']) || $url['compatible']) { - require_once 'PEAR/PackageFile/v2.php'; - $pf = new PEAR_PackageFile_v2; - $pf->setRawChannel($parr['channel']); - if ($url['compatible']) { - $pf->setRawCompatible($url['compatible']); - } - } else { - require_once 'PEAR/PackageFile/v1.php'; - $pf = new PEAR_PackageFile_v1; - } - - $pf->setRawPackage($url['package']); - $pf->setDeps($url['info']); - if ($url['compatible']) { - $pf->setCompatible($url['compatible']); - } - - $pf->setRawState($url['stability']); - $url['info'] = &$pf; - if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) { - $ext = '.tar'; - } else { - $ext = '.tgz'; - } - - if (is_array($url) && isset($url['url'])) { - $url['url'] .= $ext; - } - - return $url; - } - - /** - * @param array dependency array - * @access private - */ - function _getDepPackageDownloadUrl($dep, $parr) - { - $xsdversion = isset($dep['rel']) ? '1.0' : '2.0'; - $curchannel = $this->config->get('default_channel'); - if (isset($dep['uri'])) { - $xsdversion = '2.0'; - $chan = &$this->_registry->getChannel('__uri'); - if (PEAR::isError($chan)) { - return $chan; - } - - $version = $this->_registry->packageInfo($dep['name'], 'version', '__uri'); - $this->configSet('default_channel', '__uri'); - } else { - if (isset($dep['channel'])) { - $remotechannel = $dep['channel']; - } else { - $remotechannel = 'pear.php.net'; - } - - if (!$this->_registry->channelExists($remotechannel)) { - do { - if ($this->config->get('auto_discover')) { - if ($this->discover($remotechannel)) { - break; - } - } - return PEAR::raiseError('Unknown remote channel: ' . $remotechannel); - } while (false); - } - - $chan = &$this->_registry->getChannel($remotechannel); - if (PEAR::isError($chan)) { - return $chan; - } - - $version = $this->_registry->packageInfo($dep['name'], 'version', $remotechannel); - $this->configSet('default_channel', $remotechannel); - } - - $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state'); - if (isset($parr['state']) && isset($parr['version'])) { - unset($parr['state']); - } - - if (isset($dep['uri'])) { - $info = &$this->newDownloaderPackage($this); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $err = $info->initialize($dep); - PEAR::staticPopErrorHandling(); - if (!$err) { - // skip parameters that were missed by preferred_state - return PEAR::raiseError('Cannot initialize dependency'); - } - - if (PEAR::isError($err)) { - if (!isset($this->_options['soft'])) { - $this->log(0, $err->getMessage()); - } - - if (is_object($info)) { - $param = $info->getChannel() . '/' . $info->getPackage(); - } - return PEAR::raiseError('Package "' . $param . '" is not valid'); - } - return $info; - } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) - && - ( - ($base2 = $chan->getBaseURL('REST1.3', $this->config->get('preferred_mirror'))) - || - ($base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) - ) - ) { - if ($base2) { - $base = $base2; - $rest = &$this->config->getREST('1.3', $this->_options); - } else { - $rest = &$this->config->getREST('1.0', $this->_options); - } - - $url = $rest->getDepDownloadURL($base, $xsdversion, $dep, $parr, - $state, $version, $chan->getName()); - if (PEAR::isError($url)) { - return $url; - } - - if ($parr['channel'] != $curchannel) { - $this->configSet('default_channel', $curchannel); - } - - if (!is_array($url)) { - return $url; - } - - $url['raw'] = false; // no checking is necessary for REST - if (!is_array($url['info'])) { - return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' . - 'this should never happen'); - } - - if (isset($url['info']['required'])) { - if (!class_exists('PEAR_PackageFile_v2')) { - require_once 'PEAR/PackageFile/v2.php'; - } - $pf = new PEAR_PackageFile_v2; - $pf->setRawChannel($remotechannel); - } else { - if (!class_exists('PEAR_PackageFile_v1')) { - require_once 'PEAR/PackageFile/v1.php'; - } - $pf = new PEAR_PackageFile_v1; - - } - $pf->setRawPackage($url['package']); - $pf->setDeps($url['info']); - if ($url['compatible']) { - $pf->setCompatible($url['compatible']); - } - - $pf->setRawState($url['stability']); - $url['info'] = &$pf; - if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) { - $ext = '.tar'; - } else { - $ext = '.tgz'; - } - - if (is_array($url) && isset($url['url'])) { - $url['url'] .= $ext; - } - - return $url; - } - - return $this->raiseError($parr['channel'] . ' is using a unsupported protocol - This should never happen.'); - } - - /** - * @deprecated in favor of _getPackageDownloadUrl - */ - function getPackageDownloadUrl($package, $version = null, $channel = false) - { - if ($version) { - $package .= "-$version"; - } - if ($this === null || $this->_registry === null) { - $package = "http://pear.php.net/get/$package"; - } else { - $chan = $this->_registry->getChannel($channel); - if (PEAR::isError($chan)) { - return ''; - } - $package = "http://" . $chan->getServer() . "/get/$package"; - } - if (!extension_loaded("zlib")) { - $package .= '?uncompress=yes'; - } - return $package; - } - - /** - * Retrieve a list of downloaded packages after a call to {@link download()}. - * - * Also resets the list of downloaded packages. - * @return array - */ - function getDownloadedPackages() - { - $ret = $this->_downloadedPackages; - $this->_downloadedPackages = array(); - $this->_toDownload = array(); - return $ret; - } - - function _downloadCallback($msg, $params = null) - { - switch ($msg) { - case 'saveas': - $this->log(1, "downloading $params ..."); - break; - case 'done': - $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes'); - break; - case 'bytesread': - static $bytes; - if (empty($bytes)) { - $bytes = 0; - } - if (!($bytes % 10240)) { - $this->log(1, '.', false); - } - $bytes += $params; - break; - case 'start': - if($params[1] == -1) { - $length = "Unknown size"; - } else { - $length = number_format($params[1], 0, '', ',')." bytes"; - } - $this->log(1, "Starting to download {$params[0]} ($length)"); - break; - } - if (method_exists($this->ui, '_downloadCallback')) - $this->ui->_downloadCallback($msg, $params); - } - - function _prependPath($path, $prepend) - { - if (strlen($prepend) > 0) { - if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) { - if (preg_match('/^[a-z]:/i', $prepend)) { - $prepend = substr($prepend, 2); - } elseif ($prepend{0} != '\\') { - $prepend = "\\$prepend"; - } - $path = substr($path, 0, 2) . $prepend . substr($path, 2); - } else { - $path = $prepend . $path; - } - } - return $path; - } - - /** - * @param string - * @param integer - */ - function pushError($errmsg, $code = -1) - { - array_push($this->_errorStack, array($errmsg, $code)); - } - - function getErrorMsgs() - { - $msgs = array(); - $errs = $this->_errorStack; - foreach ($errs as $err) { - $msgs[] = $err[0]; - } - $this->_errorStack = array(); - return $msgs; - } - - /** - * for BC - * - * @deprecated - */ - function sortPkgDeps(&$packages, $uninstall = false) - { - $uninstall ? - $this->sortPackagesForUninstall($packages) : - $this->sortPackagesForInstall($packages); - } - - /** - * Sort a list of arrays of array(downloaded packagefilename) by dependency. - * - * This uses the topological sort method from graph theory, and the - * Structures_Graph package to properly sort dependencies for installation. - * @param array an array of downloaded PEAR_Downloader_Packages - * @return array array of array(packagefilename, package.xml contents) - */ - function sortPackagesForInstall(&$packages) - { - require_once 'Structures/Graph.php'; - require_once 'Structures/Graph/Node.php'; - require_once 'Structures/Graph/Manipulator/TopologicalSorter.php'; - $depgraph = new Structures_Graph(true); - $nodes = array(); - $reg = &$this->config->getRegistry(); - foreach ($packages as $i => $package) { - $pname = $reg->parsedPackageNameToString( - array( - 'channel' => $package->getChannel(), - 'package' => strtolower($package->getPackage()), - )); - $nodes[$pname] = new Structures_Graph_Node; - $nodes[$pname]->setData($packages[$i]); - $depgraph->addNode($nodes[$pname]); - } - - $deplinks = array(); - foreach ($nodes as $package => $node) { - $pf = &$node->getData(); - $pdeps = $pf->getDeps(true); - if (!$pdeps) { - continue; - } - - if ($pf->getPackagexmlVersion() == '1.0') { - foreach ($pdeps as $dep) { - if ($dep['type'] != 'pkg' || - (isset($dep['optional']) && $dep['optional'] == 'yes')) { - continue; - } - - $dname = $reg->parsedPackageNameToString( - array( - 'channel' => 'pear.php.net', - 'package' => strtolower($dep['name']), - )); - - if (isset($nodes[$dname])) { - if (!isset($deplinks[$dname])) { - $deplinks[$dname] = array(); - } - - $deplinks[$dname][$package] = 1; - // dependency is in installed packages - continue; - } - - $dname = $reg->parsedPackageNameToString( - array( - 'channel' => 'pecl.php.net', - 'package' => strtolower($dep['name']), - )); - - if (isset($nodes[$dname])) { - if (!isset($deplinks[$dname])) { - $deplinks[$dname] = array(); - } - - $deplinks[$dname][$package] = 1; - // dependency is in installed packages - continue; - } - } - } else { - // the only ordering we care about is: - // 1) subpackages must be installed before packages that depend on them - // 2) required deps must be installed before packages that depend on them - if (isset($pdeps['required']['subpackage'])) { - $t = $pdeps['required']['subpackage']; - if (!isset($t[0])) { - $t = array($t); - } - - $this->_setupGraph($t, $reg, $deplinks, $nodes, $package); - } - - if (isset($pdeps['group'])) { - if (!isset($pdeps['group'][0])) { - $pdeps['group'] = array($pdeps['group']); - } - - foreach ($pdeps['group'] as $group) { - if (isset($group['subpackage'])) { - $t = $group['subpackage']; - if (!isset($t[0])) { - $t = array($t); - } - - $this->_setupGraph($t, $reg, $deplinks, $nodes, $package); - } - } - } - - if (isset($pdeps['optional']['subpackage'])) { - $t = $pdeps['optional']['subpackage']; - if (!isset($t[0])) { - $t = array($t); - } - - $this->_setupGraph($t, $reg, $deplinks, $nodes, $package); - } - - if (isset($pdeps['required']['package'])) { - $t = $pdeps['required']['package']; - if (!isset($t[0])) { - $t = array($t); - } - - $this->_setupGraph($t, $reg, $deplinks, $nodes, $package); - } - - if (isset($pdeps['group'])) { - if (!isset($pdeps['group'][0])) { - $pdeps['group'] = array($pdeps['group']); - } - - foreach ($pdeps['group'] as $group) { - if (isset($group['package'])) { - $t = $group['package']; - if (!isset($t[0])) { - $t = array($t); - } - - $this->_setupGraph($t, $reg, $deplinks, $nodes, $package); - } - } - } - } - } - - $this->_detectDepCycle($deplinks); - foreach ($deplinks as $dependent => $parents) { - foreach ($parents as $parent => $unused) { - $nodes[$dependent]->connectTo($nodes[$parent]); - } - } - - $installOrder = Structures_Graph_Manipulator_TopologicalSorter::sort($depgraph); - $ret = array(); - for ($i = 0, $count = count($installOrder); $i < $count; $i++) { - foreach ($installOrder[$i] as $index => $sortedpackage) { - $data = &$installOrder[$i][$index]->getData(); - $ret[] = &$nodes[$reg->parsedPackageNameToString( - array( - 'channel' => $data->getChannel(), - 'package' => strtolower($data->getPackage()), - ))]->getData(); - } - } - - $packages = $ret; - return; - } - - /** - * Detect recursive links between dependencies and break the cycles - * - * @param array - * @access private - */ - function _detectDepCycle(&$deplinks) - { - do { - $keepgoing = false; - foreach ($deplinks as $dep => $parents) { - foreach ($parents as $parent => $unused) { - // reset the parent cycle detector - $this->_testCycle(null, null, null); - if ($this->_testCycle($dep, $deplinks, $parent)) { - $keepgoing = true; - unset($deplinks[$dep][$parent]); - if (count($deplinks[$dep]) == 0) { - unset($deplinks[$dep]); - } - - continue 3; - } - } - } - } while ($keepgoing); - } - - function _testCycle($test, $deplinks, $dep) - { - static $visited = array(); - if ($test === null) { - $visited = array(); - return; - } - - // this happens when a parent has a dep cycle on another dependency - // but the child is not part of the cycle - if (isset($visited[$dep])) { - return false; - } - - $visited[$dep] = 1; - if ($test == $dep) { - return true; - } - - if (isset($deplinks[$dep])) { - if (in_array($test, array_keys($deplinks[$dep]), true)) { - return true; - } - - foreach ($deplinks[$dep] as $parent => $unused) { - if ($this->_testCycle($test, $deplinks, $parent)) { - return true; - } - } - } - - return false; - } - - /** - * Set up the dependency for installation parsing - * - * @param array $t dependency information - * @param PEAR_Registry $reg - * @param array $deplinks list of dependency links already established - * @param array $nodes all existing package nodes - * @param string $package parent package name - * @access private - */ - function _setupGraph($t, $reg, &$deplinks, &$nodes, $package) - { - foreach ($t as $dep) { - $depchannel = !isset($dep['channel']) ? '__uri': $dep['channel']; - $dname = $reg->parsedPackageNameToString( - array( - 'channel' => $depchannel, - 'package' => strtolower($dep['name']), - )); - - if (isset($nodes[$dname])) { - if (!isset($deplinks[$dname])) { - $deplinks[$dname] = array(); - } - $deplinks[$dname][$package] = 1; - } - } - } - - function _dependsOn($a, $b) - { - return $this->_checkDepTree(strtolower($a->getChannel()), strtolower($a->getPackage()), $b); - } - - function _checkDepTree($channel, $package, $b, $checked = array()) - { - $checked[$channel][$package] = true; - if (!isset($this->_depTree[$channel][$package])) { - return false; - } - - if (isset($this->_depTree[$channel][$package][strtolower($b->getChannel())] - [strtolower($b->getPackage())])) { - return true; - } - - foreach ($this->_depTree[$channel][$package] as $ch => $packages) { - foreach ($packages as $pa => $true) { - if ($this->_checkDepTree($ch, $pa, $b, $checked)) { - return true; - } - } - } - - return false; - } - - function _sortInstall($a, $b) - { - if (!$a->getDeps() && !$b->getDeps()) { - return 0; // neither package has dependencies, order is insignificant - } - if ($a->getDeps() && !$b->getDeps()) { - return 1; // $a must be installed after $b because $a has dependencies - } - if (!$a->getDeps() && $b->getDeps()) { - return -1; // $b must be installed after $a because $b has dependencies - } - // both packages have dependencies - if ($this->_dependsOn($a, $b)) { - return 1; - } - if ($this->_dependsOn($b, $a)) { - return -1; - } - return 0; - } - - /** - * Download a file through HTTP. Considers suggested file name in - * Content-disposition: header and can run a callback function for - * different events. The callback will be called with two - * parameters: the callback type, and parameters. The implemented - * callback types are: - * - * 'setup' called at the very beginning, parameter is a UI object - * that should be used for all output - * 'message' the parameter is a string with an informational message - * 'saveas' may be used to save with a different file name, the - * parameter is the filename that is about to be used. - * If a 'saveas' callback returns a non-empty string, - * that file name will be used as the filename instead. - * Note that $save_dir will not be affected by this, only - * the basename of the file. - * 'start' download is starting, parameter is number of bytes - * that are expected, or -1 if unknown - * 'bytesread' parameter is the number of bytes read so far - * 'done' download is complete, parameter is the total number - * of bytes read - * 'connfailed' if the TCP/SSL connection fails, this callback is called - * with array(host,port,errno,errmsg) - * 'writefailed' if writing to disk fails, this callback is called - * with array(destfile,errmsg) - * - * If an HTTP proxy has been configured (http_proxy PEAR_Config - * setting), the proxy will be used. - * - * @param string $url the URL to download - * @param object $ui PEAR_Frontend_* instance - * @param object $config PEAR_Config instance - * @param string $save_dir directory to save file in - * @param mixed $callback function/method to call for status - * updates - * @param false|string|array $lastmodified header values to check against for caching - * use false to return the header values from this download - * @param false|array $accept Accept headers to send - * @param false|string $channel Channel to use for retrieving authentication - * @return string|array Returns the full path of the downloaded file or a PEAR - * error on failure. If the error is caused by - * socket-related errors, the error object will - * have the fsockopen error code available through - * getCode(). If caching is requested, then return the header - * values. - * - * @access public - */ - function downloadHttp($url, &$ui, $save_dir = '.', $callback = null, $lastmodified = null, - $accept = false, $channel = false) - { - static $redirect = 0; - // always reset , so we are clean case of error - $wasredirect = $redirect; - $redirect = 0; - if ($callback) { - call_user_func($callback, 'setup', array(&$ui)); - } - - $info = parse_url($url); - if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) { - return PEAR::raiseError('Cannot download non-http URL "' . $url . '"'); - } - - if (!isset($info['host'])) { - return PEAR::raiseError('Cannot download from non-URL "' . $url . '"'); - } - - $host = isset($info['host']) ? $info['host'] : null; - $port = isset($info['port']) ? $info['port'] : null; - $path = isset($info['path']) ? $info['path'] : null; - - if (isset($this)) { - $config = &$this->config; - } else { - $config = &PEAR_Config::singleton(); - } - - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - if ($config->get('http_proxy') && - $proxy = parse_url($config->get('http_proxy'))) { - $proxy_host = isset($proxy['host']) ? $proxy['host'] : null; - if (isset($proxy['scheme']) && $proxy['scheme'] == 'https') { - $proxy_host = 'ssl://' . $proxy_host; - } - $proxy_port = isset($proxy['port']) ? $proxy['port'] : 8080; - $proxy_user = isset($proxy['user']) ? urldecode($proxy['user']) : null; - $proxy_pass = isset($proxy['pass']) ? urldecode($proxy['pass']) : null; - - if ($callback) { - call_user_func($callback, 'message', "Using HTTP proxy $host:$port"); - } - } - - if (empty($port)) { - $port = (isset($info['scheme']) && $info['scheme'] == 'https') ? 443 : 80; - } - - $scheme = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http'; - - if ($proxy_host != '') { - $fp = @fsockopen($proxy_host, $proxy_port, $errno, $errstr); - if (!$fp) { - if ($callback) { - call_user_func($callback, 'connfailed', array($proxy_host, $proxy_port, - $errno, $errstr)); - } - return PEAR::raiseError("Connection to `$proxy_host:$proxy_port' failed: $errstr", $errno); - } - - if ($lastmodified === false || $lastmodified) { - $request = "GET $url HTTP/1.1\r\n"; - $request .= "Host: $host\r\n"; - } else { - $request = "GET $url HTTP/1.0\r\n"; - $request .= "Host: $host\r\n"; - } - } else { - $network_host = $host; - if (isset($info['scheme']) && $info['scheme'] == 'https') { - $network_host = 'ssl://' . $host; - } - - $fp = @fsockopen($network_host, $port, $errno, $errstr); - if (!$fp) { - if ($callback) { - call_user_func($callback, 'connfailed', array($host, $port, - $errno, $errstr)); - } - return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno); - } - - if ($lastmodified === false || $lastmodified) { - $request = "GET $path HTTP/1.1\r\n"; - $request .= "Host: $host\r\n"; - } else { - $request = "GET $path HTTP/1.0\r\n"; - $request .= "Host: $host\r\n"; - } - } - - $ifmodifiedsince = ''; - if (is_array($lastmodified)) { - if (isset($lastmodified['Last-Modified'])) { - $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n"; - } - - if (isset($lastmodified['ETag'])) { - $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n"; - } - } else { - $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : ''); - } - - $request .= $ifmodifiedsince . - "User-Agent: PEAR/1.9.4/PHP/" . PHP_VERSION . "\r\n"; - - if (isset($this)) { // only pass in authentication for non-static calls - $username = $config->get('username', null, $channel); - $password = $config->get('password', null, $channel); - if ($username && $password) { - $tmp = base64_encode("$username:$password"); - $request .= "Authorization: Basic $tmp\r\n"; - } - } - - if ($proxy_host != '' && $proxy_user != '') { - $request .= 'Proxy-Authorization: Basic ' . - base64_encode($proxy_user . ':' . $proxy_pass) . "\r\n"; - } - - if ($accept) { - $request .= 'Accept: ' . implode(', ', $accept) . "\r\n"; - } - - $request .= "Connection: close\r\n"; - $request .= "\r\n"; - fwrite($fp, $request); - $headers = array(); - $reply = 0; - while (trim($line = fgets($fp, 1024))) { - if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) { - $headers[strtolower($matches[1])] = trim($matches[2]); - } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) { - $reply = (int)$matches[1]; - if ($reply == 304 && ($lastmodified || ($lastmodified === false))) { - return false; - } - - if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) { - return PEAR::raiseError("File $scheme://$host:$port$path not valid (received: $line)"); - } - } - } - - if ($reply != 200) { - if (!isset($headers['location'])) { - return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirected but no location)"); - } - - if ($wasredirect > 4) { - return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirection looped more than 5 times)"); - } - - $redirect = $wasredirect + 1; - return $this->downloadHttp($headers['location'], - $ui, $save_dir, $callback, $lastmodified, $accept); - } - - if (isset($headers['content-disposition']) && - preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|\\z)/', $headers['content-disposition'], $matches)) { - $save_as = basename($matches[1]); - } else { - $save_as = basename($url); - } - - if ($callback) { - $tmp = call_user_func($callback, 'saveas', $save_as); - if ($tmp) { - $save_as = $tmp; - } - } - - $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as; - if (is_link($dest_file)) { - return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $dest_file . ' as it is symlinked to ' . readlink($dest_file) . ' - Possible symlink attack'); - } - - if (!$wp = @fopen($dest_file, 'wb')) { - fclose($fp); - if ($callback) { - call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); - } - return PEAR::raiseError("could not open $dest_file for writing"); - } - - $length = isset($headers['content-length']) ? $headers['content-length'] : -1; - - $bytes = 0; - if ($callback) { - call_user_func($callback, 'start', array(basename($dest_file), $length)); - } - - while ($data = fread($fp, 1024)) { - $bytes += strlen($data); - if ($callback) { - call_user_func($callback, 'bytesread', $bytes); - } - if (!@fwrite($wp, $data)) { - fclose($fp); - if ($callback) { - call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); - } - return PEAR::raiseError("$dest_file: write failed ($php_errormsg)"); - } - } - - fclose($fp); - fclose($wp); - if ($callback) { - call_user_func($callback, 'done', $bytes); - } - - if ($lastmodified === false || $lastmodified) { - if (isset($headers['etag'])) { - $lastmodified = array('ETag' => $headers['etag']); - } - - if (isset($headers['last-modified'])) { - if (is_array($lastmodified)) { - $lastmodified['Last-Modified'] = $headers['last-modified']; - } else { - $lastmodified = $headers['last-modified']; - } - } - return array($dest_file, $lastmodified, $headers); - } - return $dest_file; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Downloader/Package.php b/3rdparty/PEAR/Downloader/Package.php deleted file mode 100644 index 987c965675..0000000000 --- a/3rdparty/PEAR/Downloader/Package.php +++ /dev/null @@ -1,1988 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Package.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Error code when parameter initialization fails because no releases - * exist within preferred_state, but releases do exist - */ -define('PEAR_DOWNLOADER_PACKAGE_STATE', -1003); -/** - * Error code when parameter initialization fails because no releases - * exist that will work with the existing PHP version - */ -define('PEAR_DOWNLOADER_PACKAGE_PHPVERSION', -1004); - -/** - * Coordinates download parameters and manages their dependencies - * prior to downloading them. - * - * Input can come from three sources: - * - * - local files (archives or package.xml) - * - remote files (downloadable urls) - * - abstract package names - * - * The first two elements are handled cleanly by PEAR_PackageFile, but the third requires - * accessing pearweb's xml-rpc interface to determine necessary dependencies, and the - * format returned of dependencies is slightly different from that used in package.xml. - * - * This class hides the differences between these elements, and makes automatic - * dependency resolution a piece of cake. It also manages conflicts when - * two classes depend on incompatible dependencies, or differing versions of the same - * package dependency. In addition, download will not be attempted if the php version is - * not supported, PEAR installer version is not supported, or non-PECL extensions are not - * installed. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Downloader_Package -{ - /** - * @var PEAR_Downloader - */ - var $_downloader; - /** - * @var PEAR_Config - */ - var $_config; - /** - * @var PEAR_Registry - */ - var $_registry; - /** - * Used to implement packagingroot properly - * @var PEAR_Registry - */ - var $_installRegistry; - /** - * @var PEAR_PackageFile_v1|PEAR_PackageFile|v2 - */ - var $_packagefile; - /** - * @var array - */ - var $_parsedname; - /** - * @var array - */ - var $_downloadURL; - /** - * @var array - */ - var $_downloadDeps = array(); - /** - * @var boolean - */ - var $_valid = false; - /** - * @var boolean - */ - var $_analyzed = false; - /** - * if this or a parent package was invoked with Package-state, this is set to the - * state variable. - * - * This allows temporary reassignment of preferred_state for a parent package and all of - * its dependencies. - * @var string|false - */ - var $_explicitState = false; - /** - * If this package is invoked with Package#group, this variable will be true - */ - var $_explicitGroup = false; - /** - * Package type local|url - * @var string - */ - var $_type; - /** - * Contents of package.xml, if downloaded from a remote channel - * @var string|false - * @access private - */ - var $_rawpackagefile; - /** - * @var boolean - * @access private - */ - var $_validated = false; - - /** - * @param PEAR_Downloader - */ - function PEAR_Downloader_Package(&$downloader) - { - $this->_downloader = &$downloader; - $this->_config = &$this->_downloader->config; - $this->_registry = &$this->_config->getRegistry(); - $options = $downloader->getOptions(); - if (isset($options['packagingroot'])) { - $this->_config->setInstallRoot($options['packagingroot']); - $this->_installRegistry = &$this->_config->getRegistry(); - $this->_config->setInstallRoot(false); - } else { - $this->_installRegistry = &$this->_registry; - } - $this->_valid = $this->_analyzed = false; - } - - /** - * Parse the input and determine whether this is a local file, a remote uri, or an - * abstract package name. - * - * This is the heart of the PEAR_Downloader_Package(), and is used in - * {@link PEAR_Downloader::download()} - * @param string - * @return bool|PEAR_Error - */ - function initialize($param) - { - $origErr = $this->_fromFile($param); - if ($this->_valid) { - return true; - } - - $options = $this->_downloader->getOptions(); - if (isset($options['offline'])) { - if (PEAR::isError($origErr) && !isset($options['soft'])) { - foreach ($origErr->getUserInfo() as $userInfo) { - if (isset($userInfo['message'])) { - $this->_downloader->log(0, $userInfo['message']); - } - } - - $this->_downloader->log(0, $origErr->getMessage()); - } - - return PEAR::raiseError('Cannot download non-local package "' . $param . '"'); - } - - $err = $this->_fromUrl($param); - if (PEAR::isError($err) || !$this->_valid) { - if ($this->_type == 'url') { - if (PEAR::isError($err) && !isset($options['soft'])) { - $this->_downloader->log(0, $err->getMessage()); - } - - return PEAR::raiseError("Invalid or missing remote package file"); - } - - $err = $this->_fromString($param); - if (PEAR::isError($err) || !$this->_valid) { - if (PEAR::isError($err) && $err->getCode() == PEAR_DOWNLOADER_PACKAGE_STATE) { - return false; // instruct the downloader to silently skip - } - - if (isset($this->_type) && $this->_type == 'local' && PEAR::isError($origErr)) { - if (is_array($origErr->getUserInfo())) { - foreach ($origErr->getUserInfo() as $err) { - if (is_array($err)) { - $err = $err['message']; - } - - if (!isset($options['soft'])) { - $this->_downloader->log(0, $err); - } - } - } - - if (!isset($options['soft'])) { - $this->_downloader->log(0, $origErr->getMessage()); - } - - if (is_array($param)) { - $param = $this->_registry->parsedPackageNameToString($param, true); - } - - if (!isset($options['soft'])) { - $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file"); - } - - // Passing no message back - already logged above - return PEAR::raiseError(); - } - - if (PEAR::isError($err) && !isset($options['soft'])) { - $this->_downloader->log(0, $err->getMessage()); - } - - if (is_array($param)) { - $param = $this->_registry->parsedPackageNameToString($param, true); - } - - if (!isset($options['soft'])) { - $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file"); - } - - // Passing no message back - already logged above - return PEAR::raiseError(); - } - } - - return true; - } - - /** - * Retrieve any non-local packages - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|PEAR_Error - */ - function &download() - { - if (isset($this->_packagefile)) { - return $this->_packagefile; - } - - if (isset($this->_downloadURL['url'])) { - $this->_isvalid = false; - $info = $this->getParsedPackage(); - foreach ($info as $i => $p) { - $info[$i] = strtolower($p); - } - - $err = $this->_fromUrl($this->_downloadURL['url'], - $this->_registry->parsedPackageNameToString($this->_parsedname, true)); - $newinfo = $this->getParsedPackage(); - foreach ($newinfo as $i => $p) { - $newinfo[$i] = strtolower($p); - } - - if ($info != $newinfo) { - do { - if ($info['channel'] == 'pecl.php.net' && $newinfo['channel'] == 'pear.php.net') { - $info['channel'] = 'pear.php.net'; - if ($info == $newinfo) { - // skip the channel check if a pecl package says it's a PEAR package - break; - } - } - if ($info['channel'] == 'pear.php.net' && $newinfo['channel'] == 'pecl.php.net') { - $info['channel'] = 'pecl.php.net'; - if ($info == $newinfo) { - // skip the channel check if a pecl package says it's a PEAR package - break; - } - } - - return PEAR::raiseError('CRITICAL ERROR: We are ' . - $this->_registry->parsedPackageNameToString($info) . ', but the file ' . - 'downloaded claims to be ' . - $this->_registry->parsedPackageNameToString($this->getParsedPackage())); - } while (false); - } - - if (PEAR::isError($err) || !$this->_valid) { - return $err; - } - } - - $this->_type = 'local'; - return $this->_packagefile; - } - - function &getPackageFile() - { - return $this->_packagefile; - } - - function &getDownloader() - { - return $this->_downloader; - } - - function getType() - { - return $this->_type; - } - - /** - * Like {@link initialize()}, but operates on a dependency - */ - function fromDepURL($dep) - { - $this->_downloadURL = $dep; - if (isset($dep['uri'])) { - $options = $this->_downloader->getOptions(); - if (!extension_loaded("zlib") || isset($options['nocompress'])) { - $ext = '.tar'; - } else { - $ext = '.tgz'; - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->_fromUrl($dep['uri'] . $ext); - PEAR::popErrorHandling(); - if (PEAR::isError($err)) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, $err->getMessage()); - } - - return PEAR::raiseError('Invalid uri dependency "' . $dep['uri'] . $ext . '", ' . - 'cannot download'); - } - } else { - $this->_parsedname = - array( - 'package' => $dep['info']->getPackage(), - 'channel' => $dep['info']->getChannel(), - 'version' => $dep['version'] - ); - if (!isset($dep['nodefault'])) { - $this->_parsedname['group'] = 'default'; // download the default dependency group - $this->_explicitGroup = false; - } - - $this->_rawpackagefile = $dep['raw']; - } - } - - function detectDependencies($params) - { - $options = $this->_downloader->getOptions(); - if (isset($options['downloadonly'])) { - return; - } - - if (isset($options['offline'])) { - $this->_downloader->log(3, 'Skipping dependency download check, --offline specified'); - return; - } - - $pname = $this->getParsedPackage(); - if (!$pname) { - return; - } - - $deps = $this->getDeps(); - if (!$deps) { - return; - } - - if (isset($deps['required'])) { // package.xml 2.0 - return $this->_detect2($deps, $pname, $options, $params); - } - - return $this->_detect1($deps, $pname, $options, $params); - } - - function setValidated() - { - $this->_validated = true; - } - - function alreadyValidated() - { - return $this->_validated; - } - - /** - * Remove packages to be downloaded that are already installed - * @param array of PEAR_Downloader_Package objects - * @static - */ - function removeInstalled(&$params) - { - if (!isset($params[0])) { - return; - } - - $options = $params[0]->_downloader->getOptions(); - if (!isset($options['downloadonly'])) { - foreach ($params as $i => $param) { - $package = $param->getPackage(); - $channel = $param->getChannel(); - // remove self if already installed with this version - // this does not need any pecl magic - we only remove exact matches - if ($param->_installRegistry->packageExists($package, $channel)) { - $packageVersion = $param->_installRegistry->packageInfo($package, 'version', $channel); - if (version_compare($packageVersion, $param->getVersion(), '==')) { - if (!isset($options['force'])) { - $info = $param->getParsedPackage(); - unset($info['version']); - unset($info['state']); - if (!isset($options['soft'])) { - $param->_downloader->log(1, 'Skipping package "' . - $param->getShortName() . - '", already installed as version ' . $packageVersion); - } - $params[$i] = false; - } - } elseif (!isset($options['force']) && !isset($options['upgrade']) && - !isset($options['soft'])) { - $info = $param->getParsedPackage(); - $param->_downloader->log(1, 'Skipping package "' . - $param->getShortName() . - '", already installed as version ' . $packageVersion); - $params[$i] = false; - } - } - } - } - - PEAR_Downloader_Package::removeDuplicates($params); - } - - function _detect2($deps, $pname, $options, $params) - { - $this->_downloadDeps = array(); - $groupnotfound = false; - foreach (array('package', 'subpackage') as $packagetype) { - // get required dependency group - if (isset($deps['required'][$packagetype])) { - if (isset($deps['required'][$packagetype][0])) { - foreach ($deps['required'][$packagetype] as $dep) { - if (isset($dep['conflicts'])) { - // skip any package that this package conflicts with - continue; - } - $ret = $this->_detect2Dep($dep, $pname, 'required', $params); - if (is_array($ret)) { - $this->_downloadDeps[] = $ret; - } elseif (PEAR::isError($ret) && !isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - } - } else { - $dep = $deps['required'][$packagetype]; - if (!isset($dep['conflicts'])) { - // skip any package that this package conflicts with - $ret = $this->_detect2Dep($dep, $pname, 'required', $params); - if (is_array($ret)) { - $this->_downloadDeps[] = $ret; - } elseif (PEAR::isError($ret) && !isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - } - } - } - - // get optional dependency group, if any - if (isset($deps['optional'][$packagetype])) { - $skipnames = array(); - if (!isset($deps['optional'][$packagetype][0])) { - $deps['optional'][$packagetype] = array($deps['optional'][$packagetype]); - } - - foreach ($deps['optional'][$packagetype] as $dep) { - $skip = false; - if (!isset($options['alldeps'])) { - $dep['package'] = $dep['name']; - if (!isset($options['soft'])) { - $this->_downloader->log(3, 'Notice: package "' . - $this->_registry->parsedPackageNameToString($this->getParsedPackage(), - true) . '" optional dependency "' . - $this->_registry->parsedPackageNameToString(array('package' => - $dep['name'], 'channel' => 'pear.php.net'), true) . - '" will not be automatically downloaded'); - } - $skipnames[] = $this->_registry->parsedPackageNameToString($dep, true); - $skip = true; - unset($dep['package']); - } - - $ret = $this->_detect2Dep($dep, $pname, 'optional', $params); - if (PEAR::isError($ret) && !isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - - if (!$ret) { - $dep['package'] = $dep['name']; - $skip = count($skipnames) ? - $skipnames[count($skipnames) - 1] : ''; - if ($skip == - $this->_registry->parsedPackageNameToString($dep, true)) { - array_pop($skipnames); - } - } - - if (!$skip && is_array($ret)) { - $this->_downloadDeps[] = $ret; - } - } - - if (count($skipnames)) { - if (!isset($options['soft'])) { - $this->_downloader->log(1, 'Did not download optional dependencies: ' . - implode(', ', $skipnames) . - ', use --alldeps to download automatically'); - } - } - } - - // get requested dependency group, if any - $groupname = $this->getGroup(); - $explicit = $this->_explicitGroup; - if (!$groupname) { - if (!$this->canDefault()) { - continue; - } - - $groupname = 'default'; // try the default dependency group - } - - if ($groupnotfound) { - continue; - } - - if (isset($deps['group'])) { - if (isset($deps['group']['attribs'])) { - if (strtolower($deps['group']['attribs']['name']) == strtolower($groupname)) { - $group = $deps['group']; - } elseif ($explicit) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, 'Warning: package "' . - $this->_registry->parsedPackageNameToString($pname, true) . - '" has no dependency ' . 'group named "' . $groupname . '"'); - } - - $groupnotfound = true; - continue; - } - } else { - $found = false; - foreach ($deps['group'] as $group) { - if (strtolower($group['attribs']['name']) == strtolower($groupname)) { - $found = true; - break; - } - } - - if (!$found) { - if ($explicit) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, 'Warning: package "' . - $this->_registry->parsedPackageNameToString($pname, true) . - '" has no dependency ' . 'group named "' . $groupname . '"'); - } - } - - $groupnotfound = true; - continue; - } - } - } - - if (isset($group) && isset($group[$packagetype])) { - if (isset($group[$packagetype][0])) { - foreach ($group[$packagetype] as $dep) { - $ret = $this->_detect2Dep($dep, $pname, 'dependency group "' . - $group['attribs']['name'] . '"', $params); - if (is_array($ret)) { - $this->_downloadDeps[] = $ret; - } elseif (PEAR::isError($ret) && !isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - } - } else { - $ret = $this->_detect2Dep($group[$packagetype], $pname, - 'dependency group "' . - $group['attribs']['name'] . '"', $params); - if (is_array($ret)) { - $this->_downloadDeps[] = $ret; - } elseif (PEAR::isError($ret) && !isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - } - } - } - } - - function _detect2Dep($dep, $pname, $group, $params) - { - if (isset($dep['conflicts'])) { - return true; - } - - $options = $this->_downloader->getOptions(); - if (isset($dep['uri'])) { - return array('uri' => $dep['uri'], 'dep' => $dep);; - } - - $testdep = $dep; - $testdep['package'] = $dep['name']; - if (PEAR_Downloader_Package::willDownload($testdep, $params)) { - $dep['package'] = $dep['name']; - if (!isset($options['soft'])) { - $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group . - ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", will be installed'); - } - return false; - } - - $options = $this->_downloader->getOptions(); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - if ($this->_explicitState) { - $pname['state'] = $this->_explicitState; - } - - $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname); - if (PEAR::isError($url)) { - PEAR::popErrorHandling(); - return $url; - } - - $dep['package'] = $dep['name']; - $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params, $group == 'optional' && - !isset($options['alldeps']), true); - PEAR::popErrorHandling(); - if (PEAR::isError($ret)) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - - return false; - } - - // check to see if a dep is already installed and is the same or newer - if (!isset($dep['min']) && !isset($dep['max']) && !isset($dep['recommended'])) { - $oper = 'has'; - } else { - $oper = 'gt'; - } - - // do not try to move this before getDepPackageDownloadURL - // we can't determine whether upgrade is necessary until we know what - // version would be downloaded - if (!isset($options['force']) && $this->isInstalled($ret, $oper)) { - $version = $this->_installRegistry->packageInfo($dep['name'], 'version', $dep['channel']); - $dep['package'] = $dep['name']; - if (!isset($options['soft'])) { - $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group . - ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '" version ' . $url['version'] . ', already installed as version ' . - $version); - } - - return false; - } - - if (isset($dep['nodefault'])) { - $ret['nodefault'] = true; - } - - return $ret; - } - - function _detect1($deps, $pname, $options, $params) - { - $this->_downloadDeps = array(); - $skipnames = array(); - foreach ($deps as $dep) { - $nodownload = false; - if (isset ($dep['type']) && $dep['type'] === 'pkg') { - $dep['channel'] = 'pear.php.net'; - $dep['package'] = $dep['name']; - switch ($dep['rel']) { - case 'not' : - continue 2; - case 'ge' : - case 'eq' : - case 'gt' : - case 'has' : - $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ? - 'required' : - 'optional'; - if (PEAR_Downloader_Package::willDownload($dep, $params)) { - $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group - . ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", will be installed'); - continue 2; - } - $fakedp = new PEAR_PackageFile_v1; - $fakedp->setPackage($dep['name']); - // skip internet check if we are not upgrading (bug #5810) - if (!isset($options['upgrade']) && $this->isInstalled( - $fakedp, $dep['rel'])) { - $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group - . ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", is already installed'); - continue 2; - } - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - if ($this->_explicitState) { - $pname['state'] = $this->_explicitState; - } - - $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname); - $chan = 'pear.php.net'; - if (PEAR::isError($url)) { - // check to see if this is a pecl package that has jumped - // from pear.php.net to pecl.php.net channel - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - - $newdep = PEAR_Dependency2::normalizeDep($dep); - $newdep = $newdep[0]; - $newdep['channel'] = 'pecl.php.net'; - $chan = 'pecl.php.net'; - $url = $this->_downloader->_getDepPackageDownloadUrl($newdep, $pname); - $obj = &$this->_installRegistry->getPackage($dep['name']); - if (PEAR::isError($url)) { - PEAR::popErrorHandling(); - if ($obj !== null && $this->isInstalled($obj, $dep['rel'])) { - $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ? - 'required' : - 'optional'; - $dep['package'] = $dep['name']; - if (!isset($options['soft'])) { - $this->_downloader->log(3, $this->getShortName() . - ': Skipping ' . $group . ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", already installed as version ' . $obj->getVersion()); - } - $skip = count($skipnames) ? - $skipnames[count($skipnames) - 1] : ''; - if ($skip == - $this->_registry->parsedPackageNameToString($dep, true)) { - array_pop($skipnames); - } - continue; - } else { - if (isset($dep['optional']) && $dep['optional'] == 'yes') { - $this->_downloader->log(2, $this->getShortName() . - ': Skipping optional dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", no releases exist'); - continue; - } else { - return $url; - } - } - } - } - - PEAR::popErrorHandling(); - if (!isset($options['alldeps'])) { - if (isset($dep['optional']) && $dep['optional'] == 'yes') { - if (!isset($options['soft'])) { - $this->_downloader->log(3, 'Notice: package "' . - $this->getShortName() . - '" optional dependency "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $chan, 'package' => - $dep['name']), true) . - '" will not be automatically downloaded'); - } - $skipnames[] = $this->_registry->parsedPackageNameToString( - array('channel' => $chan, 'package' => - $dep['name']), true); - $nodownload = true; - } - } - - if (!isset($options['alldeps']) && !isset($options['onlyreqdeps'])) { - if (!isset($dep['optional']) || $dep['optional'] == 'no') { - if (!isset($options['soft'])) { - $this->_downloader->log(3, 'Notice: package "' . - $this->getShortName() . - '" required dependency "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $chan, 'package' => - $dep['name']), true) . - '" will not be automatically downloaded'); - } - $skipnames[] = $this->_registry->parsedPackageNameToString( - array('channel' => $chan, 'package' => - $dep['name']), true); - $nodownload = true; - } - } - - // check to see if a dep is already installed - // do not try to move this before getDepPackageDownloadURL - // we can't determine whether upgrade is necessary until we know what - // version would be downloaded - if (!isset($options['force']) && $this->isInstalled( - $url, $dep['rel'])) { - $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ? - 'required' : - 'optional'; - $dep['package'] = $dep['name']; - if (isset($newdep)) { - $version = $this->_installRegistry->packageInfo($newdep['name'], 'version', $newdep['channel']); - } else { - $version = $this->_installRegistry->packageInfo($dep['name'], 'version'); - } - - $dep['version'] = $url['version']; - if (!isset($options['soft'])) { - $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group . - ' dependency "' . - $this->_registry->parsedPackageNameToString($dep, true) . - '", already installed as version ' . $version); - } - - $skip = count($skipnames) ? - $skipnames[count($skipnames) - 1] : ''; - if ($skip == - $this->_registry->parsedPackageNameToString($dep, true)) { - array_pop($skipnames); - } - - continue; - } - - if ($nodownload) { - continue; - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - if (isset($newdep)) { - $dep = $newdep; - } - - $dep['package'] = $dep['name']; - $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params, - isset($dep['optional']) && $dep['optional'] == 'yes' && - !isset($options['alldeps']), true); - PEAR::popErrorHandling(); - if (PEAR::isError($ret)) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, $ret->getMessage()); - } - continue; - } - - $this->_downloadDeps[] = $ret; - } - } - - if (count($skipnames)) { - if (!isset($options['soft'])) { - $this->_downloader->log(1, 'Did not download dependencies: ' . - implode(', ', $skipnames) . - ', use --alldeps or --onlyreqdeps to download automatically'); - } - } - } - - function setDownloadURL($pkg) - { - $this->_downloadURL = $pkg; - } - - /** - * Set the package.xml object for this downloaded package - * - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 $pkg - */ - function setPackageFile(&$pkg) - { - $this->_packagefile = &$pkg; - } - - function getShortName() - { - return $this->_registry->parsedPackageNameToString(array('channel' => $this->getChannel(), - 'package' => $this->getPackage()), true); - } - - function getParsedPackage() - { - if (isset($this->_packagefile) || isset($this->_parsedname)) { - return array('channel' => $this->getChannel(), - 'package' => $this->getPackage(), - 'version' => $this->getVersion()); - } - - return false; - } - - function getDownloadURL() - { - return $this->_downloadURL; - } - - function canDefault() - { - if (isset($this->_downloadURL) && isset($this->_downloadURL['nodefault'])) { - return false; - } - - return true; - } - - function getPackage() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getPackage(); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->getPackage(); - } - - return false; - } - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - */ - function isSubpackage(&$pf) - { - if (isset($this->_packagefile)) { - return $this->_packagefile->isSubpackage($pf); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->isSubpackage($pf); - } - - return false; - } - - function getPackageType() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getPackageType(); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->getPackageType(); - } - - return false; - } - - function isBundle() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getPackageType() == 'bundle'; - } - - return false; - } - - function getPackageXmlVersion() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getPackagexmlVersion(); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->getPackagexmlVersion(); - } - - return '1.0'; - } - - function getChannel() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getChannel(); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->getChannel(); - } - - return false; - } - - function getURI() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getURI(); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->getURI(); - } - - return false; - } - - function getVersion() - { - if (isset($this->_packagefile)) { - return $this->_packagefile->getVersion(); - } elseif (isset($this->_downloadURL['version'])) { - return $this->_downloadURL['version']; - } - - return false; - } - - function isCompatible($pf) - { - if (isset($this->_packagefile)) { - return $this->_packagefile->isCompatible($pf); - } elseif (isset($this->_downloadURL['info'])) { - return $this->_downloadURL['info']->isCompatible($pf); - } - - return true; - } - - function setGroup($group) - { - $this->_parsedname['group'] = $group; - } - - function getGroup() - { - if (isset($this->_parsedname['group'])) { - return $this->_parsedname['group']; - } - - return ''; - } - - function isExtension($name) - { - if (isset($this->_packagefile)) { - return $this->_packagefile->isExtension($name); - } elseif (isset($this->_downloadURL['info'])) { - if ($this->_downloadURL['info']->getPackagexmlVersion() == '2.0') { - return $this->_downloadURL['info']->getProvidesExtension() == $name; - } - - return false; - } - - return false; - } - - function getDeps() - { - if (isset($this->_packagefile)) { - $ver = $this->_packagefile->getPackagexmlVersion(); - if (version_compare($ver, '2.0', '>=')) { - return $this->_packagefile->getDeps(true); - } - - return $this->_packagefile->getDeps(); - } elseif (isset($this->_downloadURL['info'])) { - $ver = $this->_downloadURL['info']->getPackagexmlVersion(); - if (version_compare($ver, '2.0', '>=')) { - return $this->_downloadURL['info']->getDeps(true); - } - - return $this->_downloadURL['info']->getDeps(); - } - - return array(); - } - - /** - * @param array Parsed array from {@link PEAR_Registry::parsePackageName()} or a dependency - * returned from getDepDownloadURL() - */ - function isEqual($param) - { - if (is_object($param)) { - $channel = $param->getChannel(); - $package = $param->getPackage(); - if ($param->getURI()) { - $param = array( - 'channel' => $param->getChannel(), - 'package' => $param->getPackage(), - 'version' => $param->getVersion(), - 'uri' => $param->getURI(), - ); - } else { - $param = array( - 'channel' => $param->getChannel(), - 'package' => $param->getPackage(), - 'version' => $param->getVersion(), - ); - } - } else { - if (isset($param['uri'])) { - if ($this->getChannel() != '__uri') { - return false; - } - return $param['uri'] == $this->getURI(); - } - - $package = isset($param['package']) ? $param['package'] : $param['info']->getPackage(); - $channel = isset($param['channel']) ? $param['channel'] : $param['info']->getChannel(); - if (isset($param['rel'])) { - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - - $newdep = PEAR_Dependency2::normalizeDep($param); - $newdep = $newdep[0]; - } elseif (isset($param['min'])) { - $newdep = $param; - } - } - - if (isset($newdep)) { - if (!isset($newdep['min'])) { - $newdep['min'] = '0'; - } - - if (!isset($newdep['max'])) { - $newdep['max'] = '100000000000000000000'; - } - - // use magic to support pecl packages suddenly jumping to the pecl channel - // we need to support both dependency possibilities - if ($channel == 'pear.php.net' && $this->getChannel() == 'pecl.php.net') { - if ($package == $this->getPackage()) { - $channel = 'pecl.php.net'; - } - } - if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') { - if ($package == $this->getPackage()) { - $channel = 'pear.php.net'; - } - } - - return (strtolower($package) == strtolower($this->getPackage()) && - $channel == $this->getChannel() && - version_compare($newdep['min'], $this->getVersion(), '<=') && - version_compare($newdep['max'], $this->getVersion(), '>=')); - } - - // use magic to support pecl packages suddenly jumping to the pecl channel - if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') { - if (strtolower($package) == strtolower($this->getPackage())) { - $channel = 'pear.php.net'; - } - } - - if (isset($param['version'])) { - return (strtolower($package) == strtolower($this->getPackage()) && - $channel == $this->getChannel() && - $param['version'] == $this->getVersion()); - } - - return strtolower($package) == strtolower($this->getPackage()) && - $channel == $this->getChannel(); - } - - function isInstalled($dep, $oper = '==') - { - if (!$dep) { - return false; - } - - if ($oper != 'ge' && $oper != 'gt' && $oper != 'has' && $oper != '==') { - return false; - } - - if (is_object($dep)) { - $package = $dep->getPackage(); - $channel = $dep->getChannel(); - if ($dep->getURI()) { - $dep = array( - 'uri' => $dep->getURI(), - 'version' => $dep->getVersion(), - ); - } else { - $dep = array( - 'version' => $dep->getVersion(), - ); - } - } else { - if (isset($dep['uri'])) { - $channel = '__uri'; - $package = $dep['dep']['name']; - } else { - $channel = $dep['info']->getChannel(); - $package = $dep['info']->getPackage(); - } - } - - $options = $this->_downloader->getOptions(); - $test = $this->_installRegistry->packageExists($package, $channel); - if (!$test && $channel == 'pecl.php.net') { - // do magic to allow upgrading from old pecl packages to new ones - $test = $this->_installRegistry->packageExists($package, 'pear.php.net'); - $channel = 'pear.php.net'; - } - - if ($test) { - if (isset($dep['uri'])) { - if ($this->_installRegistry->packageInfo($package, 'uri', '__uri') == $dep['uri']) { - return true; - } - } - - if (isset($options['upgrade'])) { - $packageVersion = $this->_installRegistry->packageInfo($package, 'version', $channel); - if (version_compare($packageVersion, $dep['version'], '>=')) { - return true; - } - - return false; - } - - return true; - } - - return false; - } - - /** - * Detect duplicate package names with differing versions - * - * If a user requests to install Date 1.4.6 and Date 1.4.7, - * for instance, this is a logic error. This method - * detects this situation. - * - * @param array $params array of PEAR_Downloader_Package objects - * @param array $errorparams empty array - * @return array array of stupid duplicated packages in PEAR_Downloader_Package obejcts - */ - function detectStupidDuplicates($params, &$errorparams) - { - $existing = array(); - foreach ($params as $i => $param) { - $package = $param->getPackage(); - $channel = $param->getChannel(); - $group = $param->getGroup(); - if (!isset($existing[$channel . '/' . $package])) { - $existing[$channel . '/' . $package] = array(); - } - - if (!isset($existing[$channel . '/' . $package][$group])) { - $existing[$channel . '/' . $package][$group] = array(); - } - - $existing[$channel . '/' . $package][$group][] = $i; - } - - $indices = array(); - foreach ($existing as $package => $groups) { - foreach ($groups as $group => $dupes) { - if (count($dupes) > 1) { - $indices = $indices + $dupes; - } - } - } - - $indices = array_unique($indices); - foreach ($indices as $index) { - $errorparams[] = $params[$index]; - } - - return count($errorparams); - } - - /** - * @param array - * @param bool ignore install groups - for final removal of dupe packages - * @static - */ - function removeDuplicates(&$params, $ignoreGroups = false) - { - $pnames = array(); - foreach ($params as $i => $param) { - if (!$param) { - continue; - } - - if ($param->getPackage()) { - $group = $ignoreGroups ? '' : $param->getGroup(); - $pnames[$i] = $param->getChannel() . '/' . - $param->getPackage() . '-' . $param->getVersion() . '#' . $group; - } - } - - $pnames = array_unique($pnames); - $unset = array_diff(array_keys($params), array_keys($pnames)); - $testp = array_flip($pnames); - foreach ($params as $i => $param) { - if (!$param) { - $unset[] = $i; - continue; - } - - if (!is_a($param, 'PEAR_Downloader_Package')) { - $unset[] = $i; - continue; - } - - $group = $ignoreGroups ? '' : $param->getGroup(); - if (!isset($testp[$param->getChannel() . '/' . $param->getPackage() . '-' . - $param->getVersion() . '#' . $group])) { - $unset[] = $i; - } - } - - foreach ($unset as $i) { - unset($params[$i]); - } - - $ret = array(); - foreach ($params as $i => $param) { - $ret[] = &$params[$i]; - } - - $params = array(); - foreach ($ret as $i => $param) { - $params[] = &$ret[$i]; - } - } - - function explicitState() - { - return $this->_explicitState; - } - - function setExplicitState($s) - { - $this->_explicitState = $s; - } - - /** - * @static - */ - function mergeDependencies(&$params) - { - $bundles = $newparams = array(); - foreach ($params as $i => $param) { - if (!$param->isBundle()) { - continue; - } - - $bundles[] = $i; - $pf = &$param->getPackageFile(); - $newdeps = array(); - $contents = $pf->getBundledPackages(); - if (!is_array($contents)) { - $contents = array($contents); - } - - foreach ($contents as $file) { - $filecontents = $pf->getFileContents($file); - $dl = &$param->getDownloader(); - $options = $dl->getOptions(); - if (PEAR::isError($dir = $dl->getDownloadDir())) { - return $dir; - } - - $fp = @fopen($dir . DIRECTORY_SEPARATOR . $file, 'wb'); - if (!$fp) { - continue; - } - - // FIXME do symlink check - - fwrite($fp, $filecontents, strlen($filecontents)); - fclose($fp); - if ($s = $params[$i]->explicitState()) { - $obj->setExplicitState($s); - } - - $obj = &new PEAR_Downloader_Package($params[$i]->getDownloader()); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - if (PEAR::isError($dir = $dl->getDownloadDir())) { - PEAR::popErrorHandling(); - return $dir; - } - - $e = $obj->_fromFile($a = $dir . DIRECTORY_SEPARATOR . $file); - PEAR::popErrorHandling(); - if (PEAR::isError($e)) { - if (!isset($options['soft'])) { - $dl->log(0, $e->getMessage()); - } - continue; - } - - $j = &$obj; - if (!PEAR_Downloader_Package::willDownload($j, - array_merge($params, $newparams)) && !$param->isInstalled($j)) { - $newparams[] = &$j; - } - } - } - - foreach ($bundles as $i) { - unset($params[$i]); // remove bundles - only their contents matter for installation - } - - PEAR_Downloader_Package::removeDuplicates($params); // strip any unset indices - if (count($newparams)) { // add in bundled packages for install - foreach ($newparams as $i => $unused) { - $params[] = &$newparams[$i]; - } - $newparams = array(); - } - - foreach ($params as $i => $param) { - $newdeps = array(); - foreach ($param->_downloadDeps as $dep) { - $merge = array_merge($params, $newparams); - if (!PEAR_Downloader_Package::willDownload($dep, $merge) - && !$param->isInstalled($dep) - ) { - $newdeps[] = $dep; - } else { - //var_dump($dep); - // detect versioning conflicts here - } - } - - // convert the dependencies into PEAR_Downloader_Package objects for the next time around - $params[$i]->_downloadDeps = array(); - foreach ($newdeps as $dep) { - $obj = &new PEAR_Downloader_Package($params[$i]->getDownloader()); - if ($s = $params[$i]->explicitState()) { - $obj->setExplicitState($s); - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $e = $obj->fromDepURL($dep); - PEAR::popErrorHandling(); - if (PEAR::isError($e)) { - if (!isset($options['soft'])) { - $obj->_downloader->log(0, $e->getMessage()); - } - continue; - } - - $e = $obj->detectDependencies($params); - if (PEAR::isError($e)) { - if (!isset($options['soft'])) { - $obj->_downloader->log(0, $e->getMessage()); - } - } - - $j = &$obj; - $newparams[] = &$j; - } - } - - if (count($newparams)) { - foreach ($newparams as $i => $unused) { - $params[] = &$newparams[$i]; - } - return true; - } - - return false; - } - - - /** - * @static - */ - function willDownload($param, $params) - { - if (!is_array($params)) { - return false; - } - - foreach ($params as $obj) { - if ($obj->isEqual($param)) { - return true; - } - } - - return false; - } - - /** - * For simpler unit-testing - * @param PEAR_Config - * @param int - * @param string - */ - function &getPackagefileObject(&$c, $d) - { - $a = &new PEAR_PackageFile($c, $d); - return $a; - } - - /** - * This will retrieve from a local file if possible, and parse out - * a group name as well. The original parameter will be modified to reflect this. - * @param string|array can be a parsed package name as well - * @access private - */ - function _fromFile(&$param) - { - $saveparam = $param; - if (is_string($param)) { - if (!@file_exists($param)) { - $test = explode('#', $param); - $group = array_pop($test); - if (@file_exists(implode('#', $test))) { - $this->setGroup($group); - $param = implode('#', $test); - $this->_explicitGroup = true; - } - } - - if (@is_file($param)) { - $this->_type = 'local'; - $options = $this->_downloader->getOptions(); - $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->_debug); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $pf = &$pkg->fromAnyFile($param, PEAR_VALIDATE_INSTALLING); - PEAR::popErrorHandling(); - if (PEAR::isError($pf)) { - $this->_valid = false; - $param = $saveparam; - return $pf; - } - $this->_packagefile = &$pf; - if (!$this->getGroup()) { - $this->setGroup('default'); // install the default dependency group - } - return $this->_valid = true; - } - } - $param = $saveparam; - return $this->_valid = false; - } - - function _fromUrl($param, $saveparam = '') - { - if (!is_array($param) && (preg_match('#^(http|https|ftp)://#', $param))) { - $options = $this->_downloader->getOptions(); - $this->_type = 'url'; - $callback = $this->_downloader->ui ? - array(&$this->_downloader, '_downloadCallback') : null; - $this->_downloader->pushErrorHandling(PEAR_ERROR_RETURN); - if (PEAR::isError($dir = $this->_downloader->getDownloadDir())) { - $this->_downloader->popErrorHandling(); - return $dir; - } - - $this->_downloader->log(3, 'Downloading "' . $param . '"'); - $file = $this->_downloader->downloadHttp($param, $this->_downloader->ui, - $dir, $callback, null, false, $this->getChannel()); - $this->_downloader->popErrorHandling(); - if (PEAR::isError($file)) { - if (!empty($saveparam)) { - $saveparam = ", cannot download \"$saveparam\""; - } - $err = PEAR::raiseError('Could not download from "' . $param . - '"' . $saveparam . ' (' . $file->getMessage() . ')'); - return $err; - } - - if ($this->_rawpackagefile) { - require_once 'Archive/Tar.php'; - $tar = &new Archive_Tar($file); - $packagexml = $tar->extractInString('package2.xml'); - if (!$packagexml) { - $packagexml = $tar->extractInString('package.xml'); - } - - if (str_replace(array("\n", "\r"), array('',''), $packagexml) != - str_replace(array("\n", "\r"), array('',''), $this->_rawpackagefile)) { - if ($this->getChannel() != 'pear.php.net') { - return PEAR::raiseError('CRITICAL ERROR: package.xml downloaded does ' . - 'not match value returned from xml-rpc'); - } - - // be more lax for the existing PEAR packages that have not-ok - // characters in their package.xml - $this->_downloader->log(0, 'CRITICAL WARNING: The "' . - $this->getPackage() . '" package has invalid characters in its ' . - 'package.xml. The next version of PEAR may not be able to install ' . - 'this package for security reasons. Please open a bug report at ' . - 'http://pear.php.net/package/' . $this->getPackage() . '/bugs'); - } - } - - // whew, download worked! - $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->debug); - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $pf = &$pkg->fromAnyFile($file, PEAR_VALIDATE_INSTALLING); - PEAR::popErrorHandling(); - if (PEAR::isError($pf)) { - if (is_array($pf->getUserInfo())) { - foreach ($pf->getUserInfo() as $err) { - if (is_array($err)) { - $err = $err['message']; - } - - if (!isset($options['soft'])) { - $this->_downloader->log(0, "Validation Error: $err"); - } - } - } - - if (!isset($options['soft'])) { - $this->_downloader->log(0, $pf->getMessage()); - } - - ///FIXME need to pass back some error code that we can use to match with to cancel all further operations - /// At least stop all deps of this package from being installed - $out = $saveparam ? $saveparam : $param; - $err = PEAR::raiseError('Download of "' . $out . '" succeeded, but it is not a valid package archive'); - $this->_valid = false; - return $err; - } - - $this->_packagefile = &$pf; - $this->setGroup('default'); // install the default dependency group - return $this->_valid = true; - } - - return $this->_valid = false; - } - - /** - * - * @param string|array pass in an array of format - * array( - * 'package' => 'pname', - * ['channel' => 'channame',] - * ['version' => 'version',] - * ['state' => 'state',]) - * or a string of format [channame/]pname[-version|-state] - */ - function _fromString($param) - { - $options = $this->_downloader->getOptions(); - $channel = $this->_config->get('default_channel'); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $pname = $this->_registry->parsePackageName($param, $channel); - PEAR::popErrorHandling(); - if (PEAR::isError($pname)) { - if ($pname->getCode() == 'invalid') { - $this->_valid = false; - return false; - } - - if ($pname->getCode() == 'channel') { - $parsed = $pname->getUserInfo(); - if ($this->_downloader->discover($parsed['channel'])) { - if ($this->_config->get('auto_discover')) { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $pname = $this->_registry->parsePackageName($param, $channel); - PEAR::popErrorHandling(); - } else { - if (!isset($options['soft'])) { - $this->_downloader->log(0, 'Channel "' . $parsed['channel'] . - '" is not initialized, use ' . - '"pear channel-discover ' . $parsed['channel'] . '" to initialize' . - 'or pear config-set auto_discover 1'); - } - } - } - - if (PEAR::isError($pname)) { - if (!isset($options['soft'])) { - $this->_downloader->log(0, $pname->getMessage()); - } - - if (is_array($param)) { - $param = $this->_registry->parsedPackageNameToString($param); - } - - $err = PEAR::raiseError('invalid package name/package file "' . $param . '"'); - $this->_valid = false; - return $err; - } - } else { - if (!isset($options['soft'])) { - $this->_downloader->log(0, $pname->getMessage()); - } - - $err = PEAR::raiseError('invalid package name/package file "' . $param . '"'); - $this->_valid = false; - return $err; - } - } - - if (!isset($this->_type)) { - $this->_type = 'rest'; - } - - $this->_parsedname = $pname; - $this->_explicitState = isset($pname['state']) ? $pname['state'] : false; - $this->_explicitGroup = isset($pname['group']) ? true : false; - - $info = $this->_downloader->_getPackageDownloadUrl($pname); - if (PEAR::isError($info)) { - if ($info->getCode() != -976 && $pname['channel'] == 'pear.php.net') { - // try pecl - $pname['channel'] = 'pecl.php.net'; - if ($test = $this->_downloader->_getPackageDownloadUrl($pname)) { - if (!PEAR::isError($test)) { - $info = PEAR::raiseError($info->getMessage() . ' - package ' . - $this->_registry->parsedPackageNameToString($pname, true) . - ' can be installed with "pecl install ' . $pname['package'] . - '"'); - } else { - $pname['channel'] = 'pear.php.net'; - } - } else { - $pname['channel'] = 'pear.php.net'; - } - } - - return $info; - } - - $this->_rawpackagefile = $info['raw']; - $ret = $this->_analyzeDownloadURL($info, $param, $pname); - if (PEAR::isError($ret)) { - return $ret; - } - - if ($ret) { - $this->_downloadURL = $ret; - return $this->_valid = (bool) $ret; - } - } - - /** - * @param array output of package.getDownloadURL - * @param string|array|object information for detecting packages to be downloaded, and - * for errors - * @param array name information of the package - * @param array|null packages to be downloaded - * @param bool is this an optional dependency? - * @param bool is this any kind of dependency? - * @access private - */ - function _analyzeDownloadURL($info, $param, $pname, $params = null, $optional = false, - $isdependency = false) - { - if (!is_string($param) && PEAR_Downloader_Package::willDownload($param, $params)) { - return false; - } - - if ($info === false) { - $saveparam = !is_string($param) ? ", cannot download \"$param\"" : ''; - - // no releases exist - return PEAR::raiseError('No releases for package "' . - $this->_registry->parsedPackageNameToString($pname, true) . '" exist' . $saveparam); - } - - if (strtolower($info['info']->getChannel()) != strtolower($pname['channel'])) { - $err = false; - if ($pname['channel'] == 'pecl.php.net') { - if ($info['info']->getChannel() != 'pear.php.net') { - $err = true; - } - } elseif ($info['info']->getChannel() == 'pecl.php.net') { - if ($pname['channel'] != 'pear.php.net') { - $err = true; - } - } else { - $err = true; - } - - if ($err) { - return PEAR::raiseError('SECURITY ERROR: package in channel "' . $pname['channel'] . - '" retrieved another channel\'s name for download! ("' . - $info['info']->getChannel() . '")'); - } - } - - $preferred_state = $this->_config->get('preferred_state'); - if (!isset($info['url'])) { - $package_version = $this->_registry->packageInfo($info['info']->getPackage(), - 'version', $info['info']->getChannel()); - if ($this->isInstalled($info)) { - if ($isdependency && version_compare($info['version'], $package_version, '<=')) { - // ignore bogus errors of "failed to download dependency" - // if it is already installed and the one that would be - // downloaded is older or the same version (Bug #7219) - return false; - } - } - - if ($info['version'] === $package_version) { - if (!isset($options['soft'])) { - $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] . - '/' . $pname['package'] . '-' . $package_version. ', additionally the suggested version' . - ' (' . $package_version . ') is the same as the locally installed one.'); - } - - return false; - } - - if (version_compare($info['version'], $package_version, '<=')) { - if (!isset($options['soft'])) { - $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] . - '/' . $pname['package'] . '-' . $package_version . ', additionally the suggested version' . - ' (' . $info['version'] . ') is a lower version than the locally installed one (' . $package_version . ').'); - } - - return false; - } - - $instead = ', will instead download version ' . $info['version'] . - ', stability "' . $info['info']->getState() . '"'; - // releases exist, but we failed to get any - if (isset($this->_downloader->_options['force'])) { - if (isset($pname['version'])) { - $vs = ', version "' . $pname['version'] . '"'; - } elseif (isset($pname['state'])) { - $vs = ', stability "' . $pname['state'] . '"'; - } elseif ($param == 'dependency') { - if (!class_exists('PEAR_Common')) { - require_once 'PEAR/Common.php'; - } - - if (!in_array($info['info']->getState(), - PEAR_Common::betterStates($preferred_state, true))) { - if ($optional) { - // don't spit out confusing error message - return $this->_downloader->_getPackageDownloadUrl( - array('package' => $pname['package'], - 'channel' => $pname['channel'], - 'version' => $info['version'])); - } - $vs = ' within preferred state "' . $preferred_state . - '"'; - } else { - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - - if ($optional) { - // don't spit out confusing error message - return $this->_downloader->_getPackageDownloadUrl( - array('package' => $pname['package'], - 'channel' => $pname['channel'], - 'version' => $info['version'])); - } - $vs = PEAR_Dependency2::_getExtraString($pname); - $instead = ''; - } - } else { - $vs = ' within preferred state "' . $preferred_state . '"'; - } - - if (!isset($options['soft'])) { - $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] . - '/' . $pname['package'] . $vs . $instead); - } - - // download the latest release - return $this->_downloader->_getPackageDownloadUrl( - array('package' => $pname['package'], - 'channel' => $pname['channel'], - 'version' => $info['version'])); - } else { - if (isset($info['php']) && $info['php']) { - $err = PEAR::raiseError('Failed to download ' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], - 'package' => $pname['package']), - true) . - ', latest release is version ' . $info['php']['v'] . - ', but it requires PHP version "' . - $info['php']['m'] . '", use "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], 'package' => $pname['package'], - 'version' => $info['php']['v'])) . '" to install', - PEAR_DOWNLOADER_PACKAGE_PHPVERSION); - return $err; - } - - // construct helpful error message - if (isset($pname['version'])) { - $vs = ', version "' . $pname['version'] . '"'; - } elseif (isset($pname['state'])) { - $vs = ', stability "' . $pname['state'] . '"'; - } elseif ($param == 'dependency') { - if (!class_exists('PEAR_Common')) { - require_once 'PEAR/Common.php'; - } - - if (!in_array($info['info']->getState(), - PEAR_Common::betterStates($preferred_state, true))) { - if ($optional) { - // don't spit out confusing error message, and don't die on - // optional dep failure! - return $this->_downloader->_getPackageDownloadUrl( - array('package' => $pname['package'], - 'channel' => $pname['channel'], - 'version' => $info['version'])); - } - $vs = ' within preferred state "' . $preferred_state . '"'; - } else { - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - - if ($optional) { - // don't spit out confusing error message, and don't die on - // optional dep failure! - return $this->_downloader->_getPackageDownloadUrl( - array('package' => $pname['package'], - 'channel' => $pname['channel'], - 'version' => $info['version'])); - } - $vs = PEAR_Dependency2::_getExtraString($pname); - } - } else { - $vs = ' within preferred state "' . $this->_downloader->config->get('preferred_state') . '"'; - } - - $options = $this->_downloader->getOptions(); - // this is only set by the "download-all" command - if (isset($options['ignorepreferred_state'])) { - $err = PEAR::raiseError( - 'Failed to download ' . $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], 'package' => $pname['package']), - true) - . $vs . - ', latest release is version ' . $info['version'] . - ', stability "' . $info['info']->getState() . '", use "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], 'package' => $pname['package'], - 'version' => $info['version'])) . '" to install', - PEAR_DOWNLOADER_PACKAGE_STATE); - return $err; - } - - // Checks if the user has a package installed already and checks the release against - // the state against the installed package, this allows upgrades for packages - // with lower stability than the preferred_state - $stability = $this->_registry->packageInfo($pname['package'], 'stability', $pname['channel']); - if (!$this->isInstalled($info) - || !in_array($info['info']->getState(), PEAR_Common::betterStates($stability['release'], true)) - ) { - $err = PEAR::raiseError( - 'Failed to download ' . $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], 'package' => $pname['package']), - true) - . $vs . - ', latest release is version ' . $info['version'] . - ', stability "' . $info['info']->getState() . '", use "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pname['channel'], 'package' => $pname['package'], - 'version' => $info['version'])) . '" to install'); - return $err; - } - } - } - - if (isset($info['deprecated']) && $info['deprecated']) { - $this->_downloader->log(0, - 'WARNING: "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $info['info']->getChannel(), - 'package' => $info['info']->getPackage()), true) . - '" is deprecated in favor of "' . - $this->_registry->parsedPackageNameToString($info['deprecated'], true) . - '"'); - } - - return $info; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/ErrorStack.php b/3rdparty/PEAR/ErrorStack.php deleted file mode 100644 index 0303f5273a..0000000000 --- a/3rdparty/PEAR/ErrorStack.php +++ /dev/null @@ -1,985 +0,0 @@ - - * @copyright 2004-2008 Greg Beaver - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: ErrorStack.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR_ErrorStack - */ - -/** - * Singleton storage - * - * Format: - *
    - * array(
    - *  'package1' => PEAR_ErrorStack object,
    - *  'package2' => PEAR_ErrorStack object,
    - *  ...
    - * )
    - * 
    - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] - */ -$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array(); - -/** - * Global error callback (default) - * - * This is only used if set to non-false. * is the default callback for - * all packages, whereas specific packages may set a default callback - * for all instances, regardless of whether they are a singleton or not. - * - * To exclude non-singletons, only set the local callback for the singleton - * @see PEAR_ErrorStack::setDefaultCallback() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] - */ -$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array( - '*' => false, -); - -/** - * Global Log object (default) - * - * This is only used if set to non-false. Use to set a default log object for - * all stacks, regardless of instantiation order or location - * @see PEAR_ErrorStack::setDefaultLogger() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] - */ -$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false; - -/** - * Global Overriding Callback - * - * This callback will override any error callbacks that specific loggers have set. - * Use with EXTREME caution - * @see PEAR_ErrorStack::staticPushCallback() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] - */ -$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); - -/**#@+ - * One of four possible return values from the error Callback - * @see PEAR_ErrorStack::_errorCallback() - */ -/** - * If this is returned, then the error will be both pushed onto the stack - * and logged. - */ -define('PEAR_ERRORSTACK_PUSHANDLOG', 1); -/** - * If this is returned, then the error will only be pushed onto the stack, - * and not logged. - */ -define('PEAR_ERRORSTACK_PUSH', 2); -/** - * If this is returned, then the error will only be logged, but not pushed - * onto the error stack. - */ -define('PEAR_ERRORSTACK_LOG', 3); -/** - * If this is returned, then the error is completely ignored. - */ -define('PEAR_ERRORSTACK_IGNORE', 4); -/** - * If this is returned, then the error is logged and die() is called. - */ -define('PEAR_ERRORSTACK_DIE', 5); -/**#@-*/ - -/** - * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in - * the singleton method. - */ -define('PEAR_ERRORSTACK_ERR_NONCLASS', 1); - -/** - * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()} - * that has no __toString() method - */ -define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2); -/** - * Error Stack Implementation - * - * Usage: - * - * // global error stack - * $global_stack = &PEAR_ErrorStack::singleton('MyPackage'); - * // local error stack - * $local_stack = new PEAR_ErrorStack('MyPackage'); - * - * @author Greg Beaver - * @version 1.9.4 - * @package PEAR_ErrorStack - * @category Debugging - * @copyright 2004-2008 Greg Beaver - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: ErrorStack.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR_ErrorStack - */ -class PEAR_ErrorStack { - /** - * Errors are stored in the order that they are pushed on the stack. - * @since 0.4alpha Errors are no longer organized by error level. - * This renders pop() nearly unusable, and levels could be more easily - * handled in a callback anyway - * @var array - * @access private - */ - var $_errors = array(); - - /** - * Storage of errors by level. - * - * Allows easy retrieval and deletion of only errors from a particular level - * @since PEAR 1.4.0dev - * @var array - * @access private - */ - var $_errorsByLevel = array(); - - /** - * Package name this error stack represents - * @var string - * @access protected - */ - var $_package; - - /** - * Determines whether a PEAR_Error is thrown upon every error addition - * @var boolean - * @access private - */ - var $_compat = false; - - /** - * If set to a valid callback, this will be used to generate the error - * message from the error code, otherwise the message passed in will be - * used - * @var false|string|array - * @access private - */ - var $_msgCallback = false; - - /** - * If set to a valid callback, this will be used to generate the error - * context for an error. For PHP-related errors, this will be a file - * and line number as retrieved from debug_backtrace(), but can be - * customized for other purposes. The error might actually be in a separate - * configuration file, or in a database query. - * @var false|string|array - * @access protected - */ - var $_contextCallback = false; - - /** - * If set to a valid callback, this will be called every time an error - * is pushed onto the stack. The return value will be used to determine - * whether to allow an error to be pushed or logged. - * - * The return value must be one an PEAR_ERRORSTACK_* constant - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @var false|string|array - * @access protected - */ - var $_errorCallback = array(); - - /** - * PEAR::Log object for logging errors - * @var false|Log - * @access protected - */ - var $_logger = false; - - /** - * Error messages - designed to be overridden - * @var array - * @abstract - */ - var $_errorMsgs = array(); - - /** - * Set up a new error stack - * - * @param string $package name of the package this error stack represents - * @param callback $msgCallback callback used for error message generation - * @param callback $contextCallback callback used for context generation, - * defaults to {@link getFileLine()} - * @param boolean $throwPEAR_Error - */ - function PEAR_ErrorStack($package, $msgCallback = false, $contextCallback = false, - $throwPEAR_Error = false) - { - $this->_package = $package; - $this->setMessageCallback($msgCallback); - $this->setContextCallback($contextCallback); - $this->_compat = $throwPEAR_Error; - } - - /** - * Return a single error stack for this package. - * - * Note that all parameters are ignored if the stack for package $package - * has already been instantiated - * @param string $package name of the package this error stack represents - * @param callback $msgCallback callback used for error message generation - * @param callback $contextCallback callback used for context generation, - * defaults to {@link getFileLine()} - * @param boolean $throwPEAR_Error - * @param string $stackClass class to instantiate - * @static - * @return PEAR_ErrorStack - */ - function &singleton($package, $msgCallback = false, $contextCallback = false, - $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack') - { - if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; - } - if (!class_exists($stackClass)) { - if (function_exists('debug_backtrace')) { - $trace = debug_backtrace(); - } - PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS, - 'exception', array('stackclass' => $stackClass), - 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)', - false, $trace); - } - $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] = - new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error); - - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; - } - - /** - * Internal error handler for PEAR_ErrorStack class - * - * Dies if the error is an exception (and would have died anyway) - * @access private - */ - function _handleError($err) - { - if ($err['level'] == 'exception') { - $message = $err['message']; - if (isset($_SERVER['REQUEST_URI'])) { - echo '
    '; - } else { - echo "\n"; - } - var_dump($err['context']); - die($message); - } - } - - /** - * Set up a PEAR::Log object for all error stacks that don't have one - * @param Log $log - * @static - */ - function setDefaultLogger(&$log) - { - if (is_object($log) && method_exists($log, 'log') ) { - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; - } elseif (is_callable($log)) { - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; - } - } - - /** - * Set up a PEAR::Log object for this error stack - * @param Log $log - */ - function setLogger(&$log) - { - if (is_object($log) && method_exists($log, 'log') ) { - $this->_logger = &$log; - } elseif (is_callable($log)) { - $this->_logger = &$log; - } - } - - /** - * Set an error code => error message mapping callback - * - * This method sets the callback that can be used to generate error - * messages for any instance - * @param array|string Callback function/method - */ - function setMessageCallback($msgCallback) - { - if (!$msgCallback) { - $this->_msgCallback = array(&$this, 'getErrorMessage'); - } else { - if (is_callable($msgCallback)) { - $this->_msgCallback = $msgCallback; - } - } - } - - /** - * Get an error code => error message mapping callback - * - * This method returns the current callback that can be used to generate error - * messages - * @return array|string|false Callback function/method or false if none - */ - function getMessageCallback() - { - return $this->_msgCallback; - } - - /** - * Sets a default callback to be used by all error stacks - * - * This method sets the callback that can be used to generate error - * messages for a singleton - * @param array|string Callback function/method - * @param string Package name, or false for all packages - * @static - */ - function setDefaultCallback($callback = false, $package = false) - { - if (!is_callable($callback)) { - $callback = false; - } - $package = $package ? $package : '*'; - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback; - } - - /** - * Set a callback that generates context information (location of error) for an error stack - * - * This method sets the callback that can be used to generate context - * information for an error. Passing in NULL will disable context generation - * and remove the expensive call to debug_backtrace() - * @param array|string|null Callback function/method - */ - function setContextCallback($contextCallback) - { - if ($contextCallback === null) { - return $this->_contextCallback = false; - } - if (!$contextCallback) { - $this->_contextCallback = array(&$this, 'getFileLine'); - } else { - if (is_callable($contextCallback)) { - $this->_contextCallback = $contextCallback; - } - } - } - - /** - * Set an error Callback - * If set to a valid callback, this will be called every time an error - * is pushed onto the stack. The return value will be used to determine - * whether to allow an error to be pushed or logged. - * - * The return value must be one of the ERRORSTACK_* constants. - * - * This functionality can be used to emulate PEAR's pushErrorHandling, and - * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of - * the error stack or logging - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @see popCallback() - * @param string|array $cb - */ - function pushCallback($cb) - { - array_push($this->_errorCallback, $cb); - } - - /** - * Remove a callback from the error callback stack - * @see pushCallback() - * @return array|string|false - */ - function popCallback() - { - if (!count($this->_errorCallback)) { - return false; - } - return array_pop($this->_errorCallback); - } - - /** - * Set a temporary overriding error callback for every package error stack - * - * Use this to temporarily disable all existing callbacks (can be used - * to emulate the @ operator, for instance) - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @see staticPopCallback(), pushCallback() - * @param string|array $cb - * @static - */ - function staticPushCallback($cb) - { - array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb); - } - - /** - * Remove a temporary overriding error callback - * @see staticPushCallback() - * @return array|string|false - * @static - */ - function staticPopCallback() - { - $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']); - if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) { - $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); - } - return $ret; - } - - /** - * Add an error to the stack - * - * If the message generator exists, it is called with 2 parameters. - * - the current Error Stack object - * - an array that is in the same format as an error. Available indices - * are 'code', 'package', 'time', 'params', 'level', and 'context' - * - * Next, if the error should contain context information, this is - * handled by the context grabbing method. - * Finally, the error is pushed onto the proper error stack - * @param int $code Package-specific error code - * @param string $level Error level. This is NOT spell-checked - * @param array $params associative array of error parameters - * @param string $msg Error message, or a portion of it if the message - * is to be generated - * @param array $repackage If this error re-packages an error pushed by - * another package, place the array returned from - * {@link pop()} in this parameter - * @param array $backtrace Protected parameter: use this to pass in the - * {@link debug_backtrace()} that should be used - * to find error context - * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also - * thrown. If a PEAR_Error is returned, the userinfo - * property is set to the following array: - * - * - * array( - * 'code' => $code, - * 'params' => $params, - * 'package' => $this->_package, - * 'level' => $level, - * 'time' => time(), - * 'context' => $context, - * 'message' => $msg, - * //['repackage' => $err] repackaged error array/Exception class - * ); - * - * - * Normally, the previous array is returned. - */ - function push($code, $level = 'error', $params = array(), $msg = false, - $repackage = false, $backtrace = false) - { - $context = false; - // grab error context - if ($this->_contextCallback) { - if (!$backtrace) { - $backtrace = debug_backtrace(); - } - $context = call_user_func($this->_contextCallback, $code, $params, $backtrace); - } - - // save error - $time = explode(' ', microtime()); - $time = $time[1] + $time[0]; - $err = array( - 'code' => $code, - 'params' => $params, - 'package' => $this->_package, - 'level' => $level, - 'time' => $time, - 'context' => $context, - 'message' => $msg, - ); - - if ($repackage) { - $err['repackage'] = $repackage; - } - - // set up the error message, if necessary - if ($this->_msgCallback) { - $msg = call_user_func_array($this->_msgCallback, - array(&$this, $err)); - $err['message'] = $msg; - } - $push = $log = true; - $die = false; - // try the overriding callback first - $callback = $this->staticPopCallback(); - if ($callback) { - $this->staticPushCallback($callback); - } - if (!is_callable($callback)) { - // try the local callback next - $callback = $this->popCallback(); - if (is_callable($callback)) { - $this->pushCallback($callback); - } else { - // try the default callback - $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ? - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] : - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*']; - } - } - if (is_callable($callback)) { - switch(call_user_func($callback, $err)){ - case PEAR_ERRORSTACK_IGNORE: - return $err; - break; - case PEAR_ERRORSTACK_PUSH: - $log = false; - break; - case PEAR_ERRORSTACK_LOG: - $push = false; - break; - case PEAR_ERRORSTACK_DIE: - $die = true; - break; - // anything else returned has the same effect as pushandlog - } - } - if ($push) { - array_unshift($this->_errors, $err); - if (!isset($this->_errorsByLevel[$err['level']])) { - $this->_errorsByLevel[$err['level']] = array(); - } - $this->_errorsByLevel[$err['level']][] = &$this->_errors[0]; - } - if ($log) { - if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) { - $this->_log($err); - } - } - if ($die) { - die(); - } - if ($this->_compat && $push) { - return $this->raiseError($msg, $code, null, null, $err); - } - return $err; - } - - /** - * Static version of {@link push()} - * - * @param string $package Package name this error belongs to - * @param int $code Package-specific error code - * @param string $level Error level. This is NOT spell-checked - * @param array $params associative array of error parameters - * @param string $msg Error message, or a portion of it if the message - * is to be generated - * @param array $repackage If this error re-packages an error pushed by - * another package, place the array returned from - * {@link pop()} in this parameter - * @param array $backtrace Protected parameter: use this to pass in the - * {@link debug_backtrace()} that should be used - * to find error context - * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also - * thrown. see docs for {@link push()} - * @static - */ - function staticPush($package, $code, $level = 'error', $params = array(), - $msg = false, $repackage = false, $backtrace = false) - { - $s = &PEAR_ErrorStack::singleton($package); - if ($s->_contextCallback) { - if (!$backtrace) { - if (function_exists('debug_backtrace')) { - $backtrace = debug_backtrace(); - } - } - } - return $s->push($code, $level, $params, $msg, $repackage, $backtrace); - } - - /** - * Log an error using PEAR::Log - * @param array $err Error array - * @param array $levels Error level => Log constant map - * @access protected - */ - function _log($err) - { - if ($this->_logger) { - $logger = &$this->_logger; - } else { - $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']; - } - if (is_a($logger, 'Log')) { - $levels = array( - 'exception' => PEAR_LOG_CRIT, - 'alert' => PEAR_LOG_ALERT, - 'critical' => PEAR_LOG_CRIT, - 'error' => PEAR_LOG_ERR, - 'warning' => PEAR_LOG_WARNING, - 'notice' => PEAR_LOG_NOTICE, - 'info' => PEAR_LOG_INFO, - 'debug' => PEAR_LOG_DEBUG); - if (isset($levels[$err['level']])) { - $level = $levels[$err['level']]; - } else { - $level = PEAR_LOG_INFO; - } - $logger->log($err['message'], $level, $err); - } else { // support non-standard logs - call_user_func($logger, $err); - } - } - - - /** - * Pop an error off of the error stack - * - * @return false|array - * @since 0.4alpha it is no longer possible to specify a specific error - * level to return - the last error pushed will be returned, instead - */ - function pop() - { - $err = @array_shift($this->_errors); - if (!is_null($err)) { - @array_pop($this->_errorsByLevel[$err['level']]); - if (!count($this->_errorsByLevel[$err['level']])) { - unset($this->_errorsByLevel[$err['level']]); - } - } - return $err; - } - - /** - * Pop an error off of the error stack, static method - * - * @param string package name - * @return boolean - * @since PEAR1.5.0a1 - */ - function staticPop($package) - { - if ($package) { - if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { - return false; - } - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop(); - } - } - - /** - * Determine whether there are any errors on the stack - * @param string|array Level name. Use to determine if any errors - * of level (string), or levels (array) have been pushed - * @return boolean - */ - function hasErrors($level = false) - { - if ($level) { - return isset($this->_errorsByLevel[$level]); - } - return count($this->_errors); - } - - /** - * Retrieve all errors since last purge - * - * @param boolean set in order to empty the error stack - * @param string level name, to return only errors of a particular severity - * @return array - */ - function getErrors($purge = false, $level = false) - { - if (!$purge) { - if ($level) { - if (!isset($this->_errorsByLevel[$level])) { - return array(); - } else { - return $this->_errorsByLevel[$level]; - } - } else { - return $this->_errors; - } - } - if ($level) { - $ret = $this->_errorsByLevel[$level]; - foreach ($this->_errorsByLevel[$level] as $i => $unused) { - // entries are references to the $_errors array - $this->_errorsByLevel[$level][$i] = false; - } - // array_filter removes all entries === false - $this->_errors = array_filter($this->_errors); - unset($this->_errorsByLevel[$level]); - return $ret; - } - $ret = $this->_errors; - $this->_errors = array(); - $this->_errorsByLevel = array(); - return $ret; - } - - /** - * Determine whether there are any errors on a single error stack, or on any error stack - * - * The optional parameter can be used to test the existence of any errors without the need of - * singleton instantiation - * @param string|false Package name to check for errors - * @param string Level name to check for a particular severity - * @return boolean - * @static - */ - function staticHasErrors($package = false, $level = false) - { - if ($package) { - if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { - return false; - } - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level); - } - foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { - if ($obj->hasErrors($level)) { - return true; - } - } - return false; - } - - /** - * Get a list of all errors since last purge, organized by package - * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be - * @param boolean $purge Set to purge the error stack of existing errors - * @param string $level Set to a level name in order to retrieve only errors of a particular level - * @param boolean $merge Set to return a flat array, not organized by package - * @param array $sortfunc Function used to sort a merged array - default - * sorts by time, and should be good for most cases - * @static - * @return array - */ - function staticGetErrors($purge = false, $level = false, $merge = false, - $sortfunc = array('PEAR_ErrorStack', '_sortErrors')) - { - $ret = array(); - if (!is_callable($sortfunc)) { - $sortfunc = array('PEAR_ErrorStack', '_sortErrors'); - } - foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { - $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level); - if ($test) { - if ($merge) { - $ret = array_merge($ret, $test); - } else { - $ret[$package] = $test; - } - } - } - if ($merge) { - usort($ret, $sortfunc); - } - return $ret; - } - - /** - * Error sorting function, sorts by time - * @access private - */ - function _sortErrors($a, $b) - { - if ($a['time'] == $b['time']) { - return 0; - } - if ($a['time'] < $b['time']) { - return 1; - } - return -1; - } - - /** - * Standard file/line number/function/class context callback - * - * This function uses a backtrace generated from {@link debug_backtrace()} - * and so will not work at all in PHP < 4.3.0. The frame should - * reference the frame that contains the source of the error. - * @return array|false either array('file' => file, 'line' => line, - * 'function' => function name, 'class' => class name) or - * if this doesn't work, then false - * @param unused - * @param integer backtrace frame. - * @param array Results of debug_backtrace() - * @static - */ - function getFileLine($code, $params, $backtrace = null) - { - if ($backtrace === null) { - return false; - } - $frame = 0; - $functionframe = 1; - if (!isset($backtrace[1])) { - $functionframe = 0; - } else { - while (isset($backtrace[$functionframe]['function']) && - $backtrace[$functionframe]['function'] == 'eval' && - isset($backtrace[$functionframe + 1])) { - $functionframe++; - } - } - if (isset($backtrace[$frame])) { - if (!isset($backtrace[$frame]['file'])) { - $frame++; - } - $funcbacktrace = $backtrace[$functionframe]; - $filebacktrace = $backtrace[$frame]; - $ret = array('file' => $filebacktrace['file'], - 'line' => $filebacktrace['line']); - // rearrange for eval'd code or create function errors - if (strpos($filebacktrace['file'], '(') && - preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'], - $matches)) { - $ret['file'] = $matches[1]; - $ret['line'] = $matches[2] + 0; - } - if (isset($funcbacktrace['function']) && isset($backtrace[1])) { - if ($funcbacktrace['function'] != 'eval') { - if ($funcbacktrace['function'] == '__lambda_func') { - $ret['function'] = 'create_function() code'; - } else { - $ret['function'] = $funcbacktrace['function']; - } - } - } - if (isset($funcbacktrace['class']) && isset($backtrace[1])) { - $ret['class'] = $funcbacktrace['class']; - } - return $ret; - } - return false; - } - - /** - * Standard error message generation callback - * - * This method may also be called by a custom error message generator - * to fill in template values from the params array, simply - * set the third parameter to the error message template string to use - * - * The special variable %__msg% is reserved: use it only to specify - * where a message passed in by the user should be placed in the template, - * like so: - * - * Error message: %msg% - internal error - * - * If the message passed like so: - * - * - * $stack->push(ERROR_CODE, 'error', array(), 'server error 500'); - * - * - * The returned error message will be "Error message: server error 500 - - * internal error" - * @param PEAR_ErrorStack - * @param array - * @param string|false Pre-generated error message template - * @static - * @return string - */ - function getErrorMessage(&$stack, $err, $template = false) - { - if ($template) { - $mainmsg = $template; - } else { - $mainmsg = $stack->getErrorMessageTemplate($err['code']); - } - $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg); - if (is_array($err['params']) && count($err['params'])) { - foreach ($err['params'] as $name => $val) { - if (is_array($val)) { - // @ is needed in case $val is a multi-dimensional array - $val = @implode(', ', $val); - } - if (is_object($val)) { - if (method_exists($val, '__toString')) { - $val = $val->__toString(); - } else { - PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING, - 'warning', array('obj' => get_class($val)), - 'object %obj% passed into getErrorMessage, but has no __toString() method'); - $val = 'Object'; - } - } - $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg); - } - } - return $mainmsg; - } - - /** - * Standard Error Message Template generator from code - * @return string - */ - function getErrorMessageTemplate($code) - { - if (!isset($this->_errorMsgs[$code])) { - return '%__msg%'; - } - return $this->_errorMsgs[$code]; - } - - /** - * Set the Error Message Template array - * - * The array format must be: - *
    -     * array(error code => 'message template',...)
    -     * 
    - * - * Error message parameters passed into {@link push()} will be used as input - * for the error message. If the template is 'message %foo% was %bar%', and the - * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will - * be 'message one was six' - * @return string - */ - function setErrorMessageTemplate($template) - { - $this->_errorMsgs = $template; - } - - - /** - * emulate PEAR::raiseError() - * - * @return PEAR_Error - */ - function raiseError() - { - require_once 'PEAR.php'; - $args = func_get_args(); - return call_user_func_array(array('PEAR', 'raiseError'), $args); - } -} -$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack'); -$stack->pushCallback(array('PEAR_ErrorStack', '_handleError')); -?> diff --git a/3rdparty/PEAR/Exception.php b/3rdparty/PEAR/Exception.php deleted file mode 100644 index 4a0e7b86fa..0000000000 --- a/3rdparty/PEAR/Exception.php +++ /dev/null @@ -1,389 +0,0 @@ - - * @author Hans Lellelid - * @author Bertrand Mansion - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Exception.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.3.3 - */ - - -/** - * Base PEAR_Exception Class - * - * 1) Features: - * - * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) - * - Definable triggers, shot when exceptions occur - * - Pretty and informative error messages - * - Added more context info available (like class, method or cause) - * - cause can be a PEAR_Exception or an array of mixed - * PEAR_Exceptions/PEAR_ErrorStack warnings - * - callbacks for specific exception classes and their children - * - * 2) Ideas: - * - * - Maybe a way to define a 'template' for the output - * - * 3) Inherited properties from PHP Exception Class: - * - * protected $message - * protected $code - * protected $line - * protected $file - * private $trace - * - * 4) Inherited methods from PHP Exception Class: - * - * __clone - * __construct - * getMessage - * getCode - * getFile - * getLine - * getTraceSafe - * getTraceSafeAsString - * __toString - * - * 5) Usage example - * - * - * require_once 'PEAR/Exception.php'; - * - * class Test { - * function foo() { - * throw new PEAR_Exception('Error Message', ERROR_CODE); - * } - * } - * - * function myLogger($pear_exception) { - * echo $pear_exception->getMessage(); - * } - * // each time a exception is thrown the 'myLogger' will be called - * // (its use is completely optional) - * PEAR_Exception::addObserver('myLogger'); - * $test = new Test; - * try { - * $test->foo(); - * } catch (PEAR_Exception $e) { - * print $e; - * } - * - * - * @category pear - * @package PEAR - * @author Tomas V.V.Cox - * @author Hans Lellelid - * @author Bertrand Mansion - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.3.3 - * - */ -class PEAR_Exception extends Exception -{ - const OBSERVER_PRINT = -2; - const OBSERVER_TRIGGER = -4; - const OBSERVER_DIE = -8; - protected $cause; - private static $_observers = array(); - private static $_uniqueid = 0; - private $_trace; - - /** - * Supported signatures: - * - PEAR_Exception(string $message); - * - PEAR_Exception(string $message, int $code); - * - PEAR_Exception(string $message, Exception $cause); - * - PEAR_Exception(string $message, Exception $cause, int $code); - * - PEAR_Exception(string $message, PEAR_Error $cause); - * - PEAR_Exception(string $message, PEAR_Error $cause, int $code); - * - PEAR_Exception(string $message, array $causes); - * - PEAR_Exception(string $message, array $causes, int $code); - * @param string exception message - * @param int|Exception|PEAR_Error|array|null exception cause - * @param int|null exception code or null - */ - public function __construct($message, $p2 = null, $p3 = null) - { - if (is_int($p2)) { - $code = $p2; - $this->cause = null; - } elseif (is_object($p2) || is_array($p2)) { - // using is_object allows both Exception and PEAR_Error - if (is_object($p2) && !($p2 instanceof Exception)) { - if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) { - throw new PEAR_Exception('exception cause must be Exception, ' . - 'array, or PEAR_Error'); - } - } - $code = $p3; - if (is_array($p2) && isset($p2['message'])) { - // fix potential problem of passing in a single warning - $p2 = array($p2); - } - $this->cause = $p2; - } else { - $code = null; - $this->cause = null; - } - parent::__construct($message, $code); - $this->signal(); - } - - /** - * @param mixed $callback - A valid php callback, see php func is_callable() - * - A PEAR_Exception::OBSERVER_* constant - * - An array(const PEAR_Exception::OBSERVER_*, - * mixed $options) - * @param string $label The name of the observer. Use this if you want - * to remove it later with removeObserver() - */ - public static function addObserver($callback, $label = 'default') - { - self::$_observers[$label] = $callback; - } - - public static function removeObserver($label = 'default') - { - unset(self::$_observers[$label]); - } - - /** - * @return int unique identifier for an observer - */ - public static function getUniqueId() - { - return self::$_uniqueid++; - } - - private function signal() - { - foreach (self::$_observers as $func) { - if (is_callable($func)) { - call_user_func($func, $this); - continue; - } - settype($func, 'array'); - switch ($func[0]) { - case self::OBSERVER_PRINT : - $f = (isset($func[1])) ? $func[1] : '%s'; - printf($f, $this->getMessage()); - break; - case self::OBSERVER_TRIGGER : - $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; - trigger_error($this->getMessage(), $f); - break; - case self::OBSERVER_DIE : - $f = (isset($func[1])) ? $func[1] : '%s'; - die(printf($f, $this->getMessage())); - break; - default: - trigger_error('invalid observer type', E_USER_WARNING); - } - } - } - - /** - * Return specific error information that can be used for more detailed - * error messages or translation. - * - * This method may be overridden in child exception classes in order - * to add functionality not present in PEAR_Exception and is a placeholder - * to define API - * - * The returned array must be an associative array of parameter => value like so: - *
    -     * array('name' => $name, 'context' => array(...))
    -     * 
    - * @return array - */ - public function getErrorData() - { - return array(); - } - - /** - * Returns the exception that caused this exception to be thrown - * @access public - * @return Exception|array The context of the exception - */ - public function getCause() - { - return $this->cause; - } - - /** - * Function must be public to call on caused exceptions - * @param array - */ - public function getCauseMessage(&$causes) - { - $trace = $this->getTraceSafe(); - $cause = array('class' => get_class($this), - 'message' => $this->message, - 'file' => 'unknown', - 'line' => 'unknown'); - if (isset($trace[0])) { - if (isset($trace[0]['file'])) { - $cause['file'] = $trace[0]['file']; - $cause['line'] = $trace[0]['line']; - } - } - $causes[] = $cause; - if ($this->cause instanceof PEAR_Exception) { - $this->cause->getCauseMessage($causes); - } elseif ($this->cause instanceof Exception) { - $causes[] = array('class' => get_class($this->cause), - 'message' => $this->cause->getMessage(), - 'file' => $this->cause->getFile(), - 'line' => $this->cause->getLine()); - } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) { - $causes[] = array('class' => get_class($this->cause), - 'message' => $this->cause->getMessage(), - 'file' => 'unknown', - 'line' => 'unknown'); - } elseif (is_array($this->cause)) { - foreach ($this->cause as $cause) { - if ($cause instanceof PEAR_Exception) { - $cause->getCauseMessage($causes); - } elseif ($cause instanceof Exception) { - $causes[] = array('class' => get_class($cause), - 'message' => $cause->getMessage(), - 'file' => $cause->getFile(), - 'line' => $cause->getLine()); - } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) { - $causes[] = array('class' => get_class($cause), - 'message' => $cause->getMessage(), - 'file' => 'unknown', - 'line' => 'unknown'); - } elseif (is_array($cause) && isset($cause['message'])) { - // PEAR_ErrorStack warning - $causes[] = array( - 'class' => $cause['package'], - 'message' => $cause['message'], - 'file' => isset($cause['context']['file']) ? - $cause['context']['file'] : - 'unknown', - 'line' => isset($cause['context']['line']) ? - $cause['context']['line'] : - 'unknown', - ); - } - } - } - } - - public function getTraceSafe() - { - if (!isset($this->_trace)) { - $this->_trace = $this->getTrace(); - if (empty($this->_trace)) { - $backtrace = debug_backtrace(); - $this->_trace = array($backtrace[count($backtrace)-1]); - } - } - return $this->_trace; - } - - public function getErrorClass() - { - $trace = $this->getTraceSafe(); - return $trace[0]['class']; - } - - public function getErrorMethod() - { - $trace = $this->getTraceSafe(); - return $trace[0]['function']; - } - - public function __toString() - { - if (isset($_SERVER['REQUEST_URI'])) { - return $this->toHtml(); - } - return $this->toText(); - } - - public function toHtml() - { - $trace = $this->getTraceSafe(); - $causes = array(); - $this->getCauseMessage($causes); - $html = '' . "\n"; - foreach ($causes as $i => $cause) { - $html .= '\n"; - } - $html .= '' . "\n" - . '' - . '' - . '' . "\n"; - - foreach ($trace as $k => $v) { - $html .= '' - . '' - . '' . "\n"; - } - $html .= '' - . '' - . '' . "\n" - . '
    ' - . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' - . htmlspecialchars($cause['message']) . ' in ' . $cause['file'] . ' ' - . 'on line ' . $cause['line'] . '' - . "
    Exception trace
    #FunctionLocation
    ' . $k . ''; - if (!empty($v['class'])) { - $html .= $v['class'] . $v['type']; - } - $html .= $v['function']; - $args = array(); - if (!empty($v['args'])) { - foreach ($v['args'] as $arg) { - if (is_null($arg)) $args[] = 'null'; - elseif (is_array($arg)) $args[] = 'Array'; - elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')'; - elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false'; - elseif (is_int($arg) || is_double($arg)) $args[] = $arg; - else { - $arg = (string)$arg; - $str = htmlspecialchars(substr($arg, 0, 16)); - if (strlen($arg) > 16) $str .= '…'; - $args[] = "'" . $str . "'"; - } - } - } - $html .= '(' . implode(', ',$args) . ')' - . '' . (isset($v['file']) ? $v['file'] : 'unknown') - . ':' . (isset($v['line']) ? $v['line'] : 'unknown') - . '
    ' . ($k+1) . '{main} 
    '; - return $html; - } - - public function toText() - { - $causes = array(); - $this->getCauseMessage($causes); - $causeMsg = ''; - foreach ($causes as $i => $cause) { - $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' - . $cause['message'] . ' in ' . $cause['file'] - . ' on line ' . $cause['line'] . "\n"; - } - return $causeMsg . $this->getTraceAsString(); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/FixPHP5PEARWarnings.php b/3rdparty/PEAR/FixPHP5PEARWarnings.php deleted file mode 100644 index be5dc3ce70..0000000000 --- a/3rdparty/PEAR/FixPHP5PEARWarnings.php +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/3rdparty/PEAR/Frontend.php b/3rdparty/PEAR/Frontend.php deleted file mode 100644 index 531e541f9e..0000000000 --- a/3rdparty/PEAR/Frontend.php +++ /dev/null @@ -1,228 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Frontend.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Include error handling - */ -//require_once 'PEAR.php'; - -/** - * Which user interface class is being used. - * @var string class name - */ -$GLOBALS['_PEAR_FRONTEND_CLASS'] = 'PEAR_Frontend_CLI'; - -/** - * Instance of $_PEAR_Command_uiclass. - * @var object - */ -$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = null; - -/** - * Singleton-based frontend for PEAR user input/output - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Frontend extends PEAR -{ - /** - * Retrieve the frontend object - * @return PEAR_Frontend_CLI|PEAR_Frontend_Web|PEAR_Frontend_Gtk - * @static - */ - function &singleton($type = null) - { - if ($type === null) { - if (!isset($GLOBALS['_PEAR_FRONTEND_SINGLETON'])) { - $a = false; - return $a; - } - return $GLOBALS['_PEAR_FRONTEND_SINGLETON']; - } - - $a = PEAR_Frontend::setFrontendClass($type); - return $a; - } - - /** - * Set the frontend class that will be used by calls to {@link singleton()} - * - * Frontends are expected to conform to the PEAR naming standard of - * _ => DIRECTORY_SEPARATOR (PEAR_Frontend_CLI is in PEAR/Frontend/CLI.php) - * @param string $uiclass full class name - * @return PEAR_Frontend - * @static - */ - function &setFrontendClass($uiclass) - { - if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) && - is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], $uiclass)) { - return $GLOBALS['_PEAR_FRONTEND_SINGLETON']; - } - - if (!class_exists($uiclass)) { - $file = str_replace('_', '/', $uiclass) . '.php'; - if (PEAR_Frontend::isIncludeable($file)) { - include_once $file; - } - } - - if (class_exists($uiclass)) { - $obj = &new $uiclass; - // quick test to see if this class implements a few of the most - // important frontend methods - if (is_a($obj, 'PEAR_Frontend')) { - $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$obj; - $GLOBALS['_PEAR_FRONTEND_CLASS'] = $uiclass; - return $obj; - } - - $err = PEAR::raiseError("not a frontend class: $uiclass"); - return $err; - } - - $err = PEAR::raiseError("no such class: $uiclass"); - return $err; - } - - /** - * Set the frontend class that will be used by calls to {@link singleton()} - * - * Frontends are expected to be a descendant of PEAR_Frontend - * @param PEAR_Frontend - * @return PEAR_Frontend - * @static - */ - function &setFrontendObject($uiobject) - { - if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) && - is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], get_class($uiobject))) { - return $GLOBALS['_PEAR_FRONTEND_SINGLETON']; - } - - if (!is_a($uiobject, 'PEAR_Frontend')) { - $err = PEAR::raiseError('not a valid frontend class: (' . - get_class($uiobject) . ')'); - return $err; - } - - $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$uiobject; - $GLOBALS['_PEAR_FRONTEND_CLASS'] = get_class($uiobject); - return $uiobject; - } - - /** - * @param string $path relative or absolute include path - * @return boolean - * @static - */ - function isIncludeable($path) - { - if (file_exists($path) && is_readable($path)) { - return true; - } - - $fp = @fopen($path, 'r', true); - if ($fp) { - fclose($fp); - return true; - } - - return false; - } - - /** - * @param PEAR_Config - */ - function setConfig(&$config) - { - } - - /** - * This can be overridden to allow session-based temporary file management - * - * By default, all files are deleted at the end of a session. The web installer - * needs to be able to sustain a list over many sessions in order to support - * user interaction with install scripts - */ - function addTempFile($file) - { - $GLOBALS['_PEAR_Common_tempfiles'][] = $file; - } - - /** - * Log an action - * - * @param string $msg the message to log - * @param boolean $append_crlf - * @return boolean true - * @abstract - */ - function log($msg, $append_crlf = true) - { - } - - /** - * Run a post-installation script - * - * @param array $scripts array of post-install scripts - * @abstract - */ - function runPostinstallScripts(&$scripts) - { - } - - /** - * Display human-friendly output formatted depending on the - * $command parameter. - * - * This should be able to handle basic output data with no command - * @param mixed $data data structure containing the information to display - * @param string $command command from which this method was called - * @abstract - */ - function outputData($data, $command = '_default') - { - } - - /** - * Display a modal form dialog and return the given input - * - * A frontend that requires multiple requests to retrieve and process - * data must take these needs into account, and implement the request - * handling code. - * @param string $command command from which this method was called - * @param array $prompts associative array. keys are the input field names - * and values are the description - * @param array $types array of input field types (text, password, - * etc.) keys have to be the same like in $prompts - * @param array $defaults array of default values. again keys have - * to be the same like in $prompts. Do not depend - * on a default value being set. - * @return array input sent by the user - * @abstract - */ - function userDialog($command, $prompts, $types = array(), $defaults = array()) - { - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Frontend/CLI.php b/3rdparty/PEAR/Frontend/CLI.php deleted file mode 100644 index 340b99b79b..0000000000 --- a/3rdparty/PEAR/Frontend/CLI.php +++ /dev/null @@ -1,751 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: CLI.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ -/** - * base class - */ -require_once 'PEAR/Frontend.php'; - -/** - * Command-line Frontend for the PEAR Installer - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Frontend_CLI extends PEAR_Frontend -{ - /** - * What type of user interface this frontend is for. - * @var string - * @access public - */ - var $type = 'CLI'; - var $lp = ''; // line prefix - - var $params = array(); - var $term = array( - 'bold' => '', - 'normal' => '', - ); - - function PEAR_Frontend_CLI() - { - parent::PEAR(); - $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1 - if (function_exists('posix_isatty') && !posix_isatty(1)) { - // output is being redirected to a file or through a pipe - } elseif ($term) { - if (preg_match('/^(xterm|vt220|linux)/', $term)) { - $this->term['bold'] = sprintf("%c%c%c%c", 27, 91, 49, 109); - $this->term['normal'] = sprintf("%c%c%c", 27, 91, 109); - } elseif (preg_match('/^vt100/', $term)) { - $this->term['bold'] = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); - $this->term['normal'] = sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0); - } - } elseif (OS_WINDOWS) { - // XXX add ANSI codes here - } - } - - /** - * @param object PEAR_Error object - */ - function displayError($e) - { - return $this->_displayLine($e->getMessage()); - } - - /** - * @param object PEAR_Error object - */ - function displayFatalError($eobj) - { - $this->displayError($eobj); - if (class_exists('PEAR_Config')) { - $config = &PEAR_Config::singleton(); - if ($config->get('verbose') > 5) { - if (function_exists('debug_print_backtrace')) { - debug_print_backtrace(); - exit(1); - } - - $raised = false; - foreach (debug_backtrace() as $i => $frame) { - if (!$raised) { - if (isset($frame['class']) - && strtolower($frame['class']) == 'pear' - && strtolower($frame['function']) == 'raiseerror' - ) { - $raised = true; - } else { - continue; - } - } - - $frame['class'] = !isset($frame['class']) ? '' : $frame['class']; - $frame['type'] = !isset($frame['type']) ? '' : $frame['type']; - $frame['function'] = !isset($frame['function']) ? '' : $frame['function']; - $frame['line'] = !isset($frame['line']) ? '' : $frame['line']; - $this->_displayLine("#$i: $frame[class]$frame[type]$frame[function] $frame[line]"); - } - } - } - - exit(1); - } - - /** - * Instruct the runInstallScript method to skip a paramgroup that matches the - * id value passed in. - * - * This method is useful for dynamically configuring which sections of a post-install script - * will be run based on the user's setup, which is very useful for making flexible - * post-install scripts without losing the cross-Frontend ability to retrieve user input - * @param string - */ - function skipParamgroup($id) - { - $this->_skipSections[$id] = true; - } - - function runPostinstallScripts(&$scripts) - { - foreach ($scripts as $i => $script) { - $this->runInstallScript($scripts[$i]->_params, $scripts[$i]->_obj); - } - } - - /** - * @param array $xml contents of postinstallscript tag - * @param object $script post-installation script - * @param string install|upgrade - */ - function runInstallScript($xml, &$script) - { - $this->_skipSections = array(); - if (!is_array($xml) || !isset($xml['paramgroup'])) { - $script->run(array(), '_default'); - return; - } - - $completedPhases = array(); - if (!isset($xml['paramgroup'][0])) { - $xml['paramgroup'] = array($xml['paramgroup']); - } - - foreach ($xml['paramgroup'] as $group) { - if (isset($this->_skipSections[$group['id']])) { - // the post-install script chose to skip this section dynamically - continue; - } - - if (isset($group['name'])) { - $paramname = explode('::', $group['name']); - if ($lastgroup['id'] != $paramname[0]) { - continue; - } - - $group['name'] = $paramname[1]; - if (!isset($answers)) { - return; - } - - if (isset($answers[$group['name']])) { - switch ($group['conditiontype']) { - case '=' : - if ($answers[$group['name']] != $group['value']) { - continue 2; - } - break; - case '!=' : - if ($answers[$group['name']] == $group['value']) { - continue 2; - } - break; - case 'preg_match' : - if (!@preg_match('/' . $group['value'] . '/', - $answers[$group['name']])) { - continue 2; - } - break; - default : - return; - } - } - } - - $lastgroup = $group; - if (isset($group['instructions'])) { - $this->_display($group['instructions']); - } - - if (!isset($group['param'][0])) { - $group['param'] = array($group['param']); - } - - if (isset($group['param'])) { - if (method_exists($script, 'postProcessPrompts')) { - $prompts = $script->postProcessPrompts($group['param'], $group['id']); - if (!is_array($prompts) || count($prompts) != count($group['param'])) { - $this->outputData('postinstall', 'Error: post-install script did not ' . - 'return proper post-processed prompts'); - $prompts = $group['param']; - } else { - foreach ($prompts as $i => $var) { - if (!is_array($var) || !isset($var['prompt']) || - !isset($var['name']) || - ($var['name'] != $group['param'][$i]['name']) || - ($var['type'] != $group['param'][$i]['type']) - ) { - $this->outputData('postinstall', 'Error: post-install script ' . - 'modified the variables or prompts, severe security risk. ' . - 'Will instead use the defaults from the package.xml'); - $prompts = $group['param']; - } - } - } - - $answers = $this->confirmDialog($prompts); - } else { - $answers = $this->confirmDialog($group['param']); - } - } - - if ((isset($answers) && $answers) || !isset($group['param'])) { - if (!isset($answers)) { - $answers = array(); - } - - array_unshift($completedPhases, $group['id']); - if (!$script->run($answers, $group['id'])) { - $script->run($completedPhases, '_undoOnError'); - return; - } - } else { - $script->run($completedPhases, '_undoOnError'); - return; - } - } - } - - /** - * Ask for user input, confirm the answers and continue until the user is satisfied - * @param array an array of arrays, format array('name' => 'paramname', 'prompt' => - * 'text to display', 'type' => 'string'[, default => 'default value']) - * @return array - */ - function confirmDialog($params) - { - $answers = $prompts = $types = array(); - foreach ($params as $param) { - $prompts[$param['name']] = $param['prompt']; - $types[$param['name']] = $param['type']; - $answers[$param['name']] = isset($param['default']) ? $param['default'] : ''; - } - - $tried = false; - do { - if ($tried) { - $i = 1; - foreach ($answers as $var => $value) { - if (!strlen($value)) { - echo $this->bold("* Enter an answer for #" . $i . ": ({$prompts[$var]})\n"); - } - $i++; - } - } - - $answers = $this->userDialog('', $prompts, $types, $answers); - $tried = true; - } while (is_array($answers) && count(array_filter($answers)) != count($prompts)); - - return $answers; - } - - function userDialog($command, $prompts, $types = array(), $defaults = array(), $screensize = 20) - { - if (!is_array($prompts)) { - return array(); - } - - $testprompts = array_keys($prompts); - $result = $defaults; - - reset($prompts); - if (count($prompts) === 1) { - foreach ($prompts as $key => $prompt) { - $type = $types[$key]; - $default = @$defaults[$key]; - print "$prompt "; - if ($default) { - print "[$default] "; - } - print ": "; - - $line = fgets(STDIN, 2048); - $result[$key] = ($default && trim($line) == '') ? $default : trim($line); - } - - return $result; - } - - $first_run = true; - while (true) { - $descLength = max(array_map('strlen', $prompts)); - $descFormat = "%-{$descLength}s"; - $last = count($prompts); - - $i = 0; - foreach ($prompts as $n => $var) { - $res = isset($result[$n]) ? $result[$n] : null; - printf("%2d. $descFormat : %s\n", ++$i, $prompts[$n], $res); - } - print "\n1-$last, 'all', 'abort', or Enter to continue: "; - - $tmp = trim(fgets(STDIN, 1024)); - if (empty($tmp)) { - break; - } - - if ($tmp == 'abort') { - return false; - } - - if (isset($testprompts[(int)$tmp - 1])) { - $var = $testprompts[(int)$tmp - 1]; - $desc = $prompts[$var]; - $current = @$result[$var]; - print "$desc [$current] : "; - $tmp = trim(fgets(STDIN, 1024)); - if ($tmp !== '') { - $result[$var] = $tmp; - } - } elseif ($tmp == 'all') { - foreach ($prompts as $var => $desc) { - $current = $result[$var]; - print "$desc [$current] : "; - $tmp = trim(fgets(STDIN, 1024)); - if (trim($tmp) !== '') { - $result[$var] = trim($tmp); - } - } - } - - $first_run = false; - } - - return $result; - } - - function userConfirm($prompt, $default = 'yes') - { - trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); - static $positives = array('y', 'yes', 'on', '1'); - static $negatives = array('n', 'no', 'off', '0'); - print "$this->lp$prompt [$default] : "; - $fp = fopen("php://stdin", "r"); - $line = fgets($fp, 2048); - fclose($fp); - $answer = strtolower(trim($line)); - if (empty($answer)) { - $answer = $default; - } - if (in_array($answer, $positives)) { - return true; - } - if (in_array($answer, $negatives)) { - return false; - } - if (in_array($default, $positives)) { - return true; - } - return false; - } - - function outputData($data, $command = '_default') - { - switch ($command) { - case 'channel-info': - foreach ($data as $type => $section) { - if ($type == 'main') { - $section['data'] = array_values($section['data']); - } - - $this->outputData($section); - } - break; - case 'install': - case 'upgrade': - case 'upgrade-all': - if (is_array($data) && isset($data['release_warnings'])) { - $this->_displayLine(''); - $this->_startTable(array( - 'border' => false, - 'caption' => 'Release Warnings' - )); - $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55))); - $this->_endTable(); - $this->_displayLine(''); - } - - $this->_displayLine(is_array($data) ? $data['data'] : $data); - break; - case 'search': - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); - } - - $packages = array(); - foreach($data['data'] as $category) { - foreach($category as $name => $pkg) { - $packages[$pkg[0]] = $pkg; - } - } - - $p = array_keys($packages); - natcasesort($p); - foreach ($p as $name) { - $this->_tableRow($packages[$name], null, array(1 => array('wrap' => 55))); - } - - $this->_endTable(); - break; - case 'list-all': - if (!isset($data['data'])) { - $this->_displayLine('No packages in channel'); - break; - } - - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); - } - - $packages = array(); - foreach($data['data'] as $category) { - foreach($category as $name => $pkg) { - $packages[$pkg[0]] = $pkg; - } - } - - $p = array_keys($packages); - natcasesort($p); - foreach ($p as $name) { - $pkg = $packages[$name]; - unset($pkg[4], $pkg[5]); - $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); - } - - $this->_endTable(); - break; - case 'config-show': - $data['border'] = false; - $opts = array( - 0 => array('wrap' => 30), - 1 => array('wrap' => 20), - 2 => array('wrap' => 35) - ); - - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], array('bold' => true), $opts); - } - - foreach ($data['data'] as $group) { - foreach ($group as $value) { - if ($value[2] == '') { - $value[2] = ""; - } - - $this->_tableRow($value, null, $opts); - } - } - - $this->_endTable(); - break; - case 'remote-info': - $d = $data; - $data = array( - 'caption' => 'Package details:', - 'border' => false, - 'data' => array( - array("Latest", $data['stable']), - array("Installed", $data['installed']), - array("Package", $data['name']), - array("License", $data['license']), - array("Category", $data['category']), - array("Summary", $data['summary']), - array("Description", $data['description']), - ), - ); - - if (isset($d['deprecated']) && $d['deprecated']) { - $conf = &PEAR_Config::singleton(); - $reg = $conf->getRegistry(); - $name = $reg->parsedPackageNameToString($d['deprecated'], true); - $data['data'][] = array('Deprecated! use', $name); - } - default: { - if (is_array($data)) { - $this->_startTable($data); - $count = count($data['data'][0]); - if ($count == 2) { - $opts = array(0 => array('wrap' => 25), - 1 => array('wrap' => 48) - ); - } elseif ($count == 3) { - $opts = array(0 => array('wrap' => 30), - 1 => array('wrap' => 20), - 2 => array('wrap' => 35) - ); - } else { - $opts = null; - } - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], - array('bold' => true), - $opts); - } - - if (is_array($data['data'])) { - foreach($data['data'] as $row) { - $this->_tableRow($row, null, $opts); - } - } else { - $this->_tableRow(array($data['data']), null, $opts); - } - $this->_endTable(); - } else { - $this->_displayLine($data); - } - } - } - } - - function log($text, $append_crlf = true) - { - if ($append_crlf) { - return $this->_displayLine($text); - } - - return $this->_display($text); - } - - function bold($text) - { - if (empty($this->term['bold'])) { - return strtoupper($text); - } - - return $this->term['bold'] . $text . $this->term['normal']; - } - - function _displayHeading($title) - { - print $this->lp.$this->bold($title)."\n"; - print $this->lp.str_repeat("=", strlen($title))."\n"; - } - - function _startTable($params = array()) - { - $params['table_data'] = array(); - $params['widest'] = array(); // indexed by column - $params['highest'] = array(); // indexed by row - $params['ncols'] = 0; - $this->params = $params; - } - - function _tableRow($columns, $rowparams = array(), $colparams = array()) - { - $highest = 1; - for ($i = 0; $i < count($columns); $i++) { - $col = &$columns[$i]; - if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) { - $col = wordwrap($col, $colparams[$i]['wrap']); - } - - if (strpos($col, "\n") !== false) { - $multiline = explode("\n", $col); - $w = 0; - foreach ($multiline as $n => $line) { - $len = strlen($line); - if ($len > $w) { - $w = $len; - } - } - $lines = count($multiline); - } else { - $w = strlen($col); - } - - if (isset($this->params['widest'][$i])) { - if ($w > $this->params['widest'][$i]) { - $this->params['widest'][$i] = $w; - } - } else { - $this->params['widest'][$i] = $w; - } - - $tmp = count_chars($columns[$i], 1); - // handle unix, mac and windows formats - $lines = (isset($tmp[10]) ? $tmp[10] : (isset($tmp[13]) ? $tmp[13] : 0)) + 1; - if ($lines > $highest) { - $highest = $lines; - } - } - - if (count($columns) > $this->params['ncols']) { - $this->params['ncols'] = count($columns); - } - - $new_row = array( - 'data' => $columns, - 'height' => $highest, - 'rowparams' => $rowparams, - 'colparams' => $colparams, - ); - $this->params['table_data'][] = $new_row; - } - - function _endTable() - { - extract($this->params); - if (!empty($caption)) { - $this->_displayHeading($caption); - } - - if (count($table_data) === 0) { - return; - } - - if (!isset($width)) { - $width = $widest; - } else { - for ($i = 0; $i < $ncols; $i++) { - if (!isset($width[$i])) { - $width[$i] = $widest[$i]; - } - } - } - - $border = false; - if (empty($border)) { - $cellstart = ''; - $cellend = ' '; - $rowend = ''; - $padrowend = false; - $borderline = ''; - } else { - $cellstart = '| '; - $cellend = ' '; - $rowend = '|'; - $padrowend = true; - $borderline = '+'; - foreach ($width as $w) { - $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1); - $borderline .= '+'; - } - } - - if ($borderline) { - $this->_displayLine($borderline); - } - - for ($i = 0; $i < count($table_data); $i++) { - extract($table_data[$i]); - if (!is_array($rowparams)) { - $rowparams = array(); - } - - if (!is_array($colparams)) { - $colparams = array(); - } - - $rowlines = array(); - if ($height > 1) { - for ($c = 0; $c < count($data); $c++) { - $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]); - if (count($rowlines[$c]) < $height) { - $rowlines[$c] = array_pad($rowlines[$c], $height, ''); - } - } - } else { - for ($c = 0; $c < count($data); $c++) { - $rowlines[$c] = array($data[$c]); - } - } - - for ($r = 0; $r < $height; $r++) { - $rowtext = ''; - for ($c = 0; $c < count($data); $c++) { - if (isset($colparams[$c])) { - $attribs = array_merge($rowparams, $colparams); - } else { - $attribs = $rowparams; - } - - $w = isset($width[$c]) ? $width[$c] : 0; - //$cell = $data[$c]; - $cell = $rowlines[$c][$r]; - $l = strlen($cell); - if ($l > $w) { - $cell = substr($cell, 0, $w); - } - - if (isset($attribs['bold'])) { - $cell = $this->bold($cell); - } - - if ($l < $w) { - // not using str_pad here because we may - // add bold escape characters to $cell - $cell .= str_repeat(' ', $w - $l); - } - - $rowtext .= $cellstart . $cell . $cellend; - } - - if (!$border) { - $rowtext = rtrim($rowtext); - } - - $rowtext .= $rowend; - $this->_displayLine($rowtext); - } - } - - if ($borderline) { - $this->_displayLine($borderline); - } - } - - function _displayLine($text) - { - print "$this->lp$text\n"; - } - - function _display($text) - { - print $text; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Installer.php b/3rdparty/PEAR/Installer.php deleted file mode 100644 index eb17ca7914..0000000000 --- a/3rdparty/PEAR/Installer.php +++ /dev/null @@ -1,1823 +0,0 @@ - - * @author Tomas V.V. Cox - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Installer.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * Used for installation groups in package.xml 2.0 and platform exceptions - */ -require_once 'OS/Guess.php'; -require_once 'PEAR/Downloader.php'; - -define('PEAR_INSTALLER_NOBINARY', -240); -/** - * Administration class used to install PEAR packages and maintain the - * installed package database. - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Martin Jansen - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Installer extends PEAR_Downloader -{ - // {{{ properties - - /** name of the package directory, for example Foo-1.0 - * @var string - */ - var $pkgdir; - - /** directory where PHP code files go - * @var string - */ - var $phpdir; - - /** directory where PHP extension files go - * @var string - */ - var $extdir; - - /** directory where documentation goes - * @var string - */ - var $docdir; - - /** installation root directory (ala PHP's INSTALL_ROOT or - * automake's DESTDIR - * @var string - */ - var $installroot = ''; - - /** debug level - * @var int - */ - var $debug = 1; - - /** temporary directory - * @var string - */ - var $tmpdir; - - /** - * PEAR_Registry object used by the installer - * @var PEAR_Registry - */ - var $registry; - - /** - * array of PEAR_Downloader_Packages - * @var array - */ - var $_downloadedPackages; - - /** List of file transactions queued for an install/upgrade/uninstall. - * - * Format: - * array( - * 0 => array("rename => array("from-file", "to-file")), - * 1 => array("delete" => array("file-to-delete")), - * ... - * ) - * - * @var array - */ - var $file_operations = array(); - - // }}} - - // {{{ constructor - - /** - * PEAR_Installer constructor. - * - * @param object $ui user interface object (instance of PEAR_Frontend_*) - * - * @access public - */ - function PEAR_Installer(&$ui) - { - parent::PEAR_Common(); - $this->setFrontendObject($ui); - $this->debug = $this->config->get('verbose'); - } - - function setOptions($options) - { - $this->_options = $options; - } - - function setConfig(&$config) - { - $this->config = &$config; - $this->_registry = &$config->getRegistry(); - } - - // }}} - - function _removeBackups($files) - { - foreach ($files as $path) { - $this->addFileOperation('removebackup', array($path)); - } - } - - // {{{ _deletePackageFiles() - - /** - * Delete a package's installed files, does not remove empty directories. - * - * @param string package name - * @param string channel name - * @param bool if true, then files are backed up first - * @return bool TRUE on success, or a PEAR error on failure - * @access protected - */ - function _deletePackageFiles($package, $channel = false, $backup = false) - { - if (!$channel) { - $channel = 'pear.php.net'; - } - - if (!strlen($package)) { - return $this->raiseError("No package to uninstall given"); - } - - if (strtolower($package) == 'pear' && $channel == 'pear.php.net') { - // to avoid race conditions, include all possible needed files - require_once 'PEAR/Task/Common.php'; - require_once 'PEAR/Task/Replace.php'; - require_once 'PEAR/Task/Unixeol.php'; - require_once 'PEAR/Task/Windowseol.php'; - require_once 'PEAR/PackageFile/v1.php'; - require_once 'PEAR/PackageFile/v2.php'; - require_once 'PEAR/PackageFile/Generator/v1.php'; - require_once 'PEAR/PackageFile/Generator/v2.php'; - } - - $filelist = $this->_registry->packageInfo($package, 'filelist', $channel); - if ($filelist == null) { - return $this->raiseError("$channel/$package not installed"); - } - - $ret = array(); - foreach ($filelist as $file => $props) { - if (empty($props['installed_as'])) { - continue; - } - - $path = $props['installed_as']; - if ($backup) { - $this->addFileOperation('backup', array($path)); - $ret[] = $path; - } - - $this->addFileOperation('delete', array($path)); - } - - if ($backup) { - return $ret; - } - - return true; - } - - // }}} - // {{{ _installFile() - - /** - * @param string filename - * @param array attributes from tag in package.xml - * @param string path to install the file in - * @param array options from command-line - * @access private - */ - function _installFile($file, $atts, $tmp_path, $options) - { - // {{{ return if this file is meant for another platform - static $os; - if (!isset($this->_registry)) { - $this->_registry = &$this->config->getRegistry(); - } - - if (isset($atts['platform'])) { - if (empty($os)) { - $os = new OS_Guess(); - } - - if (strlen($atts['platform']) && $atts['platform']{0} == '!') { - $negate = true; - $platform = substr($atts['platform'], 1); - } else { - $negate = false; - $platform = $atts['platform']; - } - - if ((bool) $os->matchSignature($platform) === $negate) { - $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")"); - return PEAR_INSTALLER_SKIPPED; - } - } - // }}} - - $channel = $this->pkginfo->getChannel(); - // {{{ assemble the destination paths - switch ($atts['role']) { - case 'src': - case 'extsrc': - $this->source_files++; - return; - case 'doc': - case 'data': - case 'test': - $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel) . - DIRECTORY_SEPARATOR . $this->pkginfo->getPackage(); - unset($atts['baseinstalldir']); - break; - case 'ext': - case 'php': - $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel); - break; - case 'script': - $dest_dir = $this->config->get('bin_dir', null, $channel); - break; - default: - return $this->raiseError("Invalid role `$atts[role]' for file $file"); - } - - $save_destdir = $dest_dir; - if (!empty($atts['baseinstalldir'])) { - $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; - } - - if (dirname($file) != '.' && empty($atts['install-as'])) { - $dest_dir .= DIRECTORY_SEPARATOR . dirname($file); - } - - if (empty($atts['install-as'])) { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file); - } else { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as']; - } - $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file; - - // Clean up the DIRECTORY_SEPARATOR mess - $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; - list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), - array(DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR), - array($dest_file, $orig_file)); - $final_dest_file = $installed_as = $dest_file; - if (isset($this->_options['packagingroot'])) { - $installedas_dest_dir = dirname($final_dest_file); - $installedas_dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); - $final_dest_file = $this->_prependPath($final_dest_file, $this->_options['packagingroot']); - } else { - $installedas_dest_dir = dirname($final_dest_file); - $installedas_dest_file = $installedas_dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); - } - - $dest_dir = dirname($final_dest_file); - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); - if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) { - return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED); - } - // }}} - - if (empty($this->_options['register-only']) && - (!file_exists($dest_dir) || !is_dir($dest_dir))) { - if (!$this->mkDirHier($dest_dir)) { - return $this->raiseError("failed to mkdir $dest_dir", - PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ mkdir $dest_dir"); - } - - // pretty much nothing happens if we are only registering the install - if (empty($this->_options['register-only'])) { - if (empty($atts['replacements'])) { - if (!file_exists($orig_file)) { - return $this->raiseError("file $orig_file does not exist", - PEAR_INSTALLER_FAILED); - } - - if (!@copy($orig_file, $dest_file)) { - return $this->raiseError("failed to write $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - $this->log(3, "+ cp $orig_file $dest_file"); - if (isset($atts['md5sum'])) { - $md5sum = md5_file($dest_file); - } - } else { - // {{{ file with replacements - if (!file_exists($orig_file)) { - return $this->raiseError("file does not exist", - PEAR_INSTALLER_FAILED); - } - - $contents = file_get_contents($orig_file); - if ($contents === false) { - $contents = ''; - } - - if (isset($atts['md5sum'])) { - $md5sum = md5($contents); - } - - $subst_from = $subst_to = array(); - foreach ($atts['replacements'] as $a) { - $to = ''; - if ($a['type'] == 'php-const') { - if (preg_match('/^[a-z0-9_]+\\z/i', $a['to'])) { - eval("\$to = $a[to];"); - } else { - if (!isset($options['soft'])) { - $this->log(0, "invalid php-const replacement: $a[to]"); - } - continue; - } - } elseif ($a['type'] == 'pear-config') { - if ($a['to'] == 'master_server') { - $chan = $this->_registry->getChannel($channel); - if (!PEAR::isError($chan)) { - $to = $chan->getServer(); - } else { - $to = $this->config->get($a['to'], null, $channel); - } - } else { - $to = $this->config->get($a['to'], null, $channel); - } - if (is_null($to)) { - if (!isset($options['soft'])) { - $this->log(0, "invalid pear-config replacement: $a[to]"); - } - continue; - } - } elseif ($a['type'] == 'package-info') { - if ($t = $this->pkginfo->packageInfo($a['to'])) { - $to = $t; - } else { - if (!isset($options['soft'])) { - $this->log(0, "invalid package-info replacement: $a[to]"); - } - continue; - } - } - if (!is_null($to)) { - $subst_from[] = $a['from']; - $subst_to[] = $to; - } - } - - $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file"); - if (sizeof($subst_from)) { - $contents = str_replace($subst_from, $subst_to, $contents); - } - - $wp = @fopen($dest_file, "wb"); - if (!is_resource($wp)) { - return $this->raiseError("failed to create $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - if (@fwrite($wp, $contents) === false) { - return $this->raiseError("failed writing to $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - fclose($wp); - // }}} - } - - // {{{ check the md5 - if (isset($md5sum)) { - if (strtolower($md5sum) === strtolower($atts['md5sum'])) { - $this->log(2, "md5sum ok: $final_dest_file"); - } else { - if (empty($options['force'])) { - // delete the file - if (file_exists($dest_file)) { - unlink($dest_file); - } - - if (!isset($options['ignore-errors'])) { - return $this->raiseError("bad md5sum for file $final_dest_file", - PEAR_INSTALLER_FAILED); - } - - if (!isset($options['soft'])) { - $this->log(0, "warning : bad md5sum for file $final_dest_file"); - } - } else { - if (!isset($options['soft'])) { - $this->log(0, "warning : bad md5sum for file $final_dest_file"); - } - } - } - } - // }}} - // {{{ set file permissions - if (!OS_WINDOWS) { - if ($atts['role'] == 'script') { - $mode = 0777 & ~(int)octdec($this->config->get('umask')); - $this->log(3, "+ chmod +x $dest_file"); - } else { - $mode = 0666 & ~(int)octdec($this->config->get('umask')); - } - - if ($atts['role'] != 'src') { - $this->addFileOperation("chmod", array($mode, $dest_file)); - if (!@chmod($dest_file, $mode)) { - if (!isset($options['soft'])) { - $this->log(0, "failed to change mode of $dest_file: $php_errormsg"); - } - } - } - } - // }}} - - if ($atts['role'] == 'src') { - rename($dest_file, $final_dest_file); - $this->log(2, "renamed source file $dest_file to $final_dest_file"); - } else { - $this->addFileOperation("rename", array($dest_file, $final_dest_file, - $atts['role'] == 'ext')); - } - } - - // Store the full path where the file was installed for easy unistall - if ($atts['role'] != 'script') { - $loc = $this->config->get($atts['role'] . '_dir'); - } else { - $loc = $this->config->get('bin_dir'); - } - - if ($atts['role'] != 'src') { - $this->addFileOperation("installed_as", array($file, $installed_as, - $loc, - dirname(substr($installedas_dest_file, strlen($loc))))); - } - - //$this->log(2, "installed: $dest_file"); - return PEAR_INSTALLER_OK; - } - - // }}} - // {{{ _installFile2() - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param string filename - * @param array attributes from tag in package.xml - * @param string path to install the file in - * @param array options from command-line - * @access private - */ - function _installFile2(&$pkg, $file, &$real_atts, $tmp_path, $options) - { - $atts = $real_atts; - if (!isset($this->_registry)) { - $this->_registry = &$this->config->getRegistry(); - } - - $channel = $pkg->getChannel(); - // {{{ assemble the destination paths - if (!in_array($atts['attribs']['role'], - PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) { - return $this->raiseError('Invalid role `' . $atts['attribs']['role'] . - "' for file $file"); - } - - $role = &PEAR_Installer_Role::factory($pkg, $atts['attribs']['role'], $this->config); - $err = $role->setup($this, $pkg, $atts['attribs'], $file); - if (PEAR::isError($err)) { - return $err; - } - - if (!$role->isInstallable()) { - return; - } - - $info = $role->processInstallation($pkg, $atts['attribs'], $file, $tmp_path); - if (PEAR::isError($info)) { - return $info; - } - - list($save_destdir, $dest_dir, $dest_file, $orig_file) = $info; - if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) { - return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED); - } - - $final_dest_file = $installed_as = $dest_file; - if (isset($this->_options['packagingroot'])) { - $final_dest_file = $this->_prependPath($final_dest_file, - $this->_options['packagingroot']); - } - - $dest_dir = dirname($final_dest_file); - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); - // }}} - - if (empty($this->_options['register-only'])) { - if (!file_exists($dest_dir) || !is_dir($dest_dir)) { - if (!$this->mkDirHier($dest_dir)) { - return $this->raiseError("failed to mkdir $dest_dir", - PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ mkdir $dest_dir"); - } - } - - $attribs = $atts['attribs']; - unset($atts['attribs']); - // pretty much nothing happens if we are only registering the install - if (empty($this->_options['register-only'])) { - if (!count($atts)) { // no tasks - if (!file_exists($orig_file)) { - return $this->raiseError("file $orig_file does not exist", - PEAR_INSTALLER_FAILED); - } - - if (!@copy($orig_file, $dest_file)) { - return $this->raiseError("failed to write $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - $this->log(3, "+ cp $orig_file $dest_file"); - if (isset($attribs['md5sum'])) { - $md5sum = md5_file($dest_file); - } - } else { // file with tasks - if (!file_exists($orig_file)) { - return $this->raiseError("file $orig_file does not exist", - PEAR_INSTALLER_FAILED); - } - - $contents = file_get_contents($orig_file); - if ($contents === false) { - $contents = ''; - } - - if (isset($attribs['md5sum'])) { - $md5sum = md5($contents); - } - - foreach ($atts as $tag => $raw) { - $tag = str_replace(array($pkg->getTasksNs() . ':', '-'), array('', '_'), $tag); - $task = "PEAR_Task_$tag"; - $task = &new $task($this->config, $this, PEAR_TASK_INSTALL); - if (!$task->isScript()) { // scripts are only handled after installation - $task->init($raw, $attribs, $pkg->getLastInstalledVersion()); - $res = $task->startSession($pkg, $contents, $final_dest_file); - if ($res === false) { - continue; // skip this file - } - - if (PEAR::isError($res)) { - return $res; - } - - $contents = $res; // save changes - } - - $wp = @fopen($dest_file, "wb"); - if (!is_resource($wp)) { - return $this->raiseError("failed to create $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - if (fwrite($wp, $contents) === false) { - return $this->raiseError("failed writing to $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - - fclose($wp); - } - } - - // {{{ check the md5 - if (isset($md5sum)) { - // Make sure the original md5 sum matches with expected - if (strtolower($md5sum) === strtolower($attribs['md5sum'])) { - $this->log(2, "md5sum ok: $final_dest_file"); - - if (isset($contents)) { - // set md5 sum based on $content in case any tasks were run. - $real_atts['attribs']['md5sum'] = md5($contents); - } - } else { - if (empty($options['force'])) { - // delete the file - if (file_exists($dest_file)) { - unlink($dest_file); - } - - if (!isset($options['ignore-errors'])) { - return $this->raiseError("bad md5sum for file $final_dest_file", - PEAR_INSTALLER_FAILED); - } - - if (!isset($options['soft'])) { - $this->log(0, "warning : bad md5sum for file $final_dest_file"); - } - } else { - if (!isset($options['soft'])) { - $this->log(0, "warning : bad md5sum for file $final_dest_file"); - } - } - } - } else { - $real_atts['attribs']['md5sum'] = md5_file($dest_file); - } - - // }}} - // {{{ set file permissions - if (!OS_WINDOWS) { - if ($role->isExecutable()) { - $mode = 0777 & ~(int)octdec($this->config->get('umask')); - $this->log(3, "+ chmod +x $dest_file"); - } else { - $mode = 0666 & ~(int)octdec($this->config->get('umask')); - } - - if ($attribs['role'] != 'src') { - $this->addFileOperation("chmod", array($mode, $dest_file)); - if (!@chmod($dest_file, $mode)) { - if (!isset($options['soft'])) { - $this->log(0, "failed to change mode of $dest_file: $php_errormsg"); - } - } - } - } - // }}} - - if ($attribs['role'] == 'src') { - rename($dest_file, $final_dest_file); - $this->log(2, "renamed source file $dest_file to $final_dest_file"); - } else { - $this->addFileOperation("rename", array($dest_file, $final_dest_file, $role->isExtension())); - } - } - - // Store the full path where the file was installed for easy uninstall - if ($attribs['role'] != 'src') { - $loc = $this->config->get($role->getLocationConfig(), null, $channel); - $this->addFileOperation('installed_as', array($file, $installed_as, - $loc, - dirname(substr($installed_as, strlen($loc))))); - } - - //$this->log(2, "installed: $dest_file"); - return PEAR_INSTALLER_OK; - } - - // }}} - // {{{ addFileOperation() - - /** - * Add a file operation to the current file transaction. - * - * @see startFileTransaction() - * @param string $type This can be one of: - * - rename: rename a file ($data has 3 values) - * - backup: backup an existing file ($data has 1 value) - * - removebackup: clean up backups created during install ($data has 1 value) - * - chmod: change permissions on a file ($data has 2 values) - * - delete: delete a file ($data has 1 value) - * - rmdir: delete a directory if empty ($data has 1 value) - * - installed_as: mark a file as installed ($data has 4 values). - * @param array $data For all file operations, this array must contain the - * full path to the file or directory that is being operated on. For - * the rename command, the first parameter must be the file to rename, - * the second its new name, the third whether this is a PHP extension. - * - * The installed_as operation contains 4 elements in this order: - * 1. Filename as listed in the filelist element from package.xml - * 2. Full path to the installed file - * 3. Full path from the php_dir configuration variable used in this - * installation - * 4. Relative path from the php_dir that this file is installed in - */ - function addFileOperation($type, $data) - { - if (!is_array($data)) { - return $this->raiseError('Internal Error: $data in addFileOperation' - . ' must be an array, was ' . gettype($data)); - } - - if ($type == 'chmod') { - $octmode = decoct($data[0]); - $this->log(3, "adding to transaction: $type $octmode $data[1]"); - } else { - $this->log(3, "adding to transaction: $type " . implode(" ", $data)); - } - $this->file_operations[] = array($type, $data); - } - - // }}} - // {{{ startFileTransaction() - - function startFileTransaction($rollback_in_case = false) - { - if (count($this->file_operations) && $rollback_in_case) { - $this->rollbackFileTransaction(); - } - $this->file_operations = array(); - } - - // }}} - // {{{ commitFileTransaction() - - function commitFileTransaction() - { - // {{{ first, check permissions and such manually - $errors = array(); - foreach ($this->file_operations as $key => $tr) { - list($type, $data) = $tr; - switch ($type) { - case 'rename': - if (!file_exists($data[0])) { - $errors[] = "cannot rename file $data[0], doesn't exist"; - } - - // check that dest dir. is writable - if (!is_writable(dirname($data[1]))) { - $errors[] = "permission denied ($type): $data[1]"; - } - break; - case 'chmod': - // check that file is writable - if (!is_writable($data[1])) { - $errors[] = "permission denied ($type): $data[1] " . decoct($data[0]); - } - break; - case 'delete': - if (!file_exists($data[0])) { - $this->log(2, "warning: file $data[0] doesn't exist, can't be deleted"); - } - // check that directory is writable - if (file_exists($data[0])) { - if (!is_writable(dirname($data[0]))) { - $errors[] = "permission denied ($type): $data[0]"; - } else { - // make sure the file to be deleted can be opened for writing - $fp = false; - if (!is_dir($data[0]) && - (!is_writable($data[0]) || !($fp = @fopen($data[0], 'a')))) { - $errors[] = "permission denied ($type): $data[0]"; - } elseif ($fp) { - fclose($fp); - } - } - - /* Verify we are not deleting a file owned by another package - * This can happen when a file moves from package A to B in - * an upgrade ala http://pear.php.net/17986 - */ - $info = array( - 'package' => strtolower($this->pkginfo->getName()), - 'channel' => strtolower($this->pkginfo->getChannel()), - ); - $result = $this->_registry->checkFileMap($data[0], $info, '1.1'); - if (is_array($result)) { - $res = array_diff($result, $info); - if (!empty($res)) { - $new = $this->_registry->getPackage($result[1], $result[0]); - $this->file_operations[$key] = false; - $this->log(3, "file $data[0] was scheduled for removal from {$this->pkginfo->getName()} but is owned by {$new->getChannel()}/{$new->getName()}, removal has been cancelled."); - } - } - } - break; - } - - } - // }}} - - $n = count($this->file_operations); - $this->log(2, "about to commit $n file operations for " . $this->pkginfo->getName()); - - $m = count($errors); - if ($m > 0) { - foreach ($errors as $error) { - if (!isset($this->_options['soft'])) { - $this->log(1, $error); - } - } - - if (!isset($this->_options['ignore-errors'])) { - return false; - } - } - - $this->_dirtree = array(); - // {{{ really commit the transaction - foreach ($this->file_operations as $i => $tr) { - if (!$tr) { - // support removal of non-existing backups - continue; - } - - list($type, $data) = $tr; - switch ($type) { - case 'backup': - if (!file_exists($data[0])) { - $this->file_operations[$i] = false; - break; - } - - if (!@copy($data[0], $data[0] . '.bak')) { - $this->log(1, 'Could not copy ' . $data[0] . ' to ' . $data[0] . - '.bak ' . $php_errormsg); - return false; - } - $this->log(3, "+ backup $data[0] to $data[0].bak"); - break; - case 'removebackup': - if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) { - unlink($data[0] . '.bak'); - $this->log(3, "+ rm backup of $data[0] ($data[0].bak)"); - } - break; - case 'rename': - $test = file_exists($data[1]) ? @unlink($data[1]) : null; - if (!$test && file_exists($data[1])) { - if ($data[2]) { - $extra = ', this extension must be installed manually. Rename to "' . - basename($data[1]) . '"'; - } else { - $extra = ''; - } - - if (!isset($this->_options['soft'])) { - $this->log(1, 'Could not delete ' . $data[1] . ', cannot rename ' . - $data[0] . $extra); - } - - if (!isset($this->_options['ignore-errors'])) { - return false; - } - } - - // permissions issues with rename - copy() is far superior - $perms = @fileperms($data[0]); - if (!@copy($data[0], $data[1])) { - $this->log(1, 'Could not rename ' . $data[0] . ' to ' . $data[1] . - ' ' . $php_errormsg); - return false; - } - - // copy over permissions, otherwise they are lost - @chmod($data[1], $perms); - @unlink($data[0]); - $this->log(3, "+ mv $data[0] $data[1]"); - break; - case 'chmod': - if (!@chmod($data[1], $data[0])) { - $this->log(1, 'Could not chmod ' . $data[1] . ' to ' . - decoct($data[0]) . ' ' . $php_errormsg); - return false; - } - - $octmode = decoct($data[0]); - $this->log(3, "+ chmod $octmode $data[1]"); - break; - case 'delete': - if (file_exists($data[0])) { - if (!@unlink($data[0])) { - $this->log(1, 'Could not delete ' . $data[0] . ' ' . - $php_errormsg); - return false; - } - $this->log(3, "+ rm $data[0]"); - } - break; - case 'rmdir': - if (file_exists($data[0])) { - do { - $testme = opendir($data[0]); - while (false !== ($entry = readdir($testme))) { - if ($entry == '.' || $entry == '..') { - continue; - } - closedir($testme); - break 2; // this directory is not empty and can't be - // deleted - } - - closedir($testme); - if (!@rmdir($data[0])) { - $this->log(1, 'Could not rmdir ' . $data[0] . ' ' . - $php_errormsg); - return false; - } - $this->log(3, "+ rmdir $data[0]"); - } while (false); - } - break; - case 'installed_as': - $this->pkginfo->setInstalledAs($data[0], $data[1]); - if (!isset($this->_dirtree[dirname($data[1])])) { - $this->_dirtree[dirname($data[1])] = true; - $this->pkginfo->setDirtree(dirname($data[1])); - - while(!empty($data[3]) && dirname($data[3]) != $data[3] && - $data[3] != '/' && $data[3] != '\\') { - $this->pkginfo->setDirtree($pp = - $this->_prependPath($data[3], $data[2])); - $this->_dirtree[$pp] = true; - $data[3] = dirname($data[3]); - } - } - break; - } - } - // }}} - $this->log(2, "successfully committed $n file operations"); - $this->file_operations = array(); - return true; - } - - // }}} - // {{{ rollbackFileTransaction() - - function rollbackFileTransaction() - { - $n = count($this->file_operations); - $this->log(2, "rolling back $n file operations"); - foreach ($this->file_operations as $tr) { - list($type, $data) = $tr; - switch ($type) { - case 'backup': - if (file_exists($data[0] . '.bak')) { - if (file_exists($data[0] && is_writable($data[0]))) { - unlink($data[0]); - } - @copy($data[0] . '.bak', $data[0]); - $this->log(3, "+ restore $data[0] from $data[0].bak"); - } - break; - case 'removebackup': - if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) { - unlink($data[0] . '.bak'); - $this->log(3, "+ rm backup of $data[0] ($data[0].bak)"); - } - break; - case 'rename': - @unlink($data[0]); - $this->log(3, "+ rm $data[0]"); - break; - case 'mkdir': - @rmdir($data[0]); - $this->log(3, "+ rmdir $data[0]"); - break; - case 'chmod': - break; - case 'delete': - break; - case 'installed_as': - $this->pkginfo->setInstalledAs($data[0], false); - break; - } - } - $this->pkginfo->resetDirtree(); - $this->file_operations = array(); - } - - // }}} - // {{{ mkDirHier($dir) - - function mkDirHier($dir) - { - $this->addFileOperation('mkdir', array($dir)); - return parent::mkDirHier($dir); - } - - // }}} - // {{{ download() - - /** - * Download any files and their dependencies, if necessary - * - * @param array a mixed list of package names, local files, or package.xml - * @param PEAR_Config - * @param array options from the command line - * @param array this is the array that will be populated with packages to - * install. Format of each entry: - * - * - * array('pkg' => 'package_name', 'file' => '/path/to/local/file', - * 'info' => array() // parsed package.xml - * ); - * - * @param array this will be populated with any error messages - * @param false private recursion variable - * @param false private recursion variable - * @param false private recursion variable - * @deprecated in favor of PEAR_Downloader - */ - function download($packages, $options, &$config, &$installpackages, - &$errors, $installed = false, $willinstall = false, $state = false) - { - // trickiness: initialize here - parent::PEAR_Downloader($this->ui, $options, $config); - $ret = parent::download($packages); - $errors = $this->getErrorMsgs(); - $installpackages = $this->getDownloadedPackages(); - trigger_error("PEAR Warning: PEAR_Installer::download() is deprecated " . - "in favor of PEAR_Downloader class", E_USER_WARNING); - return $ret; - } - - // }}} - // {{{ _parsePackageXml() - - function _parsePackageXml(&$descfile) - { - // Parse xml file ----------------------------------------------- - $pkg = new PEAR_PackageFile($this->config, $this->debug); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $p = &$pkg->fromAnyFile($descfile, PEAR_VALIDATE_INSTALLING); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($p)) { - if (is_array($p->getUserInfo())) { - foreach ($p->getUserInfo() as $err) { - $loglevel = $err['level'] == 'error' ? 0 : 1; - if (!isset($this->_options['soft'])) { - $this->log($loglevel, ucfirst($err['level']) . ': ' . $err['message']); - } - } - } - return $this->raiseError('Installation failed: invalid package file'); - } - - $descfile = $p->getPackageFile(); - return $p; - } - - // }}} - /** - * Set the list of PEAR_Downloader_Package objects to allow more sane - * dependency validation - * @param array - */ - function setDownloadedPackages(&$pkgs) - { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $err = $this->analyzeDependencies($pkgs); - PEAR::popErrorHandling(); - if (PEAR::isError($err)) { - return $err; - } - $this->_downloadedPackages = &$pkgs; - } - - /** - * Set the list of PEAR_Downloader_Package objects to allow more sane - * dependency validation - * @param array - */ - function setUninstallPackages(&$pkgs) - { - $this->_downloadedPackages = &$pkgs; - } - - function getInstallPackages() - { - return $this->_downloadedPackages; - } - - // {{{ install() - - /** - * Installs the files within the package file specified. - * - * @param string|PEAR_Downloader_Package $pkgfile path to the package file, - * or a pre-initialized packagefile object - * @param array $options - * recognized options: - * - installroot : optional prefix directory for installation - * - force : force installation - * - register-only : update registry but don't install files - * - upgrade : upgrade existing install - * - soft : fail silently - * - nodeps : ignore dependency conflicts/missing dependencies - * - alldeps : install all dependencies - * - onlyreqdeps : install only required dependencies - * - * @return array|PEAR_Error package info if successful - */ - function install($pkgfile, $options = array()) - { - $this->_options = $options; - $this->_registry = &$this->config->getRegistry(); - if (is_object($pkgfile)) { - $dlpkg = &$pkgfile; - $pkg = $pkgfile->getPackageFile(); - $pkgfile = $pkg->getArchiveFile(); - $descfile = $pkg->getPackageFile(); - } else { - $descfile = $pkgfile; - $pkg = $this->_parsePackageXml($descfile); - if (PEAR::isError($pkg)) { - return $pkg; - } - } - - $tmpdir = dirname($descfile); - if (realpath($descfile) != realpath($pkgfile)) { - // Use the temp_dir since $descfile can contain the download dir path - $tmpdir = $this->config->get('temp_dir', null, 'pear.php.net'); - $tmpdir = System::mktemp('-d -t "' . $tmpdir . '"'); - - $tar = new Archive_Tar($pkgfile); - if (!$tar->extract($tmpdir)) { - return $this->raiseError("unable to unpack $pkgfile"); - } - } - - $pkgname = $pkg->getName(); - $channel = $pkg->getChannel(); - if (isset($this->_options['packagingroot'])) { - $regdir = $this->_prependPath( - $this->config->get('php_dir', null, 'pear.php.net'), - $this->_options['packagingroot']); - - $packrootphp_dir = $this->_prependPath( - $this->config->get('php_dir', null, $channel), - $this->_options['packagingroot']); - } - - if (isset($options['installroot'])) { - $this->config->setInstallRoot($options['installroot']); - $this->_registry = &$this->config->getRegistry(); - $installregistry = &$this->_registry; - $this->installroot = ''; // all done automagically now - $php_dir = $this->config->get('php_dir', null, $channel); - } else { - $this->config->setInstallRoot(false); - $this->_registry = &$this->config->getRegistry(); - if (isset($this->_options['packagingroot'])) { - $installregistry = &new PEAR_Registry($regdir); - if (!$installregistry->channelExists($channel, true)) { - // we need to fake a channel-discover of this channel - $chanobj = $this->_registry->getChannel($channel, true); - $installregistry->addChannel($chanobj); - } - $php_dir = $packrootphp_dir; - } else { - $installregistry = &$this->_registry; - $php_dir = $this->config->get('php_dir', null, $channel); - } - $this->installroot = ''; - } - - // {{{ checks to do when not in "force" mode - if (empty($options['force']) && - (file_exists($this->config->get('php_dir')) && - is_dir($this->config->get('php_dir')))) { - $testp = $channel == 'pear.php.net' ? $pkgname : array($channel, $pkgname); - $instfilelist = $pkg->getInstallationFileList(true); - if (PEAR::isError($instfilelist)) { - return $instfilelist; - } - - // ensure we have the most accurate registry - $installregistry->flushFileMap(); - $test = $installregistry->checkFileMap($instfilelist, $testp, '1.1'); - if (PEAR::isError($test)) { - return $test; - } - - if (sizeof($test)) { - $pkgs = $this->getInstallPackages(); - $found = false; - foreach ($pkgs as $param) { - if ($pkg->isSubpackageOf($param)) { - $found = true; - break; - } - } - - if ($found) { - // subpackages can conflict with earlier versions of parent packages - $parentreg = $installregistry->packageInfo($param->getPackage(), null, $param->getChannel()); - $tmp = $test; - foreach ($tmp as $file => $info) { - if (is_array($info)) { - if (strtolower($info[1]) == strtolower($param->getPackage()) && - strtolower($info[0]) == strtolower($param->getChannel()) - ) { - if (isset($parentreg['filelist'][$file])) { - unset($parentreg['filelist'][$file]); - } else{ - $pos = strpos($file, '/'); - $basedir = substr($file, 0, $pos); - $file2 = substr($file, $pos + 1); - if (isset($parentreg['filelist'][$file2]['baseinstalldir']) - && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir - ) { - unset($parentreg['filelist'][$file2]); - } - } - - unset($test[$file]); - } - } else { - if (strtolower($param->getChannel()) != 'pear.php.net') { - continue; - } - - if (strtolower($info) == strtolower($param->getPackage())) { - if (isset($parentreg['filelist'][$file])) { - unset($parentreg['filelist'][$file]); - } else{ - $pos = strpos($file, '/'); - $basedir = substr($file, 0, $pos); - $file2 = substr($file, $pos + 1); - if (isset($parentreg['filelist'][$file2]['baseinstalldir']) - && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir - ) { - unset($parentreg['filelist'][$file2]); - } - } - - unset($test[$file]); - } - } - } - - $pfk = &new PEAR_PackageFile($this->config); - $parentpkg = &$pfk->fromArray($parentreg); - $installregistry->updatePackage2($parentpkg); - } - - if ($param->getChannel() == 'pecl.php.net' && isset($options['upgrade'])) { - $tmp = $test; - foreach ($tmp as $file => $info) { - if (is_string($info)) { - // pear.php.net packages are always stored as strings - if (strtolower($info) == strtolower($param->getPackage())) { - // upgrading existing package - unset($test[$file]); - } - } - } - } - - if (count($test)) { - $msg = "$channel/$pkgname: conflicting files found:\n"; - $longest = max(array_map("strlen", array_keys($test))); - $fmt = "%${longest}s (%s)\n"; - foreach ($test as $file => $info) { - if (!is_array($info)) { - $info = array('pear.php.net', $info); - } - $info = $info[0] . '/' . $info[1]; - $msg .= sprintf($fmt, $file, $info); - } - - if (!isset($options['ignore-errors'])) { - return $this->raiseError($msg); - } - - if (!isset($options['soft'])) { - $this->log(0, "WARNING: $msg"); - } - } - } - } - // }}} - - $this->startFileTransaction(); - - $usechannel = $channel; - if ($channel == 'pecl.php.net') { - $test = $installregistry->packageExists($pkgname, $channel); - if (!$test) { - $test = $installregistry->packageExists($pkgname, 'pear.php.net'); - $usechannel = 'pear.php.net'; - } - } else { - $test = $installregistry->packageExists($pkgname, $channel); - } - - if (empty($options['upgrade']) && empty($options['soft'])) { - // checks to do only when installing new packages - if (empty($options['force']) && $test) { - return $this->raiseError("$channel/$pkgname is already installed"); - } - } else { - // Upgrade - if ($test) { - $v1 = $installregistry->packageInfo($pkgname, 'version', $usechannel); - $v2 = $pkg->getVersion(); - $cmp = version_compare("$v1", "$v2", 'gt'); - if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) { - return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)"); - } - } - } - - // Do cleanups for upgrade and install, remove old release's files first - if ($test && empty($options['register-only'])) { - // when upgrading, remove old release's files first: - if (PEAR::isError($err = $this->_deletePackageFiles($pkgname, $usechannel, - true))) { - if (!isset($options['ignore-errors'])) { - return $this->raiseError($err); - } - - if (!isset($options['soft'])) { - $this->log(0, 'WARNING: ' . $err->getMessage()); - } - } else { - $backedup = $err; - } - } - - // {{{ Copy files to dest dir --------------------------------------- - - // info from the package it self we want to access from _installFile - $this->pkginfo = &$pkg; - // used to determine whether we should build any C code - $this->source_files = 0; - - $savechannel = $this->config->get('default_channel'); - if (empty($options['register-only']) && !is_dir($php_dir)) { - if (PEAR::isError(System::mkdir(array('-p'), $php_dir))) { - return $this->raiseError("no installation destination directory '$php_dir'\n"); - } - } - - if (substr($pkgfile, -4) != '.xml') { - $tmpdir .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkg->getVersion(); - } - - $this->configSet('default_channel', $channel); - // {{{ install files - - $ver = $pkg->getPackagexmlVersion(); - if (version_compare($ver, '2.0', '>=')) { - $filelist = $pkg->getInstallationFilelist(); - } else { - $filelist = $pkg->getFileList(); - } - - if (PEAR::isError($filelist)) { - return $filelist; - } - - $p = &$installregistry->getPackage($pkgname, $channel); - $dirtree = (empty($options['register-only']) && $p) ? $p->getDirTree() : false; - - $pkg->resetFilelist(); - $pkg->setLastInstalledVersion($installregistry->packageInfo($pkg->getPackage(), - 'version', $pkg->getChannel())); - foreach ($filelist as $file => $atts) { - $this->expectError(PEAR_INSTALLER_FAILED); - if ($pkg->getPackagexmlVersion() == '1.0') { - $res = $this->_installFile($file, $atts, $tmpdir, $options); - } else { - $res = $this->_installFile2($pkg, $file, $atts, $tmpdir, $options); - } - $this->popExpect(); - - if (PEAR::isError($res)) { - if (empty($options['ignore-errors'])) { - $this->rollbackFileTransaction(); - if ($res->getMessage() == "file does not exist") { - $this->raiseError("file $file in package.xml does not exist"); - } - - return $this->raiseError($res); - } - - if (!isset($options['soft'])) { - $this->log(0, "Warning: " . $res->getMessage()); - } - } - - $real = isset($atts['attribs']) ? $atts['attribs'] : $atts; - if ($res == PEAR_INSTALLER_OK && $real['role'] != 'src') { - // Register files that were installed - $pkg->installedFile($file, $atts); - } - } - // }}} - - // {{{ compile and install source files - if ($this->source_files > 0 && empty($options['nobuild'])) { - if (PEAR::isError($err = - $this->_compileSourceFiles($savechannel, $pkg))) { - return $err; - } - } - // }}} - - if (isset($backedup)) { - $this->_removeBackups($backedup); - } - - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - $this->configSet('default_channel', $savechannel); - return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED); - } - // }}} - - $ret = false; - $installphase = 'install'; - $oldversion = false; - // {{{ Register that the package is installed ----------------------- - if (empty($options['upgrade'])) { - // if 'force' is used, replace the info in registry - $usechannel = $channel; - if ($channel == 'pecl.php.net') { - $test = $installregistry->packageExists($pkgname, $channel); - if (!$test) { - $test = $installregistry->packageExists($pkgname, 'pear.php.net'); - $usechannel = 'pear.php.net'; - } - } else { - $test = $installregistry->packageExists($pkgname, $channel); - } - - if (!empty($options['force']) && $test) { - $oldversion = $installregistry->packageInfo($pkgname, 'version', $usechannel); - $installregistry->deletePackage($pkgname, $usechannel); - } - $ret = $installregistry->addPackage2($pkg); - } else { - if ($dirtree) { - $this->startFileTransaction(); - // attempt to delete empty directories - uksort($dirtree, array($this, '_sortDirs')); - foreach($dirtree as $dir => $notused) { - $this->addFileOperation('rmdir', array($dir)); - } - $this->commitFileTransaction(); - } - - $usechannel = $channel; - if ($channel == 'pecl.php.net') { - $test = $installregistry->packageExists($pkgname, $channel); - if (!$test) { - $test = $installregistry->packageExists($pkgname, 'pear.php.net'); - $usechannel = 'pear.php.net'; - } - } else { - $test = $installregistry->packageExists($pkgname, $channel); - } - - // new: upgrade installs a package if it isn't installed - if (!$test) { - $ret = $installregistry->addPackage2($pkg); - } else { - if ($usechannel != $channel) { - $installregistry->deletePackage($pkgname, $usechannel); - $ret = $installregistry->addPackage2($pkg); - } else { - $ret = $installregistry->updatePackage2($pkg); - } - $installphase = 'upgrade'; - } - } - - if (!$ret) { - $this->configSet('default_channel', $savechannel); - return $this->raiseError("Adding package $channel/$pkgname to registry failed"); - } - // }}} - - $this->configSet('default_channel', $savechannel); - if (class_exists('PEAR_Task_Common')) { // this is auto-included if any tasks exist - if (PEAR_Task_Common::hasPostinstallTasks()) { - PEAR_Task_Common::runPostinstallTasks($installphase); - } - } - - return $pkg->toArray(true); - } - - // }}} - - // {{{ _compileSourceFiles() - /** - * @param string - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - */ - function _compileSourceFiles($savechannel, &$filelist) - { - require_once 'PEAR/Builder.php'; - $this->log(1, "$this->source_files source files, building"); - $bob = &new PEAR_Builder($this->ui); - $bob->debug = $this->debug; - $built = $bob->build($filelist, array(&$this, '_buildCallback')); - if (PEAR::isError($built)) { - $this->rollbackFileTransaction(); - $this->configSet('default_channel', $savechannel); - return $built; - } - - $this->log(1, "\nBuild process completed successfully"); - foreach ($built as $ext) { - $bn = basename($ext['file']); - list($_ext_name, $_ext_suff) = explode('.', $bn); - if ($_ext_suff == '.so' || $_ext_suff == '.dll') { - if (extension_loaded($_ext_name)) { - $this->raiseError("Extension '$_ext_name' already loaded. " . - 'Please unload it in your php.ini file ' . - 'prior to install or upgrade'); - } - $role = 'ext'; - } else { - $role = 'src'; - } - - $dest = $ext['dest']; - $packagingroot = ''; - if (isset($this->_options['packagingroot'])) { - $packagingroot = $this->_options['packagingroot']; - } - - $copyto = $this->_prependPath($dest, $packagingroot); - $extra = $copyto != $dest ? " as '$copyto'" : ''; - $this->log(1, "Installing '$dest'$extra"); - - $copydir = dirname($copyto); - // pretty much nothing happens if we are only registering the install - if (empty($this->_options['register-only'])) { - if (!file_exists($copydir) || !is_dir($copydir)) { - if (!$this->mkDirHier($copydir)) { - return $this->raiseError("failed to mkdir $copydir", - PEAR_INSTALLER_FAILED); - } - - $this->log(3, "+ mkdir $copydir"); - } - - if (!@copy($ext['file'], $copyto)) { - return $this->raiseError("failed to write $copyto ($php_errormsg)", PEAR_INSTALLER_FAILED); - } - - $this->log(3, "+ cp $ext[file] $copyto"); - $this->addFileOperation('rename', array($ext['file'], $copyto)); - if (!OS_WINDOWS) { - $mode = 0666 & ~(int)octdec($this->config->get('umask')); - $this->addFileOperation('chmod', array($mode, $copyto)); - if (!@chmod($copyto, $mode)) { - $this->log(0, "failed to change mode of $copyto ($php_errormsg)"); - } - } - } - - - $data = array( - 'role' => $role, - 'name' => $bn, - 'installed_as' => $dest, - 'php_api' => $ext['php_api'], - 'zend_mod_api' => $ext['zend_mod_api'], - 'zend_ext_api' => $ext['zend_ext_api'], - ); - - if ($filelist->getPackageXmlVersion() == '1.0') { - $filelist->installedFile($bn, $data); - } else { - $filelist->installedFile($bn, array('attribs' => $data)); - } - } - } - - // }}} - function &getUninstallPackages() - { - return $this->_downloadedPackages; - } - // {{{ uninstall() - - /** - * Uninstall a package - * - * This method removes all files installed by the application, and then - * removes any empty directories. - * @param string package name - * @param array Command-line options. Possibilities include: - * - * - installroot: base installation dir, if not the default - * - register-only : update registry but don't remove files - * - nodeps: do not process dependencies of other packages to ensure - * uninstallation does not break things - */ - function uninstall($package, $options = array()) - { - $installRoot = isset($options['installroot']) ? $options['installroot'] : ''; - $this->config->setInstallRoot($installRoot); - - $this->installroot = ''; - $this->_registry = &$this->config->getRegistry(); - if (is_object($package)) { - $channel = $package->getChannel(); - $pkg = $package; - $package = $pkg->getPackage(); - } else { - $pkg = false; - $info = $this->_registry->parsePackageName($package, - $this->config->get('default_channel')); - $channel = $info['channel']; - $package = $info['package']; - } - - $savechannel = $this->config->get('default_channel'); - $this->configSet('default_channel', $channel); - if (!is_object($pkg)) { - $pkg = $this->_registry->getPackage($package, $channel); - } - - if (!$pkg) { - $this->configSet('default_channel', $savechannel); - return $this->raiseError($this->_registry->parsedPackageNameToString( - array( - 'channel' => $channel, - 'package' => $package - ), true) . ' not installed'); - } - - if ($pkg->getInstalledBinary()) { - // this is just an alias for a binary package - return $this->_registry->deletePackage($package, $channel); - } - - $filelist = $pkg->getFilelist(); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - - $depchecker = &new PEAR_Dependency2($this->config, $options, - array('channel' => $channel, 'package' => $package), - PEAR_VALIDATE_UNINSTALLING); - $e = $depchecker->validatePackageUninstall($this); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($e)) { - if (!isset($options['ignore-errors'])) { - return $this->raiseError($e); - } - - if (!isset($options['soft'])) { - $this->log(0, 'WARNING: ' . $e->getMessage()); - } - } elseif (is_array($e)) { - if (!isset($options['soft'])) { - $this->log(0, $e[0]); - } - } - - $this->pkginfo = &$pkg; - // pretty much nothing happens if we are only registering the uninstall - if (empty($options['register-only'])) { - // {{{ Delete the files - $this->startFileTransaction(); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - if (PEAR::isError($err = $this->_deletePackageFiles($package, $channel))) { - PEAR::popErrorHandling(); - $this->rollbackFileTransaction(); - $this->configSet('default_channel', $savechannel); - if (!isset($options['ignore-errors'])) { - return $this->raiseError($err); - } - - if (!isset($options['soft'])) { - $this->log(0, 'WARNING: ' . $err->getMessage()); - } - } else { - PEAR::popErrorHandling(); - } - - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - if (!isset($options['ignore-errors'])) { - return $this->raiseError("uninstall failed"); - } - - if (!isset($options['soft'])) { - $this->log(0, 'WARNING: uninstall failed'); - } - } else { - $this->startFileTransaction(); - $dirtree = $pkg->getDirTree(); - if ($dirtree === false) { - $this->configSet('default_channel', $savechannel); - return $this->_registry->deletePackage($package, $channel); - } - - // attempt to delete empty directories - uksort($dirtree, array($this, '_sortDirs')); - foreach($dirtree as $dir => $notused) { - $this->addFileOperation('rmdir', array($dir)); - } - - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - if (!isset($options['ignore-errors'])) { - return $this->raiseError("uninstall failed"); - } - - if (!isset($options['soft'])) { - $this->log(0, 'WARNING: uninstall failed'); - } - } - } - // }}} - } - - $this->configSet('default_channel', $savechannel); - // Register that the package is no longer installed - return $this->_registry->deletePackage($package, $channel); - } - - /** - * Sort a list of arrays of array(downloaded packagefilename) by dependency. - * - * It also removes duplicate dependencies - * @param array an array of PEAR_PackageFile_v[1/2] objects - * @return array|PEAR_Error array of array(packagefilename, package.xml contents) - */ - function sortPackagesForUninstall(&$packages) - { - $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->config); - if (PEAR::isError($this->_dependencyDB)) { - return $this->_dependencyDB; - } - usort($packages, array(&$this, '_sortUninstall')); - } - - function _sortUninstall($a, $b) - { - if (!$a->getDeps() && !$b->getDeps()) { - return 0; // neither package has dependencies, order is insignificant - } - if ($a->getDeps() && !$b->getDeps()) { - return -1; // $a must be installed after $b because $a has dependencies - } - if (!$a->getDeps() && $b->getDeps()) { - return 1; // $b must be installed after $a because $b has dependencies - } - // both packages have dependencies - if ($this->_dependencyDB->dependsOn($a, $b)) { - return -1; - } - if ($this->_dependencyDB->dependsOn($b, $a)) { - return 1; - } - return 0; - } - - // }}} - // {{{ _sortDirs() - function _sortDirs($a, $b) - { - if (strnatcmp($a, $b) == -1) return 1; - if (strnatcmp($a, $b) == 1) return -1; - return 0; - } - - // }}} - - // {{{ _buildCallback() - - function _buildCallback($what, $data) - { - if (($what == 'cmdoutput' && $this->debug > 1) || - ($what == 'output' && $this->debug > 0)) { - $this->ui->outputData(rtrim($data), 'build'); - } - } - - // }}} -} \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role.php b/3rdparty/PEAR/Installer/Role.php deleted file mode 100644 index 0c50fa79c0..0000000000 --- a/3rdparty/PEAR/Installer/Role.php +++ /dev/null @@ -1,276 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Role.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * base class for installer roles - */ -require_once 'PEAR/Installer/Role/Common.php'; -require_once 'PEAR/XMLParser.php'; -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role -{ - /** - * Set up any additional configuration variables that file roles require - * - * Never call this directly, it is called by the PEAR_Config constructor - * @param PEAR_Config - * @access private - * @static - */ - function initializeConfig(&$config) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $class => $info) { - if (!$info['config_vars']) { - continue; - } - - $config->_addConfigVars($class, $info['config_vars']); - } - } - - /** - * @param PEAR_PackageFile_v2 - * @param string role name - * @param PEAR_Config - * @return PEAR_Installer_Role_Common - * @static - */ - function &factory($pkg, $role, &$config) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - if (!in_array($role, PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) { - $a = false; - return $a; - } - - $a = 'PEAR_Installer_Role_' . ucfirst($role); - if (!class_exists($a)) { - require_once str_replace('_', '/', $a) . '.php'; - } - - $b = new $a($config); - return $b; - } - - /** - * Get a list of file roles that are valid for the particular release type. - * - * For instance, src files serve no purpose in regular php releases. - * @param string - * @param bool clear cache - * @return array - * @static - */ - function getValidRoles($release, $clear = false) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - static $ret = array(); - if ($clear) { - $ret = array(); - } - - if (isset($ret[$release])) { - return $ret[$release]; - } - - $ret[$release] = array(); - foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) { - if (in_array($release, $okreleases['releasetypes'])) { - $ret[$release][] = strtolower(str_replace('PEAR_Installer_Role_', '', $role)); - } - } - - return $ret[$release]; - } - - /** - * Get a list of roles that require their files to be installed - * - * Most roles must be installed, but src and package roles, for instance - * are pseudo-roles. src files are compiled into a new extension. Package - * roles are actually fully bundled releases of a package - * @param bool clear cache - * @return array - * @static - */ - function getInstallableRoles($clear = false) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - static $ret; - if ($clear) { - unset($ret); - } - - if (isset($ret)) { - return $ret; - } - - $ret = array(); - foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) { - if ($okreleases['installable']) { - $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role)); - } - } - - return $ret; - } - - /** - * Return an array of roles that are affected by the baseinstalldir attribute - * - * Most roles ignore this attribute, and instead install directly into: - * PackageName/filepath - * so a tests file tests/file.phpt is installed into PackageName/tests/filepath.php - * @param bool clear cache - * @return array - * @static - */ - function getBaseinstallRoles($clear = false) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - static $ret; - if ($clear) { - unset($ret); - } - - if (isset($ret)) { - return $ret; - } - - $ret = array(); - foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) { - if ($okreleases['honorsbaseinstall']) { - $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role)); - } - } - - return $ret; - } - - /** - * Return an array of file roles that should be analyzed for PHP content at package time, - * like the "php" role. - * @param bool clear cache - * @return array - * @static - */ - function getPhpRoles($clear = false) - { - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) { - PEAR_Installer_Role::registerRoles(); - } - - static $ret; - if ($clear) { - unset($ret); - } - - if (isset($ret)) { - return $ret; - } - - $ret = array(); - foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) { - if ($okreleases['phpfile']) { - $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role)); - } - } - - return $ret; - } - - /** - * Scan through the Command directory looking for classes - * and see what commands they implement. - * @param string which directory to look for classes, defaults to - * the Installer/Roles subdirectory of - * the directory from where this file (__FILE__) is - * included. - * - * @return bool TRUE on success, a PEAR error on failure - * @access public - * @static - */ - function registerRoles($dir = null) - { - $GLOBALS['_PEAR_INSTALLER_ROLES'] = array(); - $parser = new PEAR_XMLParser; - if ($dir === null) { - $dir = dirname(__FILE__) . '/Role'; - } - - if (!file_exists($dir) || !is_dir($dir)) { - return PEAR::raiseError("registerRoles: opendir($dir) failed: does not exist/is not directory"); - } - - $dp = @opendir($dir); - if (empty($dp)) { - return PEAR::raiseError("registerRoles: opendir($dir) failed: $php_errmsg"); - } - - while ($entry = readdir($dp)) { - if ($entry{0} == '.' || substr($entry, -4) != '.xml') { - continue; - } - - $class = "PEAR_Installer_Role_".substr($entry, 0, -4); - // List of roles - if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'][$class])) { - $file = "$dir/$entry"; - $parser->parse(file_get_contents($file)); - $data = $parser->getData(); - if (!is_array($data['releasetypes'])) { - $data['releasetypes'] = array($data['releasetypes']); - } - - $GLOBALS['_PEAR_INSTALLER_ROLES'][$class] = $data; - } - } - - closedir($dp); - ksort($GLOBALS['_PEAR_INSTALLER_ROLES']); - PEAR_Installer_Role::getBaseinstallRoles(true); - PEAR_Installer_Role::getInstallableRoles(true); - PEAR_Installer_Role::getPhpRoles(true); - PEAR_Installer_Role::getValidRoles('****', true); - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Cfg.php b/3rdparty/PEAR/Installer/Role/Cfg.php deleted file mode 100644 index 762012248d..0000000000 --- a/3rdparty/PEAR/Installer/Role/Cfg.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2007-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Cfg.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.7.0 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 2007-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.7.0 - */ -class PEAR_Installer_Role_Cfg extends PEAR_Installer_Role_Common -{ - /** - * @var PEAR_Installer - */ - var $installer; - - /** - * the md5 of the original file - * - * @var unknown_type - */ - var $md5 = null; - - /** - * Do any unusual setup here - * @param PEAR_Installer - * @param PEAR_PackageFile_v2 - * @param array file attributes - * @param string file name - */ - function setup(&$installer, $pkg, $atts, $file) - { - $this->installer = &$installer; - $reg = &$this->installer->config->getRegistry(); - $package = $reg->getPackage($pkg->getPackage(), $pkg->getChannel()); - if ($package) { - $filelist = $package->getFilelist(); - if (isset($filelist[$file]) && isset($filelist[$file]['md5sum'])) { - $this->md5 = $filelist[$file]['md5sum']; - } - } - } - - function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null) - { - $test = parent::processInstallation($pkg, $atts, $file, $tmp_path, $layer); - if (@file_exists($test[2]) && @file_exists($test[3])) { - $md5 = md5_file($test[2]); - // configuration has already been installed, check for mods - if ($md5 !== $this->md5 && $md5 !== md5_file($test[3])) { - // configuration has been modified, so save our version as - // configfile-version - $old = $test[2]; - $test[2] .= '.new-' . $pkg->getVersion(); - // backup original and re-install it - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $tmpcfg = $this->config->get('temp_dir'); - $newloc = System::mkdir(array('-p', $tmpcfg)); - if (!$newloc) { - // try temp_dir - $newloc = System::mktemp(array('-d')); - if (!$newloc || PEAR::isError($newloc)) { - PEAR::popErrorHandling(); - return PEAR::raiseError('Could not save existing configuration file '. - $old . ', unable to install. Please set temp_dir ' . - 'configuration variable to a writeable location and try again'); - } - } else { - $newloc = $tmpcfg; - } - - $temp_file = $newloc . DIRECTORY_SEPARATOR . uniqid('savefile'); - if (!@copy($old, $temp_file)) { - PEAR::popErrorHandling(); - return PEAR::raiseError('Could not save existing configuration file '. - $old . ', unable to install. Please set temp_dir ' . - 'configuration variable to a writeable location and try again'); - } - - PEAR::popErrorHandling(); - $this->installer->log(0, "WARNING: configuration file $old is being installed as $test[2], you should manually merge in changes to the existing configuration file"); - $this->installer->addFileOperation('rename', array($temp_file, $old, false)); - $this->installer->addFileOperation('delete', array($temp_file)); - } - } - - return $test; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Cfg.xml b/3rdparty/PEAR/Installer/Role/Cfg.xml deleted file mode 100644 index 7a415dc466..0000000000 --- a/3rdparty/PEAR/Installer/Role/Cfg.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - cfg_dir - - 1 - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Common.php b/3rdparty/PEAR/Installer/Role/Common.php deleted file mode 100644 index 23e7348d70..0000000000 --- a/3rdparty/PEAR/Installer/Role/Common.php +++ /dev/null @@ -1,174 +0,0 @@ - - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * Base class for all installation roles. - * - * This class allows extensibility of file roles. Packages with complex - * customization can now provide custom file roles along with the possibility of - * adding configuration values to match. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Common -{ - /** - * @var PEAR_Config - * @access protected - */ - var $config; - - /** - * @param PEAR_Config - */ - function PEAR_Installer_Role_Common(&$config) - { - $this->config = $config; - } - - /** - * Retrieve configuration information about a file role from its XML info - * - * @param string $role Role Classname, as in "PEAR_Installer_Role_Data" - * @return array - */ - function getInfo($role) - { - if (empty($GLOBALS['_PEAR_INSTALLER_ROLES'][$role])) { - return PEAR::raiseError('Unknown Role class: "' . $role . '"'); - } - return $GLOBALS['_PEAR_INSTALLER_ROLES'][$role]; - } - - /** - * This is called for each file to set up the directories and files - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param array attributes from the tag - * @param string file name - * @return array an array consisting of: - * - * 1 the original, pre-baseinstalldir installation directory - * 2 the final installation directory - * 3 the full path to the final location of the file - * 4 the location of the pre-installation file - */ - function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null) - { - $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . - ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this))))); - if (PEAR::isError($roleInfo)) { - return $roleInfo; - } - if (!$roleInfo['locationconfig']) { - return false; - } - if ($roleInfo['honorsbaseinstall']) { - $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], $layer, - $pkg->getChannel()); - if (!empty($atts['baseinstalldir'])) { - $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; - } - } elseif ($roleInfo['unusualbaseinstall']) { - $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], - $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage(); - if (!empty($atts['baseinstalldir'])) { - $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; - } - } else { - $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], - $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage(); - } - if (dirname($file) != '.' && empty($atts['install-as'])) { - $dest_dir .= DIRECTORY_SEPARATOR . dirname($file); - } - if (empty($atts['install-as'])) { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file); - } else { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as']; - } - $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file; - - // Clean up the DIRECTORY_SEPARATOR mess - $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; - - list($dest_dir, $dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), - array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR), - array($dest_dir, $dest_file, $orig_file)); - return array($save_destdir, $dest_dir, $dest_file, $orig_file); - } - - /** - * Get the name of the configuration variable that specifies the location of this file - * @return string|false - */ - function getLocationConfig() - { - $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . - ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this))))); - if (PEAR::isError($roleInfo)) { - return $roleInfo; - } - return $roleInfo['locationconfig']; - } - - /** - * Do any unusual setup here - * @param PEAR_Installer - * @param PEAR_PackageFile_v2 - * @param array file attributes - * @param string file name - */ - function setup(&$installer, $pkg, $atts, $file) - { - } - - function isExecutable() - { - $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . - ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this))))); - if (PEAR::isError($roleInfo)) { - return $roleInfo; - } - return $roleInfo['executable']; - } - - function isInstallable() - { - $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . - ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this))))); - if (PEAR::isError($roleInfo)) { - return $roleInfo; - } - return $roleInfo['installable']; - } - - function isExtension() - { - $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . - ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this))))); - if (PEAR::isError($roleInfo)) { - return $roleInfo; - } - return $roleInfo['phpextension']; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Data.php b/3rdparty/PEAR/Installer/Role/Data.php deleted file mode 100644 index e3b7fa2fff..0000000000 --- a/3rdparty/PEAR/Installer/Role/Data.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Data.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Data extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Data.xml b/3rdparty/PEAR/Installer/Role/Data.xml deleted file mode 100644 index eae63720d3..0000000000 --- a/3rdparty/PEAR/Installer/Role/Data.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - data_dir - - - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Doc.php b/3rdparty/PEAR/Installer/Role/Doc.php deleted file mode 100644 index d592ffff01..0000000000 --- a/3rdparty/PEAR/Installer/Role/Doc.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Doc.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Doc extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Doc.xml b/3rdparty/PEAR/Installer/Role/Doc.xml deleted file mode 100644 index 173afba011..0000000000 --- a/3rdparty/PEAR/Installer/Role/Doc.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - doc_dir - - - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Ext.php b/3rdparty/PEAR/Installer/Role/Ext.php deleted file mode 100644 index eceb0279ff..0000000000 --- a/3rdparty/PEAR/Installer/Role/Ext.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Ext.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Ext extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Ext.xml b/3rdparty/PEAR/Installer/Role/Ext.xml deleted file mode 100644 index e2940fe1f2..0000000000 --- a/3rdparty/PEAR/Installer/Role/Ext.xml +++ /dev/null @@ -1,12 +0,0 @@ - - extbin - zendextbin - 1 - ext_dir - 1 - - - - 1 - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Php.php b/3rdparty/PEAR/Installer/Role/Php.php deleted file mode 100644 index e2abf44eed..0000000000 --- a/3rdparty/PEAR/Installer/Role/Php.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Php.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Php extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Php.xml b/3rdparty/PEAR/Installer/Role/Php.xml deleted file mode 100644 index 6b9a0e67af..0000000000 --- a/3rdparty/PEAR/Installer/Role/Php.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - php_dir - 1 - - 1 - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Script.php b/3rdparty/PEAR/Installer/Role/Script.php deleted file mode 100644 index b31469e4b1..0000000000 --- a/3rdparty/PEAR/Installer/Role/Script.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Script.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Script extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Script.xml b/3rdparty/PEAR/Installer/Role/Script.xml deleted file mode 100644 index e732cf2af6..0000000000 --- a/3rdparty/PEAR/Installer/Role/Script.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - bin_dir - 1 - - - 1 - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Src.php b/3rdparty/PEAR/Installer/Role/Src.php deleted file mode 100644 index 503705313d..0000000000 --- a/3rdparty/PEAR/Installer/Role/Src.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Src.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Src extends PEAR_Installer_Role_Common -{ - function setup(&$installer, $pkg, $atts, $file) - { - $installer->source_files++; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Src.xml b/3rdparty/PEAR/Installer/Role/Src.xml deleted file mode 100644 index 103483402f..0000000000 --- a/3rdparty/PEAR/Installer/Role/Src.xml +++ /dev/null @@ -1,12 +0,0 @@ - - extsrc - zendextsrc - 1 - temp_dir - - - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Test.php b/3rdparty/PEAR/Installer/Role/Test.php deleted file mode 100644 index 14c0e60919..0000000000 --- a/3rdparty/PEAR/Installer/Role/Test.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Test.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Installer_Role_Test extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Test.xml b/3rdparty/PEAR/Installer/Role/Test.xml deleted file mode 100644 index 51d5b894e0..0000000000 --- a/3rdparty/PEAR/Installer/Role/Test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - test_dir - - - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Www.php b/3rdparty/PEAR/Installer/Role/Www.php deleted file mode 100644 index 11adeff829..0000000000 --- a/3rdparty/PEAR/Installer/Role/Www.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 2007-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Www.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.7.0 - */ - -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 2007-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.7.0 - */ -class PEAR_Installer_Role_Www extends PEAR_Installer_Role_Common {} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Installer/Role/Www.xml b/3rdparty/PEAR/Installer/Role/Www.xml deleted file mode 100644 index 7598be3889..0000000000 --- a/3rdparty/PEAR/Installer/Role/Www.xml +++ /dev/null @@ -1,15 +0,0 @@ - - php - extsrc - extbin - zendextsrc - zendextbin - 1 - www_dir - 1 - - - - - - \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile.php b/3rdparty/PEAR/PackageFile.php deleted file mode 100644 index 7ae3362844..0000000000 --- a/3rdparty/PEAR/PackageFile.php +++ /dev/null @@ -1,492 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: PackageFile.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * needed for PEAR_VALIDATE_* constants - */ -require_once 'PEAR/Validate.php'; -/** - * Error code if the package.xml tag does not contain a valid version - */ -define('PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION', 1); -/** - * Error code if the package.xml tag version is not supported (version 1.0 and 1.1 are the only supported versions, - * currently - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_PACKAGEVERSION', 2); -/** - * Abstraction for the package.xml package description file - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile -{ - /** - * @var PEAR_Config - */ - var $_config; - var $_debug; - - var $_logger = false; - /** - * @var boolean - */ - var $_rawReturn = false; - - /** - * helper for extracting Archive_Tar errors - * @var array - * @access private - */ - var $_extractErrors = array(); - - /** - * - * @param PEAR_Config $config - * @param ? $debug - * @param string @tmpdir Optional temporary directory for uncompressing - * files - */ - function PEAR_PackageFile(&$config, $debug = false) - { - $this->_config = $config; - $this->_debug = $debug; - } - - /** - * Turn off validation - return a parsed package.xml without checking it - * - * This is used by the package-validate command - */ - function rawReturn() - { - $this->_rawReturn = true; - } - - function setLogger(&$l) - { - $this->_logger = &$l; - } - - /** - * Create a PEAR_PackageFile_Parser_v* of a given version. - * @param int $version - * @return PEAR_PackageFile_Parser_v1|PEAR_PackageFile_Parser_v1 - */ - function &parserFactory($version) - { - if (!in_array($version{0}, array('1', '2'))) { - $a = false; - return $a; - } - - include_once 'PEAR/PackageFile/Parser/v' . $version{0} . '.php'; - $version = $version{0}; - $class = "PEAR_PackageFile_Parser_v$version"; - $a = new $class; - return $a; - } - - /** - * For simpler unit-testing - * @return string - */ - function getClassPrefix() - { - return 'PEAR_PackageFile_v'; - } - - /** - * Create a PEAR_PackageFile_v* of a given version. - * @param int $version - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v1 - */ - function &factory($version) - { - if (!in_array($version{0}, array('1', '2'))) { - $a = false; - return $a; - } - - include_once 'PEAR/PackageFile/v' . $version{0} . '.php'; - $version = $version{0}; - $class = $this->getClassPrefix() . $version; - $a = new $class; - return $a; - } - - /** - * Create a PEAR_PackageFile_v* from its toArray() method - * - * WARNING: no validation is performed, the array is assumed to be valid, - * always parse from xml if you want validation. - * @param array $arr - * @return PEAR_PackageFileManager_v1|PEAR_PackageFileManager_v2 - * @uses factory() to construct the returned object. - */ - function &fromArray($arr) - { - if (isset($arr['xsdversion'])) { - $obj = &$this->factory($arr['xsdversion']); - if ($this->_logger) { - $obj->setLogger($this->_logger); - } - - $obj->setConfig($this->_config); - $obj->fromArray($arr); - return $obj; - } - - if (isset($arr['package']['attribs']['version'])) { - $obj = &$this->factory($arr['package']['attribs']['version']); - } else { - $obj = &$this->factory('1.0'); - } - - if ($this->_logger) { - $obj->setLogger($this->_logger); - } - - $obj->setConfig($this->_config); - $obj->fromArray($arr); - return $obj; - } - - /** - * Create a PEAR_PackageFile_v* from an XML string. - * @access public - * @param string $data contents of package.xml file - * @param int $state package state (one of PEAR_VALIDATE_* constants) - * @param string $file full path to the package.xml file (and the files - * it references) - * @param string $archive optional name of the archive that the XML was - * extracted from, if any - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @uses parserFactory() to construct a parser to load the package. - */ - function &fromXmlString($data, $state, $file, $archive = false) - { - if (preg_match('/]+version=[\'"]([0-9]+\.[0-9]+)[\'"]/', $data, $packageversion)) { - if (!in_array($packageversion[1], array('1.0', '2.0', '2.1'))) { - return PEAR::raiseError('package.xml version "' . $packageversion[1] . - '" is not supported, only 1.0, 2.0, and 2.1 are supported.'); - } - - $object = &$this->parserFactory($packageversion[1]); - if ($this->_logger) { - $object->setLogger($this->_logger); - } - - $object->setConfig($this->_config); - $pf = $object->parse($data, $file, $archive); - if (PEAR::isError($pf)) { - return $pf; - } - - if ($this->_rawReturn) { - return $pf; - } - - if (!$pf->validate($state)) {; - if ($this->_config->get('verbose') > 0 - && $this->_logger && $pf->getValidationWarnings(false) - ) { - foreach ($pf->getValidationWarnings(false) as $warning) { - $this->_logger->log(0, 'ERROR: ' . $warning['message']); - } - } - - $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed', - 2, null, null, $pf->getValidationWarnings()); - return $a; - } - - if ($this->_logger && $pf->getValidationWarnings(false)) { - foreach ($pf->getValidationWarnings() as $warning) { - $this->_logger->log(0, 'WARNING: ' . $warning['message']); - } - } - - if (method_exists($pf, 'flattenFilelist')) { - $pf->flattenFilelist(); // for v2 - } - - return $pf; - } elseif (preg_match('/]+version=[\'"]([^"\']+)[\'"]/', $data, $packageversion)) { - $a = PEAR::raiseError('package.xml file "' . $file . - '" has unsupported package.xml version "' . $packageversion[1] . '"'); - return $a; - } else { - if (!class_exists('PEAR_ErrorStack')) { - require_once 'PEAR/ErrorStack.php'; - } - - PEAR_ErrorStack::staticPush('PEAR_PackageFile', - PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION, - 'warning', array('xml' => $data), 'package.xml "' . $file . - '" has no package.xml version'); - $object = &$this->parserFactory('1.0'); - $object->setConfig($this->_config); - $pf = $object->parse($data, $file, $archive); - if (PEAR::isError($pf)) { - return $pf; - } - - if ($this->_rawReturn) { - return $pf; - } - - if (!$pf->validate($state)) { - $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed', - 2, null, null, $pf->getValidationWarnings()); - return $a; - } - - if ($this->_logger && $pf->getValidationWarnings(false)) { - foreach ($pf->getValidationWarnings() as $warning) { - $this->_logger->log(0, 'WARNING: ' . $warning['message']); - } - } - - if (method_exists($pf, 'flattenFilelist')) { - $pf->flattenFilelist(); // for v2 - } - - return $pf; - } - } - - /** - * Register a temporary file or directory. When the destructor is - * executed, all registered temporary files and directories are - * removed. - * - * @param string $file name of file or directory - * @return void - */ - function addTempFile($file) - { - $GLOBALS['_PEAR_Common_tempfiles'][] = $file; - } - - /** - * Create a PEAR_PackageFile_v* from a compresed Tar or Tgz file. - * @access public - * @param string contents of package.xml file - * @param int package state (one of PEAR_VALIDATE_* constants) - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @using Archive_Tar to extract the files - * @using fromPackageFile() to load the package after the package.xml - * file is extracted. - */ - function &fromTgzFile($file, $state) - { - if (!class_exists('Archive_Tar')) { - require_once 'Archive/Tar.php'; - } - - $tar = new Archive_Tar($file); - if ($this->_debug <= 1) { - $tar->pushErrorHandling(PEAR_ERROR_RETURN); - } - - $content = $tar->listContent(); - if ($this->_debug <= 1) { - $tar->popErrorHandling(); - } - - if (!is_array($content)) { - if (is_string($file) && strlen($file < 255) && - (!file_exists($file) || !@is_file($file))) { - $ret = PEAR::raiseError("could not open file \"$file\""); - return $ret; - } - - $file = realpath($file); - $ret = PEAR::raiseError("Could not get contents of package \"$file\"". - '. Invalid tgz file.'); - return $ret; - } - - if (!count($content) && !@is_file($file)) { - $ret = PEAR::raiseError("could not open file \"$file\""); - return $ret; - } - - $xml = null; - $origfile = $file; - foreach ($content as $file) { - $name = $file['filename']; - if ($name == 'package2.xml') { // allow a .tgz to distribute both versions - $xml = $name; - break; - } - - if ($name == 'package.xml') { - $xml = $name; - break; - } elseif (preg_match('/package.xml$/', $name, $match)) { - $xml = $name; - break; - } - } - - $tmpdir = System::mktemp('-t "' . $this->_config->get('temp_dir') . '" -d pear'); - if ($tmpdir === false) { - $ret = PEAR::raiseError("there was a problem with getting the configured temp directory"); - return $ret; - } - - PEAR_PackageFile::addTempFile($tmpdir); - - $this->_extractErrors(); - PEAR::staticPushErrorHandling(PEAR_ERROR_CALLBACK, array($this, '_extractErrors')); - - if (!$xml || !$tar->extractList(array($xml), $tmpdir)) { - $extra = implode("\n", $this->_extractErrors()); - if ($extra) { - $extra = ' ' . $extra; - } - - PEAR::staticPopErrorHandling(); - $ret = PEAR::raiseError('could not extract the package.xml file from "' . - $origfile . '"' . $extra); - return $ret; - } - - PEAR::staticPopErrorHandling(); - $ret = &PEAR_PackageFile::fromPackageFile("$tmpdir/$xml", $state, $origfile); - return $ret; - } - - /** - * helper callback for extracting Archive_Tar errors - * - * @param PEAR_Error|null $err - * @return array - * @access private - */ - function _extractErrors($err = null) - { - static $errors = array(); - if ($err === null) { - $e = $errors; - $errors = array(); - return $e; - } - $errors[] = $err->getMessage(); - } - - /** - * Create a PEAR_PackageFile_v* from a package.xml file. - * - * @access public - * @param string $descfile name of package xml file - * @param int $state package state (one of PEAR_VALIDATE_* constants) - * @param string|false $archive name of the archive this package.xml came - * from, if any - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @uses PEAR_PackageFile::fromXmlString to create the oject after the - * XML is loaded from the package.xml file. - */ - function &fromPackageFile($descfile, $state, $archive = false) - { - $fp = false; - if (is_string($descfile) && strlen($descfile) < 255 && - ( - !file_exists($descfile) || !is_file($descfile) || !is_readable($descfile) - || (!$fp = @fopen($descfile, 'r')) - ) - ) { - $a = PEAR::raiseError("Unable to open $descfile"); - return $a; - } - - // read the whole thing so we only get one cdata callback - // for each block of cdata - fclose($fp); - $data = file_get_contents($descfile); - $ret = &PEAR_PackageFile::fromXmlString($data, $state, $descfile, $archive); - return $ret; - } - - /** - * Create a PEAR_PackageFile_v* from a .tgz archive or package.xml file. - * - * This method is able to extract information about a package from a .tgz - * archive or from a XML package definition file. - * - * @access public - * @param string $info file name - * @param int $state package state (one of PEAR_VALIDATE_* constants) - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @uses fromPackageFile() if the file appears to be XML - * @uses fromTgzFile() to load all non-XML files - */ - function &fromAnyFile($info, $state) - { - if (is_dir($info)) { - $dir_name = realpath($info); - if (file_exists($dir_name . '/package.xml')) { - $info = PEAR_PackageFile::fromPackageFile($dir_name . '/package.xml', $state); - } elseif (file_exists($dir_name . '/package2.xml')) { - $info = PEAR_PackageFile::fromPackageFile($dir_name . '/package2.xml', $state); - } else { - $info = PEAR::raiseError("No package definition found in '$info' directory"); - } - - return $info; - } - - $fp = false; - if (is_string($info) && strlen($info) < 255 && - (file_exists($info) || ($fp = @fopen($info, 'r'))) - ) { - - if ($fp) { - fclose($fp); - } - - $tmp = substr($info, -4); - if ($tmp == '.xml') { - $info = &PEAR_PackageFile::fromPackageFile($info, $state); - } elseif ($tmp == '.tar' || $tmp == '.tgz') { - $info = &PEAR_PackageFile::fromTgzFile($info, $state); - } else { - $fp = fopen($info, 'r'); - $test = fread($fp, 5); - fclose($fp); - if ($test == ' - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v1.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * needed for PEAR_VALIDATE_* constants - */ -require_once 'PEAR/Validate.php'; -require_once 'System.php'; -require_once 'PEAR/PackageFile/v2.php'; -/** - * This class converts a PEAR_PackageFile_v1 object into any output format. - * - * Supported output formats include array, XML string, and a PEAR_PackageFile_v2 - * object, for converting package.xml 1.0 into package.xml 2.0 with no sweat. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_Generator_v1 -{ - /** - * @var PEAR_PackageFile_v1 - */ - var $_packagefile; - function PEAR_PackageFile_Generator_v1(&$packagefile) - { - $this->_packagefile = &$packagefile; - } - - function getPackagerVersion() - { - return '1.9.4'; - } - - /** - * @param PEAR_Packager - * @param bool if true, a .tgz is written, otherwise a .tar is written - * @param string|null directory in which to save the .tgz - * @return string|PEAR_Error location of package or error object - */ - function toTgz(&$packager, $compress = true, $where = null) - { - require_once 'Archive/Tar.php'; - if ($where === null) { - if (!($where = System::mktemp(array('-d')))) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: mktemp failed'); - } - } elseif (!@System::mkDir(array('-p', $where))) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: "' . $where . '" could' . - ' not be created'); - } - if (file_exists($where . DIRECTORY_SEPARATOR . 'package.xml') && - !is_file($where . DIRECTORY_SEPARATOR . 'package.xml')) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: unable to save package.xml as' . - ' "' . $where . DIRECTORY_SEPARATOR . 'package.xml"'); - } - if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: invalid package file'); - } - $pkginfo = $this->_packagefile->getArray(); - $ext = $compress ? '.tgz' : '.tar'; - $pkgver = $pkginfo['package'] . '-' . $pkginfo['version']; - $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext; - if (file_exists(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext) && - !is_file(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext)) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: cannot create tgz file "' . - getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext . '"'); - } - if ($pkgfile = $this->_packagefile->getPackageFile()) { - $pkgdir = dirname(realpath($pkgfile)); - $pkgfile = basename($pkgfile); - } else { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: package file object must ' . - 'be created from a real file'); - } - // {{{ Create the package file list - $filelist = array(); - $i = 0; - - foreach ($this->_packagefile->getFilelist() as $fname => $atts) { - $file = $pkgdir . DIRECTORY_SEPARATOR . $fname; - if (!file_exists($file)) { - return PEAR::raiseError("File does not exist: $fname"); - } else { - $filelist[$i++] = $file; - if (!isset($atts['md5sum'])) { - $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($file)); - } - $packager->log(2, "Adding file $fname"); - } - } - // }}} - $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true); - if ($packagexml) { - $tar = new Archive_Tar($dest_package, $compress); - $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors - // ----- Creates with the package.xml file - $ok = $tar->createModify(array($packagexml), '', $where); - if (PEAR::isError($ok)) { - return $ok; - } elseif (!$ok) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed'); - } - // ----- Add the content of the package - if (!$tar->addModify($filelist, $pkgver, $pkgdir)) { - return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed'); - } - return $dest_package; - } - } - - /** - * @param string|null directory to place the package.xml in, or null for a temporary dir - * @param int one of the PEAR_VALIDATE_* constants - * @param string name of the generated file - * @param bool if true, then no analysis will be performed on role="php" files - * @return string|PEAR_Error path to the created file on success - */ - function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml', - $nofilechecking = false) - { - if (!$this->_packagefile->validate($state, $nofilechecking)) { - return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: invalid package.xml', - null, null, null, $this->_packagefile->getValidationWarnings()); - } - if ($where === null) { - if (!($where = System::mktemp(array('-d')))) { - return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: mktemp failed'); - } - } elseif (!@System::mkDir(array('-p', $where))) { - return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: "' . $where . '" could' . - ' not be created'); - } - $newpkgfile = $where . DIRECTORY_SEPARATOR . $name; - $np = @fopen($newpkgfile, 'wb'); - if (!$np) { - return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: unable to save ' . - "$name as $newpkgfile"); - } - fwrite($np, $this->toXml($state, true)); - fclose($np); - return $newpkgfile; - } - - /** - * fix both XML encoding to be UTF8, and replace standard XML entities < > " & ' - * - * @param string $string - * @return string - * @access private - */ - function _fixXmlEncoding($string) - { - if (version_compare(phpversion(), '5.0.0', 'lt')) { - $string = utf8_encode($string); - } - return strtr($string, array( - '&' => '&', - '>' => '>', - '<' => '<', - '"' => '"', - '\'' => ''' )); - } - - /** - * Return an XML document based on the package info (as returned - * by the PEAR_Common::infoFrom* methods). - * - * @return string XML data - */ - function toXml($state = PEAR_VALIDATE_NORMAL, $nofilevalidation = false) - { - $this->_packagefile->setDate(date('Y-m-d')); - if (!$this->_packagefile->validate($state, $nofilevalidation)) { - return false; - } - $pkginfo = $this->_packagefile->getArray(); - static $maint_map = array( - "handle" => "user", - "name" => "name", - "email" => "email", - "role" => "role", - ); - $ret = "\n"; - $ret .= "\n"; - $ret .= "\n" . -" $pkginfo[package]"; - if (isset($pkginfo['extends'])) { - $ret .= "\n$pkginfo[extends]"; - } - $ret .= - "\n ".$this->_fixXmlEncoding($pkginfo['summary'])."\n" . -" ".trim($this->_fixXmlEncoding($pkginfo['description']))."\n \n" . -" \n"; - foreach ($pkginfo['maintainers'] as $maint) { - $ret .= " \n"; - foreach ($maint_map as $idx => $elm) { - $ret .= " <$elm>"; - $ret .= $this->_fixXmlEncoding($maint[$idx]); - $ret .= "\n"; - } - $ret .= " \n"; - } - $ret .= " \n"; - $ret .= $this->_makeReleaseXml($pkginfo, false, $state); - if (isset($pkginfo['changelog']) && count($pkginfo['changelog']) > 0) { - $ret .= " \n"; - foreach ($pkginfo['changelog'] as $oldrelease) { - $ret .= $this->_makeReleaseXml($oldrelease, true); - } - $ret .= " \n"; - } - $ret .= "\n"; - return $ret; - } - - // }}} - // {{{ _makeReleaseXml() - - /** - * Generate part of an XML description with release information. - * - * @param array $pkginfo array with release information - * @param bool $changelog whether the result will be in a changelog element - * - * @return string XML data - * - * @access private - */ - function _makeReleaseXml($pkginfo, $changelog = false, $state = PEAR_VALIDATE_NORMAL) - { - // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!! - $indent = $changelog ? " " : ""; - $ret = "$indent \n"; - if (!empty($pkginfo['version'])) { - $ret .= "$indent $pkginfo[version]\n"; - } - if (!empty($pkginfo['release_date'])) { - $ret .= "$indent $pkginfo[release_date]\n"; - } - if (!empty($pkginfo['release_license'])) { - $ret .= "$indent $pkginfo[release_license]\n"; - } - if (!empty($pkginfo['release_state'])) { - $ret .= "$indent $pkginfo[release_state]\n"; - } - if (!empty($pkginfo['release_notes'])) { - $ret .= "$indent ".trim($this->_fixXmlEncoding($pkginfo['release_notes'])) - ."\n$indent \n"; - } - if (!empty($pkginfo['release_warnings'])) { - $ret .= "$indent ".$this->_fixXmlEncoding($pkginfo['release_warnings'])."\n"; - } - if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) { - $ret .= "$indent \n"; - foreach ($pkginfo['release_deps'] as $dep) { - $ret .= "$indent _fixXmlEncoding($c['name']) . "\""; - if (isset($c['default'])) { - $ret .= " default=\"" . $this->_fixXmlEncoding($c['default']) . "\""; - } - $ret .= " prompt=\"" . $this->_fixXmlEncoding($c['prompt']) . "\""; - $ret .= "/>\n"; - } - $ret .= "$indent \n"; - } - if (isset($pkginfo['provides'])) { - foreach ($pkginfo['provides'] as $key => $what) { - $ret .= "$indent recursiveXmlFilelist($pkginfo['filelist']); - } else { - foreach ($pkginfo['filelist'] as $file => $fa) { - if (!isset($fa['role'])) { - $fa['role'] = ''; - } - $ret .= "$indent _fixXmlEncoding($fa['baseinstalldir']) . '"'; - } - if (isset($fa['md5sum'])) { - $ret .= " md5sum=\"$fa[md5sum]\""; - } - if (isset($fa['platform'])) { - $ret .= " platform=\"$fa[platform]\""; - } - if (!empty($fa['install-as'])) { - $ret .= ' install-as="' . - $this->_fixXmlEncoding($fa['install-as']) . '"'; - } - $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"'; - if (empty($fa['replacements'])) { - $ret .= "/>\n"; - } else { - $ret .= ">\n"; - foreach ($fa['replacements'] as $r) { - $ret .= "$indent $v) { - $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"'; - } - $ret .= "/>\n"; - } - $ret .= "$indent \n"; - } - } - } - $ret .= "$indent \n"; - } - $ret .= "$indent \n"; - return $ret; - } - - /** - * @param array - * @access protected - */ - function recursiveXmlFilelist($list) - { - $this->_dirs = array(); - foreach ($list as $file => $attributes) { - $this->_addDir($this->_dirs, explode('/', dirname($file)), $file, $attributes); - } - return $this->_formatDir($this->_dirs); - } - - /** - * @param array - * @param array - * @param string|null - * @param array|null - * @access private - */ - function _addDir(&$dirs, $dir, $file = null, $attributes = null) - { - if ($dir == array() || $dir == array('.')) { - $dirs['files'][basename($file)] = $attributes; - return; - } - $curdir = array_shift($dir); - if (!isset($dirs['dirs'][$curdir])) { - $dirs['dirs'][$curdir] = array(); - } - $this->_addDir($dirs['dirs'][$curdir], $dir, $file, $attributes); - } - - /** - * @param array - * @param string - * @param string - * @access private - */ - function _formatDir($dirs, $indent = '', $curdir = '') - { - $ret = ''; - if (!count($dirs)) { - return ''; - } - if (isset($dirs['dirs'])) { - uksort($dirs['dirs'], 'strnatcasecmp'); - foreach ($dirs['dirs'] as $dir => $contents) { - $usedir = "$curdir/$dir"; - $ret .= "$indent \n"; - $ret .= $this->_formatDir($contents, "$indent ", $usedir); - $ret .= "$indent \n"; - } - } - if (isset($dirs['files'])) { - uksort($dirs['files'], 'strnatcasecmp'); - foreach ($dirs['files'] as $file => $attribs) { - $ret .= $this->_formatFile($file, $attribs, $indent); - } - } - return $ret; - } - - /** - * @param string - * @param array - * @param string - * @access private - */ - function _formatFile($file, $attributes, $indent) - { - $ret = "$indent _fixXmlEncoding($attributes['baseinstalldir']) . '"'; - } - if (isset($attributes['md5sum'])) { - $ret .= " md5sum=\"$attributes[md5sum]\""; - } - if (isset($attributes['platform'])) { - $ret .= " platform=\"$attributes[platform]\""; - } - if (!empty($attributes['install-as'])) { - $ret .= ' install-as="' . - $this->_fixXmlEncoding($attributes['install-as']) . '"'; - } - $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"'; - if (empty($attributes['replacements'])) { - $ret .= "/>\n"; - } else { - $ret .= ">\n"; - foreach ($attributes['replacements'] as $r) { - $ret .= "$indent $v) { - $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"'; - } - $ret .= "/>\n"; - } - $ret .= "$indent \n"; - } - return $ret; - } - - // {{{ _unIndent() - - /** - * Unindent given string (?) - * - * @param string $str The string that has to be unindented. - * @return string - * @access private - */ - function _unIndent($str) - { - // remove leading newlines - $str = preg_replace('/^[\r\n]+/', '', $str); - // find whitespace at the beginning of the first line - $indent_len = strspn($str, " \t"); - $indent = substr($str, 0, $indent_len); - $data = ''; - // remove the same amount of whitespace from following lines - foreach (explode("\n", $str) as $line) { - if (substr($line, 0, $indent_len) == $indent) { - $data .= substr($line, $indent_len) . "\n"; - } - } - return $data; - } - - /** - * @return array - */ - function dependenciesToV2() - { - $arr = array(); - $this->_convertDependencies2_0($arr); - return $arr['dependencies']; - } - - /** - * Convert a package.xml version 1.0 into version 2.0 - * - * Note that this does a basic conversion, to allow more advanced - * features like bundles and multiple releases - * @param string the classname to instantiate and return. This must be - * PEAR_PackageFile_v2 or a descendant - * @param boolean if true, only valid, deterministic package.xml 1.0 as defined by the - * strictest parameters will be converted - * @return PEAR_PackageFile_v2|PEAR_Error - */ - function &toV2($class = 'PEAR_PackageFile_v2', $strict = false) - { - if ($strict) { - if (!$this->_packagefile->validate()) { - $a = PEAR::raiseError('invalid package.xml version 1.0 cannot be converted' . - ' to version 2.0', null, null, null, - $this->_packagefile->getValidationWarnings(true)); - return $a; - } - } - - $arr = array( - 'attribs' => array( - 'version' => '2.0', - 'xmlns' => 'http://pear.php.net/dtd/package-2.0', - 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0', - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => "http://pear.php.net/dtd/tasks-1.0\n" . -"http://pear.php.net/dtd/tasks-1.0.xsd\n" . -"http://pear.php.net/dtd/package-2.0\n" . -'http://pear.php.net/dtd/package-2.0.xsd', - ), - 'name' => $this->_packagefile->getPackage(), - 'channel' => 'pear.php.net', - ); - $arr['summary'] = $this->_packagefile->getSummary(); - $arr['description'] = $this->_packagefile->getDescription(); - $maintainers = $this->_packagefile->getMaintainers(); - foreach ($maintainers as $maintainer) { - if ($maintainer['role'] != 'lead') { - continue; - } - $new = array( - 'name' => $maintainer['name'], - 'user' => $maintainer['handle'], - 'email' => $maintainer['email'], - 'active' => 'yes', - ); - $arr['lead'][] = $new; - } - - if (!isset($arr['lead'])) { // some people... you know? - $arr['lead'] = array( - 'name' => 'unknown', - 'user' => 'unknown', - 'email' => 'noleadmaintainer@example.com', - 'active' => 'no', - ); - } - - if (count($arr['lead']) == 1) { - $arr['lead'] = $arr['lead'][0]; - } - - foreach ($maintainers as $maintainer) { - if ($maintainer['role'] == 'lead') { - continue; - } - $new = array( - 'name' => $maintainer['name'], - 'user' => $maintainer['handle'], - 'email' => $maintainer['email'], - 'active' => 'yes', - ); - $arr[$maintainer['role']][] = $new; - } - - if (isset($arr['developer']) && count($arr['developer']) == 1) { - $arr['developer'] = $arr['developer'][0]; - } - - if (isset($arr['contributor']) && count($arr['contributor']) == 1) { - $arr['contributor'] = $arr['contributor'][0]; - } - - if (isset($arr['helper']) && count($arr['helper']) == 1) { - $arr['helper'] = $arr['helper'][0]; - } - - $arr['date'] = $this->_packagefile->getDate(); - $arr['version'] = - array( - 'release' => $this->_packagefile->getVersion(), - 'api' => $this->_packagefile->getVersion(), - ); - $arr['stability'] = - array( - 'release' => $this->_packagefile->getState(), - 'api' => $this->_packagefile->getState(), - ); - $licensemap = - array( - 'php' => 'http://www.php.net/license', - 'php license' => 'http://www.php.net/license', - 'lgpl' => 'http://www.gnu.org/copyleft/lesser.html', - 'bsd' => 'http://www.opensource.org/licenses/bsd-license.php', - 'bsd style' => 'http://www.opensource.org/licenses/bsd-license.php', - 'bsd-style' => 'http://www.opensource.org/licenses/bsd-license.php', - 'mit' => 'http://www.opensource.org/licenses/mit-license.php', - 'gpl' => 'http://www.gnu.org/copyleft/gpl.html', - 'apache' => 'http://www.opensource.org/licenses/apache2.0.php' - ); - - if (isset($licensemap[strtolower($this->_packagefile->getLicense())])) { - $arr['license'] = array( - 'attribs' => array('uri' => - $licensemap[strtolower($this->_packagefile->getLicense())]), - '_content' => $this->_packagefile->getLicense() - ); - } else { - // don't use bogus uri - $arr['license'] = $this->_packagefile->getLicense(); - } - - $arr['notes'] = $this->_packagefile->getNotes(); - $temp = array(); - $arr['contents'] = $this->_convertFilelist2_0($temp); - $this->_convertDependencies2_0($arr); - $release = ($this->_packagefile->getConfigureOptions() || $this->_isExtension) ? - 'extsrcrelease' : 'phprelease'; - if ($release == 'extsrcrelease') { - $arr['channel'] = 'pecl.php.net'; - $arr['providesextension'] = $arr['name']; // assumption - } - - $arr[$release] = array(); - if ($this->_packagefile->getConfigureOptions()) { - $arr[$release]['configureoption'] = $this->_packagefile->getConfigureOptions(); - foreach ($arr[$release]['configureoption'] as $i => $opt) { - $arr[$release]['configureoption'][$i] = array('attribs' => $opt); - } - if (count($arr[$release]['configureoption']) == 1) { - $arr[$release]['configureoption'] = $arr[$release]['configureoption'][0]; - } - } - - $this->_convertRelease2_0($arr[$release], $temp); - if ($release == 'extsrcrelease' && count($arr[$release]) > 1) { - // multiple extsrcrelease tags added in PEAR 1.4.1 - $arr['dependencies']['required']['pearinstaller']['min'] = '1.4.1'; - } - - if ($cl = $this->_packagefile->getChangelog()) { - foreach ($cl as $release) { - $rel = array(); - $rel['version'] = - array( - 'release' => $release['version'], - 'api' => $release['version'], - ); - if (!isset($release['release_state'])) { - $release['release_state'] = 'stable'; - } - - $rel['stability'] = - array( - 'release' => $release['release_state'], - 'api' => $release['release_state'], - ); - if (isset($release['release_date'])) { - $rel['date'] = $release['release_date']; - } else { - $rel['date'] = date('Y-m-d'); - } - - if (isset($release['release_license'])) { - if (isset($licensemap[strtolower($release['release_license'])])) { - $uri = $licensemap[strtolower($release['release_license'])]; - } else { - $uri = 'http://www.example.com'; - } - $rel['license'] = array( - 'attribs' => array('uri' => $uri), - '_content' => $release['release_license'] - ); - } else { - $rel['license'] = $arr['license']; - } - - if (!isset($release['release_notes'])) { - $release['release_notes'] = 'no release notes'; - } - - $rel['notes'] = $release['release_notes']; - $arr['changelog']['release'][] = $rel; - } - } - - $ret = new $class; - $ret->setConfig($this->_packagefile->_config); - if (isset($this->_packagefile->_logger) && is_object($this->_packagefile->_logger)) { - $ret->setLogger($this->_packagefile->_logger); - } - - $ret->fromArray($arr); - return $ret; - } - - /** - * @param array - * @param bool - * @access private - */ - function _convertDependencies2_0(&$release, $internal = false) - { - $peardep = array('pearinstaller' => - array('min' => '1.4.0b1')); // this is a lot safer - $required = $optional = array(); - $release['dependencies'] = array('required' => array()); - if ($this->_packagefile->hasDeps()) { - foreach ($this->_packagefile->getDeps() as $dep) { - if (!isset($dep['optional']) || $dep['optional'] == 'no') { - $required[] = $dep; - } else { - $optional[] = $dep; - } - } - foreach (array('required', 'optional') as $arr) { - $deps = array(); - foreach ($$arr as $dep) { - // organize deps by dependency type and name - if (!isset($deps[$dep['type']])) { - $deps[$dep['type']] = array(); - } - if (isset($dep['name'])) { - $deps[$dep['type']][$dep['name']][] = $dep; - } else { - $deps[$dep['type']][] = $dep; - } - } - do { - if (isset($deps['php'])) { - $php = array(); - if (count($deps['php']) > 1) { - $php = $this->_processPhpDeps($deps['php']); - } else { - if (!isset($deps['php'][0])) { - list($key, $blah) = each ($deps['php']); // stupid buggy versions - $deps['php'] = array($blah[0]); - } - $php = $this->_processDep($deps['php'][0]); - if (!$php) { - break; // poor mans throw - } - } - $release['dependencies'][$arr]['php'] = $php; - } - } while (false); - do { - if (isset($deps['pkg'])) { - $pkg = array(); - $pkg = $this->_processMultipleDepsName($deps['pkg']); - if (!$pkg) { - break; // poor mans throw - } - $release['dependencies'][$arr]['package'] = $pkg; - } - } while (false); - do { - if (isset($deps['ext'])) { - $pkg = array(); - $pkg = $this->_processMultipleDepsName($deps['ext']); - $release['dependencies'][$arr]['extension'] = $pkg; - } - } while (false); - // skip sapi - it's not supported so nobody will have used it - // skip os - it's not supported in 1.0 - } - } - if (isset($release['dependencies']['required'])) { - $release['dependencies']['required'] = - array_merge($peardep, $release['dependencies']['required']); - } else { - $release['dependencies']['required'] = $peardep; - } - if (!isset($release['dependencies']['required']['php'])) { - $release['dependencies']['required']['php'] = - array('min' => '4.0.0'); - } - $order = array(); - $bewm = $release['dependencies']['required']; - $order['php'] = $bewm['php']; - $order['pearinstaller'] = $bewm['pearinstaller']; - isset($bewm['package']) ? $order['package'] = $bewm['package'] :0; - isset($bewm['extension']) ? $order['extension'] = $bewm['extension'] :0; - $release['dependencies']['required'] = $order; - } - - /** - * @param array - * @access private - */ - function _convertFilelist2_0(&$package) - { - $ret = array('dir' => - array( - 'attribs' => array('name' => '/'), - 'file' => array() - ) - ); - $package['platform'] = - $package['install-as'] = array(); - $this->_isExtension = false; - foreach ($this->_packagefile->getFilelist() as $name => $file) { - $file['name'] = $name; - if (isset($file['role']) && $file['role'] == 'src') { - $this->_isExtension = true; - } - if (isset($file['replacements'])) { - $repl = $file['replacements']; - unset($file['replacements']); - } else { - unset($repl); - } - if (isset($file['install-as'])) { - $package['install-as'][$name] = $file['install-as']; - unset($file['install-as']); - } - if (isset($file['platform'])) { - $package['platform'][$name] = $file['platform']; - unset($file['platform']); - } - $file = array('attribs' => $file); - if (isset($repl)) { - foreach ($repl as $replace ) { - $file['tasks:replace'][] = array('attribs' => $replace); - } - if (count($repl) == 1) { - $file['tasks:replace'] = $file['tasks:replace'][0]; - } - } - $ret['dir']['file'][] = $file; - } - return $ret; - } - - /** - * Post-process special files with install-as/platform attributes and - * make the release tag. - * - * This complex method follows this work-flow to create the release tags: - * - *
    -     * - if any install-as/platform exist, create a generic release and fill it with
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     * - create a release for each platform encountered and fill with
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     *   o  tags for 
    -     * 
    - * - * It does this by accessing the $package parameter, which contains an array with - * indices: - * - * - platform: mapping of file => OS the file should be installed on - * - install-as: mapping of file => installed name - * - osmap: mapping of OS => list of files that should be installed - * on that OS - * - notosmap: mapping of OS => list of files that should not be - * installed on that OS - * - * @param array - * @param array - * @access private - */ - function _convertRelease2_0(&$release, $package) - { - //- if any install-as/platform exist, create a generic release and fill it with - if (count($package['platform']) || count($package['install-as'])) { - $generic = array(); - $genericIgnore = array(); - foreach ($package['install-as'] as $file => $as) { - //o tags for - if (!isset($package['platform'][$file])) { - $generic[] = $file; - continue; - } - //o tags for - if (isset($package['platform'][$file]) && - $package['platform'][$file]{0} == '!') { - $generic[] = $file; - continue; - } - //o tags for - if (isset($package['platform'][$file]) && - $package['platform'][$file]{0} != '!') { - $genericIgnore[] = $file; - continue; - } - } - foreach ($package['platform'] as $file => $platform) { - if (isset($package['install-as'][$file])) { - continue; - } - if ($platform{0} != '!') { - //o tags for - $genericIgnore[] = $file; - } - } - if (count($package['platform'])) { - $oses = $notplatform = $platform = array(); - foreach ($package['platform'] as $file => $os) { - // get a list of oses - if ($os{0} == '!') { - if (isset($oses[substr($os, 1)])) { - continue; - } - $oses[substr($os, 1)] = count($oses); - } else { - if (isset($oses[$os])) { - continue; - } - $oses[$os] = count($oses); - } - } - //- create a release for each platform encountered and fill with - foreach ($oses as $os => $releaseNum) { - $release[$releaseNum]['installconditions']['os']['name'] = $os; - $release[$releaseNum]['filelist'] = array('install' => array(), - 'ignore' => array()); - foreach ($package['install-as'] as $file => $as) { - //o tags for - if (!isset($package['platform'][$file])) { - $release[$releaseNum]['filelist']['install'][] = - array( - 'attribs' => array( - 'name' => $file, - 'as' => $as, - ), - ); - continue; - } - //o tags for - // - if (isset($package['platform'][$file]) && - $package['platform'][$file] == $os) { - $release[$releaseNum]['filelist']['install'][] = - array( - 'attribs' => array( - 'name' => $file, - 'as' => $as, - ), - ); - continue; - } - //o tags for - // - if (isset($package['platform'][$file]) && - $package['platform'][$file] != "!$os" && - $package['platform'][$file]{0} == '!') { - $release[$releaseNum]['filelist']['install'][] = - array( - 'attribs' => array( - 'name' => $file, - 'as' => $as, - ), - ); - continue; - } - //o tags for - // - if (isset($package['platform'][$file]) && - $package['platform'][$file] == "!$os") { - $release[$releaseNum]['filelist']['ignore'][] = - array( - 'attribs' => array( - 'name' => $file, - ), - ); - continue; - } - //o tags for - // - if (isset($package['platform'][$file]) && - $package['platform'][$file]{0} != '!' && - $package['platform'][$file] != $os) { - $release[$releaseNum]['filelist']['ignore'][] = - array( - 'attribs' => array( - 'name' => $file, - ), - ); - continue; - } - } - foreach ($package['platform'] as $file => $platform) { - if (isset($package['install-as'][$file])) { - continue; - } - //o tags for - if ($platform == "!$os") { - $release[$releaseNum]['filelist']['ignore'][] = - array( - 'attribs' => array( - 'name' => $file, - ), - ); - continue; - } - //o tags for - if ($platform{0} != '!' && $platform != $os) { - $release[$releaseNum]['filelist']['ignore'][] = - array( - 'attribs' => array( - 'name' => $file, - ), - ); - } - } - if (!count($release[$releaseNum]['filelist']['install'])) { - unset($release[$releaseNum]['filelist']['install']); - } - if (!count($release[$releaseNum]['filelist']['ignore'])) { - unset($release[$releaseNum]['filelist']['ignore']); - } - } - if (count($generic) || count($genericIgnore)) { - $release[count($oses)] = array(); - if (count($generic)) { - foreach ($generic as $file) { - if (isset($package['install-as'][$file])) { - $installas = $package['install-as'][$file]; - } else { - $installas = $file; - } - $release[count($oses)]['filelist']['install'][] = - array( - 'attribs' => array( - 'name' => $file, - 'as' => $installas, - ) - ); - } - } - if (count($genericIgnore)) { - foreach ($genericIgnore as $file) { - $release[count($oses)]['filelist']['ignore'][] = - array( - 'attribs' => array( - 'name' => $file, - ) - ); - } - } - } - // cleanup - foreach ($release as $i => $rel) { - if (isset($rel['filelist']['install']) && - count($rel['filelist']['install']) == 1) { - $release[$i]['filelist']['install'] = - $release[$i]['filelist']['install'][0]; - } - if (isset($rel['filelist']['ignore']) && - count($rel['filelist']['ignore']) == 1) { - $release[$i]['filelist']['ignore'] = - $release[$i]['filelist']['ignore'][0]; - } - } - if (count($release) == 1) { - $release = $release[0]; - } - } else { - // no platform atts, but some install-as atts - foreach ($package['install-as'] as $file => $value) { - $release['filelist']['install'][] = - array( - 'attribs' => array( - 'name' => $file, - 'as' => $value - ) - ); - } - if (count($release['filelist']['install']) == 1) { - $release['filelist']['install'] = $release['filelist']['install'][0]; - } - } - } - } - - /** - * @param array - * @return array - * @access private - */ - function _processDep($dep) - { - if ($dep['type'] == 'php') { - if ($dep['rel'] == 'has') { - // come on - everyone has php! - return false; - } - } - $php = array(); - if ($dep['type'] != 'php') { - $php['name'] = $dep['name']; - if ($dep['type'] == 'pkg') { - $php['channel'] = 'pear.php.net'; - } - } - switch ($dep['rel']) { - case 'gt' : - $php['min'] = $dep['version']; - $php['exclude'] = $dep['version']; - break; - case 'ge' : - if (!isset($dep['version'])) { - if ($dep['type'] == 'php') { - if (isset($dep['name'])) { - $dep['version'] = $dep['name']; - } - } - } - $php['min'] = $dep['version']; - break; - case 'lt' : - $php['max'] = $dep['version']; - $php['exclude'] = $dep['version']; - break; - case 'le' : - $php['max'] = $dep['version']; - break; - case 'eq' : - $php['min'] = $dep['version']; - $php['max'] = $dep['version']; - break; - case 'ne' : - $php['exclude'] = $dep['version']; - break; - case 'not' : - $php['conflicts'] = 'yes'; - break; - } - return $php; - } - - /** - * @param array - * @return array - */ - function _processPhpDeps($deps) - { - $test = array(); - foreach ($deps as $dep) { - $test[] = $this->_processDep($dep); - } - $min = array(); - $max = array(); - foreach ($test as $dep) { - if (!$dep) { - continue; - } - if (isset($dep['min'])) { - $min[$dep['min']] = count($min); - } - if (isset($dep['max'])) { - $max[$dep['max']] = count($max); - } - } - if (count($min) > 0) { - uksort($min, 'version_compare'); - } - if (count($max) > 0) { - uksort($max, 'version_compare'); - } - if (count($min)) { - // get the highest minimum - $min = array_pop($a = array_flip($min)); - } else { - $min = false; - } - if (count($max)) { - // get the lowest maximum - $max = array_shift($a = array_flip($max)); - } else { - $max = false; - } - if ($min) { - $php['min'] = $min; - } - if ($max) { - $php['max'] = $max; - } - $exclude = array(); - foreach ($test as $dep) { - if (!isset($dep['exclude'])) { - continue; - } - $exclude[] = $dep['exclude']; - } - if (count($exclude)) { - $php['exclude'] = $exclude; - } - return $php; - } - - /** - * process multiple dependencies that have a name, like package deps - * @param array - * @return array - * @access private - */ - function _processMultipleDepsName($deps) - { - $ret = $tests = array(); - foreach ($deps as $name => $dep) { - foreach ($dep as $d) { - $tests[$name][] = $this->_processDep($d); - } - } - - foreach ($tests as $name => $test) { - $max = $min = $php = array(); - $php['name'] = $name; - foreach ($test as $dep) { - if (!$dep) { - continue; - } - if (isset($dep['channel'])) { - $php['channel'] = 'pear.php.net'; - } - if (isset($dep['conflicts']) && $dep['conflicts'] == 'yes') { - $php['conflicts'] = 'yes'; - } - if (isset($dep['min'])) { - $min[$dep['min']] = count($min); - } - if (isset($dep['max'])) { - $max[$dep['max']] = count($max); - } - } - if (count($min) > 0) { - uksort($min, 'version_compare'); - } - if (count($max) > 0) { - uksort($max, 'version_compare'); - } - if (count($min)) { - // get the highest minimum - $min = array_pop($a = array_flip($min)); - } else { - $min = false; - } - if (count($max)) { - // get the lowest maximum - $max = array_shift($a = array_flip($max)); - } else { - $max = false; - } - if ($min) { - $php['min'] = $min; - } - if ($max) { - $php['max'] = $max; - } - $exclude = array(); - foreach ($test as $dep) { - if (!isset($dep['exclude'])) { - continue; - } - $exclude[] = $dep['exclude']; - } - if (count($exclude)) { - $php['exclude'] = $exclude; - } - $ret[] = $php; - } - return $ret; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile/Generator/v2.php b/3rdparty/PEAR/PackageFile/Generator/v2.php deleted file mode 100644 index 8250e0ac4d..0000000000 --- a/3rdparty/PEAR/PackageFile/Generator/v2.php +++ /dev/null @@ -1,893 +0,0 @@ - - * @author Stephan Schmidt (original XML_Serializer code) - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v2.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * file/dir manipulation routines - */ -require_once 'System.php'; -require_once 'XML/Util.php'; - -/** - * This class converts a PEAR_PackageFile_v2 object into any output format. - * - * Supported output formats include array, XML string (using S. Schmidt's - * XML_Serializer, slightly customized) - * @category pear - * @package PEAR - * @author Greg Beaver - * @author Stephan Schmidt (original XML_Serializer code) - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_Generator_v2 -{ - /** - * default options for the serialization - * @access private - * @var array $_defaultOptions - */ - var $_defaultOptions = array( - 'indent' => ' ', // string used for indentation - 'linebreak' => "\n", // string used for newlines - 'typeHints' => false, // automatically add type hin attributes - 'addDecl' => true, // add an XML declaration - 'defaultTagName' => 'XML_Serializer_Tag', // tag used for indexed arrays or invalid names - 'classAsTagName' => false, // use classname for objects in indexed arrays - 'keyAttribute' => '_originalKey', // attribute where original key is stored - 'typeAttribute' => '_type', // attribute for type (only if typeHints => true) - 'classAttribute' => '_class', // attribute for class of objects (only if typeHints => true) - 'scalarAsAttributes' => false, // scalar values (strings, ints,..) will be serialized as attribute - 'prependAttributes' => '', // prepend string for attributes - 'indentAttributes' => false, // indent the attributes, if set to '_auto', it will indent attributes so they all start at the same column - 'mode' => 'simplexml', // use 'simplexml' to use parent name as tagname if transforming an indexed array - 'addDoctype' => false, // add a doctype declaration - 'doctype' => null, // supply a string or an array with id and uri ({@see XML_Util::getDoctypeDeclaration()} - 'rootName' => 'package', // name of the root tag - 'rootAttributes' => array( - 'version' => '2.0', - 'xmlns' => 'http://pear.php.net/dtd/package-2.0', - 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0', - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0 -http://pear.php.net/dtd/tasks-1.0.xsd -http://pear.php.net/dtd/package-2.0 -http://pear.php.net/dtd/package-2.0.xsd', - ), // attributes of the root tag - 'attributesArray' => 'attribs', // all values in this key will be treated as attributes - 'contentName' => '_content', // this value will be used directly as content, instead of creating a new tag, may only be used in conjuction with attributesArray - 'beautifyFilelist' => false, - 'encoding' => 'UTF-8', - ); - - /** - * options for the serialization - * @access private - * @var array $options - */ - var $options = array(); - - /** - * current tag depth - * @var integer $_tagDepth - */ - var $_tagDepth = 0; - - /** - * serilialized representation of the data - * @var string $_serializedData - */ - var $_serializedData = null; - /** - * @var PEAR_PackageFile_v2 - */ - var $_packagefile; - /** - * @param PEAR_PackageFile_v2 - */ - function PEAR_PackageFile_Generator_v2(&$packagefile) - { - $this->_packagefile = &$packagefile; - if (isset($this->_packagefile->encoding)) { - $this->_defaultOptions['encoding'] = $this->_packagefile->encoding; - } - } - - /** - * @return string - */ - function getPackagerVersion() - { - return '1.9.4'; - } - - /** - * @param PEAR_Packager - * @param bool generate a .tgz or a .tar - * @param string|null temporary directory to package in - */ - function toTgz(&$packager, $compress = true, $where = null) - { - $a = null; - return $this->toTgz2($packager, $a, $compress, $where); - } - - /** - * Package up both a package.xml and package2.xml for the same release - * @param PEAR_Packager - * @param PEAR_PackageFile_v1 - * @param bool generate a .tgz or a .tar - * @param string|null temporary directory to package in - */ - function toTgz2(&$packager, &$pf1, $compress = true, $where = null) - { - require_once 'Archive/Tar.php'; - if (!$this->_packagefile->isEquivalent($pf1)) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' . - basename($pf1->getPackageFile()) . - '" is not equivalent to "' . basename($this->_packagefile->getPackageFile()) - . '"'); - } - - if ($where === null) { - if (!($where = System::mktemp(array('-d')))) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: mktemp failed'); - } - } elseif (!@System::mkDir(array('-p', $where))) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' . $where . '" could' . - ' not be created'); - } - - $file = $where . DIRECTORY_SEPARATOR . 'package.xml'; - if (file_exists($file) && !is_file($file)) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: unable to save package.xml as' . - ' "' . $file .'"'); - } - - if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: invalid package.xml'); - } - - $ext = $compress ? '.tgz' : '.tar'; - $pkgver = $this->_packagefile->getPackage() . '-' . $this->_packagefile->getVersion(); - $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext; - if (file_exists($dest_package) && !is_file($dest_package)) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: cannot create tgz file "' . - $dest_package . '"'); - } - - $pkgfile = $this->_packagefile->getPackageFile(); - if (!$pkgfile) { - return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: package file object must ' . - 'be created from a real file'); - } - - $pkgdir = dirname(realpath($pkgfile)); - $pkgfile = basename($pkgfile); - - // {{{ Create the package file list - $filelist = array(); - $i = 0; - $this->_packagefile->flattenFilelist(); - $contents = $this->_packagefile->getContents(); - if (isset($contents['bundledpackage'])) { // bundles of packages - $contents = $contents['bundledpackage']; - if (!isset($contents[0])) { - $contents = array($contents); - } - - $packageDir = $where; - foreach ($contents as $i => $package) { - $fname = $package; - $file = $pkgdir . DIRECTORY_SEPARATOR . $fname; - if (!file_exists($file)) { - return $packager->raiseError("File does not exist: $fname"); - } - - $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname; - System::mkdir(array('-p', dirname($tfile))); - copy($file, $tfile); - $filelist[$i++] = $tfile; - $packager->log(2, "Adding package $fname"); - } - } else { // normal packages - $contents = $contents['dir']['file']; - if (!isset($contents[0])) { - $contents = array($contents); - } - - $packageDir = $where; - foreach ($contents as $i => $file) { - $fname = $file['attribs']['name']; - $atts = $file['attribs']; - $orig = $file; - $file = $pkgdir . DIRECTORY_SEPARATOR . $fname; - if (!file_exists($file)) { - return $packager->raiseError("File does not exist: $fname"); - } - - $origperms = fileperms($file); - $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname; - unset($orig['attribs']); - if (count($orig)) { // file with tasks - // run any package-time tasks - $contents = file_get_contents($file); - foreach ($orig as $tag => $raw) { - $tag = str_replace( - array($this->_packagefile->getTasksNs() . ':', '-'), - array('', '_'), $tag); - $task = "PEAR_Task_$tag"; - $task = &new $task($this->_packagefile->_config, - $this->_packagefile->_logger, - PEAR_TASK_PACKAGE); - $task->init($raw, $atts, null); - $res = $task->startSession($this->_packagefile, $contents, $tfile); - if (!$res) { - continue; // skip this task - } - - if (PEAR::isError($res)) { - return $res; - } - - $contents = $res; // save changes - System::mkdir(array('-p', dirname($tfile))); - $wp = fopen($tfile, "wb"); - fwrite($wp, $contents); - fclose($wp); - } - } - - if (!file_exists($tfile)) { - System::mkdir(array('-p', dirname($tfile))); - copy($file, $tfile); - } - - chmod($tfile, $origperms); - $filelist[$i++] = $tfile; - $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($tfile), $i - 1); - $packager->log(2, "Adding file $fname"); - } - } - // }}} - - $name = $pf1 !== null ? 'package2.xml' : 'package.xml'; - $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, $name); - if ($packagexml) { - $tar = new Archive_Tar($dest_package, $compress); - $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors - // ----- Creates with the package.xml file - $ok = $tar->createModify(array($packagexml), '', $where); - if (PEAR::isError($ok)) { - return $packager->raiseError($ok); - } elseif (!$ok) { - return $packager->raiseError('PEAR_Packagefile_v2::toTgz(): adding ' . $name . - ' failed'); - } - - // ----- Add the content of the package - if (!$tar->addModify($filelist, $pkgver, $where)) { - return $packager->raiseError( - 'PEAR_Packagefile_v2::toTgz(): tarball creation failed'); - } - - // add the package.xml version 1.0 - if ($pf1 !== null) { - $pfgen = &$pf1->getDefaultGenerator(); - $packagexml1 = $pfgen->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true); - if (!$tar->addModify(array($packagexml1), '', $where)) { - return $packager->raiseError( - 'PEAR_Packagefile_v2::toTgz(): adding package.xml failed'); - } - } - - return $dest_package; - } - } - - function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml') - { - if (!$this->_packagefile->validate($state)) { - return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: invalid package.xml', - null, null, null, $this->_packagefile->getValidationWarnings()); - } - - if ($where === null) { - if (!($where = System::mktemp(array('-d')))) { - return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: mktemp failed'); - } - } elseif (!@System::mkDir(array('-p', $where))) { - return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: "' . $where . '" could' . - ' not be created'); - } - - $newpkgfile = $where . DIRECTORY_SEPARATOR . $name; - $np = @fopen($newpkgfile, 'wb'); - if (!$np) { - return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: unable to save ' . - "$name as $newpkgfile"); - } - fwrite($np, $this->toXml($state)); - fclose($np); - return $newpkgfile; - } - - function &toV2() - { - return $this->_packagefile; - } - - /** - * Return an XML document based on the package info (as returned - * by the PEAR_Common::infoFrom* methods). - * - * @return string XML data - */ - function toXml($state = PEAR_VALIDATE_NORMAL, $options = array()) - { - $this->_packagefile->setDate(date('Y-m-d')); - $this->_packagefile->setTime(date('H:i:s')); - if (!$this->_packagefile->validate($state)) { - return false; - } - - if (is_array($options)) { - $this->options = array_merge($this->_defaultOptions, $options); - } else { - $this->options = $this->_defaultOptions; - } - - $arr = $this->_packagefile->getArray(); - if (isset($arr['filelist'])) { - unset($arr['filelist']); - } - - if (isset($arr['_lastversion'])) { - unset($arr['_lastversion']); - } - - // Fix the notes a little bit - if (isset($arr['notes'])) { - // This trims out the indenting, needs fixing - $arr['notes'] = "\n" . trim($arr['notes']) . "\n"; - } - - if (isset($arr['changelog']) && !empty($arr['changelog'])) { - // Fix for inconsistency how the array is filled depending on the changelog release amount - if (!isset($arr['changelog']['release'][0])) { - $release = $arr['changelog']['release']; - unset($arr['changelog']['release']); - - $arr['changelog']['release'] = array(); - $arr['changelog']['release'][0] = $release; - } - - foreach (array_keys($arr['changelog']['release']) as $key) { - $c =& $arr['changelog']['release'][$key]; - if (isset($c['notes'])) { - // This trims out the indenting, needs fixing - $c['notes'] = "\n" . trim($c['notes']) . "\n"; - } - } - } - - if ($state ^ PEAR_VALIDATE_PACKAGING && !isset($arr['bundle'])) { - $use = $this->_recursiveXmlFilelist($arr['contents']['dir']['file']); - unset($arr['contents']['dir']['file']); - if (isset($use['dir'])) { - $arr['contents']['dir']['dir'] = $use['dir']; - } - if (isset($use['file'])) { - $arr['contents']['dir']['file'] = $use['file']; - } - $this->options['beautifyFilelist'] = true; - } - - $arr['attribs']['packagerversion'] = '1.9.4'; - if ($this->serialize($arr, $options)) { - return $this->_serializedData . "\n"; - } - - return false; - } - - - function _recursiveXmlFilelist($list) - { - $dirs = array(); - if (isset($list['attribs'])) { - $file = $list['attribs']['name']; - unset($list['attribs']['name']); - $attributes = $list['attribs']; - $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes); - } else { - foreach ($list as $a) { - $file = $a['attribs']['name']; - $attributes = $a['attribs']; - unset($a['attribs']); - $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes, $a); - } - } - $this->_formatDir($dirs); - $this->_deFormat($dirs); - return $dirs; - } - - function _addDir(&$dirs, $dir, $file = null, $attributes = null, $tasks = null) - { - if (!$tasks) { - $tasks = array(); - } - if ($dir == array() || $dir == array('.')) { - $dirs['file'][basename($file)] = $tasks; - $attributes['name'] = basename($file); - $dirs['file'][basename($file)]['attribs'] = $attributes; - return; - } - $curdir = array_shift($dir); - if (!isset($dirs['dir'][$curdir])) { - $dirs['dir'][$curdir] = array(); - } - $this->_addDir($dirs['dir'][$curdir], $dir, $file, $attributes, $tasks); - } - - function _formatDir(&$dirs) - { - if (!count($dirs)) { - return array(); - } - $newdirs = array(); - if (isset($dirs['dir'])) { - $newdirs['dir'] = $dirs['dir']; - } - if (isset($dirs['file'])) { - $newdirs['file'] = $dirs['file']; - } - $dirs = $newdirs; - if (isset($dirs['dir'])) { - uksort($dirs['dir'], 'strnatcasecmp'); - foreach ($dirs['dir'] as $dir => $contents) { - $this->_formatDir($dirs['dir'][$dir]); - } - } - if (isset($dirs['file'])) { - uksort($dirs['file'], 'strnatcasecmp'); - }; - } - - function _deFormat(&$dirs) - { - if (!count($dirs)) { - return array(); - } - $newdirs = array(); - if (isset($dirs['dir'])) { - foreach ($dirs['dir'] as $dir => $contents) { - $newdir = array(); - $newdir['attribs']['name'] = $dir; - $this->_deFormat($contents); - foreach ($contents as $tag => $val) { - $newdir[$tag] = $val; - } - $newdirs['dir'][] = $newdir; - } - if (count($newdirs['dir']) == 1) { - $newdirs['dir'] = $newdirs['dir'][0]; - } - } - if (isset($dirs['file'])) { - foreach ($dirs['file'] as $name => $file) { - $newdirs['file'][] = $file; - } - if (count($newdirs['file']) == 1) { - $newdirs['file'] = $newdirs['file'][0]; - } - } - $dirs = $newdirs; - } - - /** - * reset all options to default options - * - * @access public - * @see setOption(), XML_Unserializer() - */ - function resetOptions() - { - $this->options = $this->_defaultOptions; - } - - /** - * set an option - * - * You can use this method if you do not want to set all options in the constructor - * - * @access public - * @see resetOption(), XML_Serializer() - */ - function setOption($name, $value) - { - $this->options[$name] = $value; - } - - /** - * sets several options at once - * - * You can use this method if you do not want to set all options in the constructor - * - * @access public - * @see resetOption(), XML_Unserializer(), setOption() - */ - function setOptions($options) - { - $this->options = array_merge($this->options, $options); - } - - /** - * serialize data - * - * @access public - * @param mixed $data data to serialize - * @return boolean true on success, pear error on failure - */ - function serialize($data, $options = null) - { - // if options have been specified, use them instead - // of the previously defined ones - if (is_array($options)) { - $optionsBak = $this->options; - if (isset($options['overrideOptions']) && $options['overrideOptions'] == true) { - $this->options = array_merge($this->_defaultOptions, $options); - } else { - $this->options = array_merge($this->options, $options); - } - } else { - $optionsBak = null; - } - - // start depth is zero - $this->_tagDepth = 0; - $this->_serializedData = ''; - // serialize an array - if (is_array($data)) { - $tagName = isset($this->options['rootName']) ? $this->options['rootName'] : 'array'; - $this->_serializedData .= $this->_serializeArray($data, $tagName, $this->options['rootAttributes']); - } - - // add doctype declaration - if ($this->options['addDoctype'] === true) { - $this->_serializedData = XML_Util::getDoctypeDeclaration($tagName, $this->options['doctype']) - . $this->options['linebreak'] - . $this->_serializedData; - } - - // build xml declaration - if ($this->options['addDecl']) { - $atts = array(); - $encoding = isset($this->options['encoding']) ? $this->options['encoding'] : null; - $this->_serializedData = XML_Util::getXMLDeclaration('1.0', $encoding) - . $this->options['linebreak'] - . $this->_serializedData; - } - - - if ($optionsBak !== null) { - $this->options = $optionsBak; - } - - return true; - } - - /** - * get the result of the serialization - * - * @access public - * @return string serialized XML - */ - function getSerializedData() - { - if ($this->_serializedData === null) { - return $this->raiseError('No serialized data available. Use XML_Serializer::serialize() first.', XML_SERIALIZER_ERROR_NO_SERIALIZATION); - } - return $this->_serializedData; - } - - /** - * serialize any value - * - * This method checks for the type of the value and calls the appropriate method - * - * @access private - * @param mixed $value - * @param string $tagName - * @param array $attributes - * @return string - */ - function _serializeValue($value, $tagName = null, $attributes = array()) - { - if (is_array($value)) { - $xml = $this->_serializeArray($value, $tagName, $attributes); - } elseif (is_object($value)) { - $xml = $this->_serializeObject($value, $tagName); - } else { - $tag = array( - 'qname' => $tagName, - 'attributes' => $attributes, - 'content' => $value - ); - $xml = $this->_createXMLTag($tag); - } - return $xml; - } - - /** - * serialize an array - * - * @access private - * @param array $array array to serialize - * @param string $tagName name of the root tag - * @param array $attributes attributes for the root tag - * @return string $string serialized data - * @uses XML_Util::isValidName() to check, whether key has to be substituted - */ - function _serializeArray(&$array, $tagName = null, $attributes = array()) - { - $_content = null; - - /** - * check for special attributes - */ - if ($this->options['attributesArray'] !== null) { - if (isset($array[$this->options['attributesArray']])) { - $attributes = $array[$this->options['attributesArray']]; - unset($array[$this->options['attributesArray']]); - } - /** - * check for special content - */ - if ($this->options['contentName'] !== null) { - if (isset($array[$this->options['contentName']])) { - $_content = $array[$this->options['contentName']]; - unset($array[$this->options['contentName']]); - } - } - } - - /* - * if mode is set to simpleXML, check whether - * the array is associative or indexed - */ - if (is_array($array) && $this->options['mode'] == 'simplexml') { - $indexed = true; - if (!count($array)) { - $indexed = false; - } - foreach ($array as $key => $val) { - if (!is_int($key)) { - $indexed = false; - break; - } - } - - if ($indexed && $this->options['mode'] == 'simplexml') { - $string = ''; - foreach ($array as $key => $val) { - if ($this->options['beautifyFilelist'] && $tagName == 'dir') { - if (!isset($this->_curdir)) { - $this->_curdir = ''; - } - $savedir = $this->_curdir; - if (isset($val['attribs'])) { - if ($val['attribs']['name'] == '/') { - $this->_curdir = '/'; - } else { - if ($this->_curdir == '/') { - $this->_curdir = ''; - } - $this->_curdir .= '/' . $val['attribs']['name']; - } - } - } - $string .= $this->_serializeValue( $val, $tagName, $attributes); - if ($this->options['beautifyFilelist'] && $tagName == 'dir') { - $string .= ' '; - if (empty($savedir)) { - unset($this->_curdir); - } else { - $this->_curdir = $savedir; - } - } - - $string .= $this->options['linebreak']; - // do indentation - if ($this->options['indent'] !== null && $this->_tagDepth > 0) { - $string .= str_repeat($this->options['indent'], $this->_tagDepth); - } - } - return rtrim($string); - } - } - - if ($this->options['scalarAsAttributes'] === true) { - foreach ($array as $key => $value) { - if (is_scalar($value) && (XML_Util::isValidName($key) === true)) { - unset($array[$key]); - $attributes[$this->options['prependAttributes'].$key] = $value; - } - } - } - - // check for empty array => create empty tag - if (empty($array)) { - $tag = array( - 'qname' => $tagName, - 'content' => $_content, - 'attributes' => $attributes - ); - - } else { - $this->_tagDepth++; - $tmp = $this->options['linebreak']; - foreach ($array as $key => $value) { - // do indentation - if ($this->options['indent'] !== null && $this->_tagDepth > 0) { - $tmp .= str_repeat($this->options['indent'], $this->_tagDepth); - } - - // copy key - $origKey = $key; - // key cannot be used as tagname => use default tag - $valid = XML_Util::isValidName($key); - if (PEAR::isError($valid)) { - if ($this->options['classAsTagName'] && is_object($value)) { - $key = get_class($value); - } else { - $key = $this->options['defaultTagName']; - } - } - $atts = array(); - if ($this->options['typeHints'] === true) { - $atts[$this->options['typeAttribute']] = gettype($value); - if ($key !== $origKey) { - $atts[$this->options['keyAttribute']] = (string)$origKey; - } - - } - if ($this->options['beautifyFilelist'] && $key == 'dir') { - if (!isset($this->_curdir)) { - $this->_curdir = ''; - } - $savedir = $this->_curdir; - if (isset($value['attribs'])) { - if ($value['attribs']['name'] == '/') { - $this->_curdir = '/'; - } else { - $this->_curdir .= '/' . $value['attribs']['name']; - } - } - } - - if (is_string($value) && $value && ($value{strlen($value) - 1} == "\n")) { - $value .= str_repeat($this->options['indent'], $this->_tagDepth); - } - $tmp .= $this->_createXMLTag(array( - 'qname' => $key, - 'attributes' => $atts, - 'content' => $value ) - ); - if ($this->options['beautifyFilelist'] && $key == 'dir') { - if (isset($value['attribs'])) { - $tmp .= ' '; - if (empty($savedir)) { - unset($this->_curdir); - } else { - $this->_curdir = $savedir; - } - } - } - $tmp .= $this->options['linebreak']; - } - - $this->_tagDepth--; - if ($this->options['indent']!==null && $this->_tagDepth>0) { - $tmp .= str_repeat($this->options['indent'], $this->_tagDepth); - } - - if (trim($tmp) === '') { - $tmp = null; - } - - $tag = array( - 'qname' => $tagName, - 'content' => $tmp, - 'attributes' => $attributes - ); - } - if ($this->options['typeHints'] === true) { - if (!isset($tag['attributes'][$this->options['typeAttribute']])) { - $tag['attributes'][$this->options['typeAttribute']] = 'array'; - } - } - - $string = $this->_createXMLTag($tag, false); - return $string; - } - - /** - * create a tag from an array - * this method awaits an array in the following format - * array( - * 'qname' => $tagName, - * 'attributes' => array(), - * 'content' => $content, // optional - * 'namespace' => $namespace // optional - * 'namespaceUri' => $namespaceUri // optional - * ) - * - * @access private - * @param array $tag tag definition - * @param boolean $replaceEntities whether to replace XML entities in content or not - * @return string $string XML tag - */ - function _createXMLTag($tag, $replaceEntities = true) - { - if ($this->options['indentAttributes'] !== false) { - $multiline = true; - $indent = str_repeat($this->options['indent'], $this->_tagDepth); - - if ($this->options['indentAttributes'] == '_auto') { - $indent .= str_repeat(' ', (strlen($tag['qname'])+2)); - - } else { - $indent .= $this->options['indentAttributes']; - } - } else { - $indent = $multiline = false; - } - - if (is_array($tag['content'])) { - if (empty($tag['content'])) { - $tag['content'] = ''; - } - } elseif(is_scalar($tag['content']) && (string)$tag['content'] == '') { - $tag['content'] = ''; - } - - if (is_scalar($tag['content']) || is_null($tag['content'])) { - if ($this->options['encoding'] == 'UTF-8' && - version_compare(phpversion(), '5.0.0', 'lt') - ) { - $tag['content'] = utf8_encode($tag['content']); - } - - if ($replaceEntities === true) { - $replaceEntities = XML_UTIL_ENTITIES_XML; - } - - $tag = XML_Util::createTagFromArray($tag, $replaceEntities, $multiline, $indent, $this->options['linebreak']); - } elseif (is_array($tag['content'])) { - $tag = $this->_serializeArray($tag['content'], $tag['qname'], $tag['attributes']); - } elseif (is_object($tag['content'])) { - $tag = $this->_serializeObject($tag['content'], $tag['qname'], $tag['attributes']); - } elseif (is_resource($tag['content'])) { - settype($tag['content'], 'string'); - $tag = XML_Util::createTagFromArray($tag, $replaceEntities); - } - return $tag; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile/Parser/v1.php b/3rdparty/PEAR/PackageFile/Parser/v1.php deleted file mode 100644 index 23395dc757..0000000000 --- a/3rdparty/PEAR/PackageFile/Parser/v1.php +++ /dev/null @@ -1,459 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v1.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * package.xml abstraction class - */ -require_once 'PEAR/PackageFile/v1.php'; -/** - * Parser for package.xml version 1.0 - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: @PEAR-VER@ - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_Parser_v1 -{ - var $_registry; - var $_config; - var $_logger; - /** - * BC hack to allow PEAR_Common::infoFromString() to sort of - * work with the version 2.0 format - there's no filelist though - * @param PEAR_PackageFile_v2 - */ - function fromV2($packagefile) - { - $info = $packagefile->getArray(true); - $ret = new PEAR_PackageFile_v1; - $ret->fromArray($info['old']); - } - - function setConfig(&$c) - { - $this->_config = &$c; - $this->_registry = &$c->getRegistry(); - } - - function setLogger(&$l) - { - $this->_logger = &$l; - } - - /** - * @param string contents of package.xml file, version 1.0 - * @return bool success of parsing - */ - function &parse($data, $file, $archive = false) - { - if (!extension_loaded('xml')) { - return PEAR::raiseError('Cannot create xml parser for parsing package.xml, no xml extension'); - } - $xp = xml_parser_create(); - if (!$xp) { - $a = &PEAR::raiseError('Cannot create xml parser for parsing package.xml'); - return $a; - } - xml_set_object($xp, $this); - xml_set_element_handler($xp, '_element_start_1_0', '_element_end_1_0'); - xml_set_character_data_handler($xp, '_pkginfo_cdata_1_0'); - xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); - - $this->element_stack = array(); - $this->_packageInfo = array('provides' => array()); - $this->current_element = false; - unset($this->dir_install); - $this->_packageInfo['filelist'] = array(); - $this->filelist =& $this->_packageInfo['filelist']; - $this->dir_names = array(); - $this->in_changelog = false; - $this->d_i = 0; - $this->cdata = ''; - $this->_isValid = true; - - if (!xml_parse($xp, $data, 1)) { - $code = xml_get_error_code($xp); - $line = xml_get_current_line_number($xp); - xml_parser_free($xp); - $a = &PEAR::raiseError(sprintf("XML error: %s at line %d", - $str = xml_error_string($code), $line), 2); - return $a; - } - - xml_parser_free($xp); - - $pf = new PEAR_PackageFile_v1; - $pf->setConfig($this->_config); - if (isset($this->_logger)) { - $pf->setLogger($this->_logger); - } - $pf->setPackagefile($file, $archive); - $pf->fromArray($this->_packageInfo); - return $pf; - } - // {{{ _unIndent() - - /** - * Unindent given string - * - * @param string $str The string that has to be unindented. - * @return string - * @access private - */ - function _unIndent($str) - { - // remove leading newlines - $str = preg_replace('/^[\r\n]+/', '', $str); - // find whitespace at the beginning of the first line - $indent_len = strspn($str, " \t"); - $indent = substr($str, 0, $indent_len); - $data = ''; - // remove the same amount of whitespace from following lines - foreach (explode("\n", $str) as $line) { - if (substr($line, 0, $indent_len) == $indent) { - $data .= substr($line, $indent_len) . "\n"; - } elseif (trim(substr($line, 0, $indent_len))) { - $data .= ltrim($line); - } - } - return $data; - } - - // Support for package DTD v1.0: - // {{{ _element_start_1_0() - - /** - * XML parser callback for ending elements. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name name of ending element - * - * @return void - * - * @access private - */ - function _element_start_1_0($xp, $name, $attribs) - { - array_push($this->element_stack, $name); - $this->current_element = $name; - $spos = sizeof($this->element_stack) - 2; - $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; - $this->current_attributes = $attribs; - $this->cdata = ''; - switch ($name) { - case 'dir': - if ($this->in_changelog) { - break; - } - if (array_key_exists('name', $attribs) && $attribs['name'] != '/') { - $attribs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), - $attribs['name']); - if (strrpos($attribs['name'], '/') === strlen($attribs['name']) - 1) { - $attribs['name'] = substr($attribs['name'], 0, - strlen($attribs['name']) - 1); - } - if (strpos($attribs['name'], '/') === 0) { - $attribs['name'] = substr($attribs['name'], 1); - } - $this->dir_names[] = $attribs['name']; - } - if (isset($attribs['baseinstalldir'])) { - $this->dir_install = $attribs['baseinstalldir']; - } - if (isset($attribs['role'])) { - $this->dir_role = $attribs['role']; - } - break; - case 'file': - if ($this->in_changelog) { - break; - } - if (isset($attribs['name'])) { - $path = ''; - if (count($this->dir_names)) { - foreach ($this->dir_names as $dir) { - $path .= $dir . '/'; - } - } - $path .= preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), - $attribs['name']); - unset($attribs['name']); - $this->current_path = $path; - $this->filelist[$path] = $attribs; - // Set the baseinstalldir only if the file don't have this attrib - if (!isset($this->filelist[$path]['baseinstalldir']) && - isset($this->dir_install)) - { - $this->filelist[$path]['baseinstalldir'] = $this->dir_install; - } - // Set the Role - if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { - $this->filelist[$path]['role'] = $this->dir_role; - } - } - break; - case 'replace': - if (!$this->in_changelog) { - $this->filelist[$this->current_path]['replacements'][] = $attribs; - } - break; - case 'maintainers': - $this->_packageInfo['maintainers'] = array(); - $this->m_i = 0; // maintainers array index - break; - case 'maintainer': - // compatibility check - if (!isset($this->_packageInfo['maintainers'])) { - $this->_packageInfo['maintainers'] = array(); - $this->m_i = 0; - } - $this->_packageInfo['maintainers'][$this->m_i] = array(); - $this->current_maintainer =& $this->_packageInfo['maintainers'][$this->m_i]; - break; - case 'changelog': - $this->_packageInfo['changelog'] = array(); - $this->c_i = 0; // changelog array index - $this->in_changelog = true; - break; - case 'release': - if ($this->in_changelog) { - $this->_packageInfo['changelog'][$this->c_i] = array(); - $this->current_release = &$this->_packageInfo['changelog'][$this->c_i]; - } else { - $this->current_release = &$this->_packageInfo; - } - break; - case 'deps': - if (!$this->in_changelog) { - $this->_packageInfo['release_deps'] = array(); - } - break; - case 'dep': - // dependencies array index - if (!$this->in_changelog) { - $this->d_i++; - isset($attribs['type']) ? ($attribs['type'] = strtolower($attribs['type'])) : false; - $this->_packageInfo['release_deps'][$this->d_i] = $attribs; - } - break; - case 'configureoptions': - if (!$this->in_changelog) { - $this->_packageInfo['configure_options'] = array(); - } - break; - case 'configureoption': - if (!$this->in_changelog) { - $this->_packageInfo['configure_options'][] = $attribs; - } - break; - case 'provides': - if (empty($attribs['type']) || empty($attribs['name'])) { - break; - } - $attribs['explicit'] = true; - $this->_packageInfo['provides']["$attribs[type];$attribs[name]"] = $attribs; - break; - case 'package' : - if (isset($attribs['version'])) { - $this->_packageInfo['xsdversion'] = trim($attribs['version']); - } else { - $this->_packageInfo['xsdversion'] = '1.0'; - } - if (isset($attribs['packagerversion'])) { - $this->_packageInfo['packagerversion'] = $attribs['packagerversion']; - } - break; - } - } - - // }}} - // {{{ _element_end_1_0() - - /** - * XML parser callback for ending elements. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name name of ending element - * - * @return void - * - * @access private - */ - function _element_end_1_0($xp, $name) - { - $data = trim($this->cdata); - switch ($name) { - case 'name': - switch ($this->prev_element) { - case 'package': - $this->_packageInfo['package'] = $data; - break; - case 'maintainer': - $this->current_maintainer['name'] = $data; - break; - } - break; - case 'extends' : - $this->_packageInfo['extends'] = $data; - break; - case 'summary': - $this->_packageInfo['summary'] = $data; - break; - case 'description': - $data = $this->_unIndent($this->cdata); - $this->_packageInfo['description'] = $data; - break; - case 'user': - $this->current_maintainer['handle'] = $data; - break; - case 'email': - $this->current_maintainer['email'] = $data; - break; - case 'role': - $this->current_maintainer['role'] = $data; - break; - case 'version': - if ($this->in_changelog) { - $this->current_release['version'] = $data; - } else { - $this->_packageInfo['version'] = $data; - } - break; - case 'date': - if ($this->in_changelog) { - $this->current_release['release_date'] = $data; - } else { - $this->_packageInfo['release_date'] = $data; - } - break; - case 'notes': - // try to "de-indent" release notes in case someone - // has been over-indenting their xml ;-) - // Trim only on the right side - $data = rtrim($this->_unIndent($this->cdata)); - if ($this->in_changelog) { - $this->current_release['release_notes'] = $data; - } else { - $this->_packageInfo['release_notes'] = $data; - } - break; - case 'warnings': - if ($this->in_changelog) { - $this->current_release['release_warnings'] = $data; - } else { - $this->_packageInfo['release_warnings'] = $data; - } - break; - case 'state': - if ($this->in_changelog) { - $this->current_release['release_state'] = $data; - } else { - $this->_packageInfo['release_state'] = $data; - } - break; - case 'license': - if ($this->in_changelog) { - $this->current_release['release_license'] = $data; - } else { - $this->_packageInfo['release_license'] = $data; - } - break; - case 'dep': - if ($data && !$this->in_changelog) { - $this->_packageInfo['release_deps'][$this->d_i]['name'] = $data; - } - break; - case 'dir': - if ($this->in_changelog) { - break; - } - array_pop($this->dir_names); - break; - case 'file': - if ($this->in_changelog) { - break; - } - if ($data) { - $path = ''; - if (count($this->dir_names)) { - foreach ($this->dir_names as $dir) { - $path .= $dir . '/'; - } - } - $path .= $data; - $this->filelist[$path] = $this->current_attributes; - // Set the baseinstalldir only if the file don't have this attrib - if (!isset($this->filelist[$path]['baseinstalldir']) && - isset($this->dir_install)) - { - $this->filelist[$path]['baseinstalldir'] = $this->dir_install; - } - // Set the Role - if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { - $this->filelist[$path]['role'] = $this->dir_role; - } - } - break; - case 'maintainer': - if (empty($this->_packageInfo['maintainers'][$this->m_i]['role'])) { - $this->_packageInfo['maintainers'][$this->m_i]['role'] = 'lead'; - } - $this->m_i++; - break; - case 'release': - if ($this->in_changelog) { - $this->c_i++; - } - break; - case 'changelog': - $this->in_changelog = false; - break; - } - array_pop($this->element_stack); - $spos = sizeof($this->element_stack) - 1; - $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : ''; - $this->cdata = ''; - } - - // }}} - // {{{ _pkginfo_cdata_1_0() - - /** - * XML parser callback for character data. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name character data - * - * @return void - * - * @access private - */ - function _pkginfo_cdata_1_0($xp, $data) - { - if (isset($this->cdata)) { - $this->cdata .= $data; - } - } - - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile/Parser/v2.php b/3rdparty/PEAR/PackageFile/Parser/v2.php deleted file mode 100644 index a3ba7063f2..0000000000 --- a/3rdparty/PEAR/PackageFile/Parser/v2.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v2.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * base xml parser class - */ -require_once 'PEAR/XMLParser.php'; -require_once 'PEAR/PackageFile/v2.php'; -/** - * Parser for package.xml version 2.0 - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: @PEAR-VER@ - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_Parser_v2 extends PEAR_XMLParser -{ - var $_config; - var $_logger; - var $_registry; - - function setConfig(&$c) - { - $this->_config = &$c; - $this->_registry = &$c->getRegistry(); - } - - function setLogger(&$l) - { - $this->_logger = &$l; - } - /** - * Unindent given string - * - * @param string $str The string that has to be unindented. - * @return string - * @access private - */ - function _unIndent($str) - { - // remove leading newlines - $str = preg_replace('/^[\r\n]+/', '', $str); - // find whitespace at the beginning of the first line - $indent_len = strspn($str, " \t"); - $indent = substr($str, 0, $indent_len); - $data = ''; - // remove the same amount of whitespace from following lines - foreach (explode("\n", $str) as $line) { - if (substr($line, 0, $indent_len) == $indent) { - $data .= substr($line, $indent_len) . "\n"; - } else { - $data .= $line . "\n"; - } - } - return $data; - } - - /** - * post-process data - * - * @param string $data - * @param string $element element name - */ - function postProcess($data, $element) - { - if ($element == 'notes') { - return trim($this->_unIndent($data)); - } - return trim($data); - } - - /** - * @param string - * @param string file name of the package.xml - * @param string|false name of the archive this package.xml came from, if any - * @param string class name to instantiate and return. This must be PEAR_PackageFile_v2 or - * a subclass - * @return PEAR_PackageFile_v2 - */ - function &parse($data, $file, $archive = false, $class = 'PEAR_PackageFile_v2') - { - if (PEAR::isError($err = parent::parse($data, $file))) { - return $err; - } - - $ret = new $class; - $ret->encoding = $this->encoding; - $ret->setConfig($this->_config); - if (isset($this->_logger)) { - $ret->setLogger($this->_logger); - } - - $ret->fromArray($this->_unserializedData); - $ret->setPackagefile($file, $archive); - return $ret; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile/v1.php b/3rdparty/PEAR/PackageFile/v1.php deleted file mode 100644 index 43e346bcda..0000000000 --- a/3rdparty/PEAR/PackageFile/v1.php +++ /dev/null @@ -1,1612 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v1.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * For error handling - */ -require_once 'PEAR/ErrorStack.php'; - -/** - * Error code if parsing is attempted with no xml extension - */ -define('PEAR_PACKAGEFILE_ERROR_NO_XML_EXT', 3); - -/** - * Error code if creating the xml parser resource fails - */ -define('PEAR_PACKAGEFILE_ERROR_CANT_MAKE_PARSER', 4); - -/** - * Error code used for all sax xml parsing errors - */ -define('PEAR_PACKAGEFILE_ERROR_PARSER_ERROR', 5); - -/** - * Error code used when there is no name - */ -define('PEAR_PACKAGEFILE_ERROR_NO_NAME', 6); - -/** - * Error code when a package name is not valid - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_NAME', 7); - -/** - * Error code used when no summary is parsed - */ -define('PEAR_PACKAGEFILE_ERROR_NO_SUMMARY', 8); - -/** - * Error code for summaries that are more than 1 line - */ -define('PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY', 9); - -/** - * Error code used when no description is present - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION', 10); - -/** - * Error code used when no license is present - */ -define('PEAR_PACKAGEFILE_ERROR_NO_LICENSE', 11); - -/** - * Error code used when a version number is not present - */ -define('PEAR_PACKAGEFILE_ERROR_NO_VERSION', 12); - -/** - * Error code used when a version number is invalid - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_VERSION', 13); - -/** - * Error code when release state is missing - */ -define('PEAR_PACKAGEFILE_ERROR_NO_STATE', 14); - -/** - * Error code when release state is invalid - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_STATE', 15); - -/** - * Error code when release state is missing - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DATE', 16); - -/** - * Error code when release state is invalid - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_DATE', 17); - -/** - * Error code when no release notes are found - */ -define('PEAR_PACKAGEFILE_ERROR_NO_NOTES', 18); - -/** - * Error code when no maintainers are found - */ -define('PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS', 19); - -/** - * Error code when a maintainer has no handle - */ -define('PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE', 20); - -/** - * Error code when a maintainer has no handle - */ -define('PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE', 21); - -/** - * Error code when a maintainer has no name - */ -define('PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME', 22); - -/** - * Error code when a maintainer has no email - */ -define('PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL', 23); - -/** - * Error code when a maintainer has no handle - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_MAINTROLE', 24); - -/** - * Error code when a dependency is not a PHP dependency, but has no name - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DEPNAME', 25); - -/** - * Error code when a dependency has no type (pkg, php, etc.) - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE', 26); - -/** - * Error code when a dependency has no relation (lt, ge, has, etc.) - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DEPREL', 27); - -/** - * Error code when a dependency is not a 'has' relation, but has no version - */ -define('PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION', 28); - -/** - * Error code when a dependency has an invalid relation - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPREL', 29); - -/** - * Error code when a dependency has an invalid type - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPTYPE', 30); - -/** - * Error code when a dependency has an invalid optional option - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL', 31); - -/** - * Error code when a dependency is a pkg dependency, and has an invalid package name - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPNAME', 32); - -/** - * Error code when a dependency has a channel="foo" attribute, and foo is not a registered channel - */ -define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_DEPCHANNEL', 33); - -/** - * Error code when rel="has" and version attribute is present. - */ -define('PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED', 34); - -/** - * Error code when type="php" and dependency name is present - */ -define('PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED', 35); - -/** - * Error code when a configure option has no name - */ -define('PEAR_PACKAGEFILE_ERROR_NO_CONFNAME', 36); - -/** - * Error code when a configure option has no name - */ -define('PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT', 37); - -/** - * Error code when a file in the filelist has an invalid role - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE', 38); - -/** - * Error code when a file in the filelist has no role - */ -define('PEAR_PACKAGEFILE_ERROR_NO_FILEROLE', 39); - -/** - * Error code when analyzing a php source file that has parse errors - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE', 40); - -/** - * Error code when analyzing a php source file reveals a source element - * without a package name prefix - */ -define('PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX', 41); - -/** - * Error code when an unknown channel is specified - */ -define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_CHANNEL', 42); - -/** - * Error code when no files are found in the filelist - */ -define('PEAR_PACKAGEFILE_ERROR_NO_FILES', 43); - -/** - * Error code when a file is not valid php according to _analyzeSourceCode() - */ -define('PEAR_PACKAGEFILE_ERROR_INVALID_FILE', 44); - -/** - * Error code when the channel validator returns an error or warning - */ -define('PEAR_PACKAGEFILE_ERROR_CHANNELVAL', 45); - -/** - * Error code when a php5 package is packaged in php4 (analysis doesn't work) - */ -define('PEAR_PACKAGEFILE_ERROR_PHP5', 46); - -/** - * Error code when a file is listed in package.xml but does not exist - */ -define('PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND', 47); - -/** - * Error code when a - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_v1 -{ - /** - * @access private - * @var PEAR_ErrorStack - * @access private - */ - var $_stack; - - /** - * A registry object, used to access the package name validation regex for non-standard channels - * @var PEAR_Registry - * @access private - */ - var $_registry; - - /** - * An object that contains a log method that matches PEAR_Common::log's signature - * @var object - * @access private - */ - var $_logger; - - /** - * Parsed package information - * @var array - * @access private - */ - var $_packageInfo; - - /** - * path to package.xml - * @var string - * @access private - */ - var $_packageFile; - - /** - * path to package .tgz or false if this is a local/extracted package.xml - * @var string - * @access private - */ - var $_archiveFile; - - /** - * @var int - * @access private - */ - var $_isValid = 0; - - /** - * Determines whether this packagefile was initialized only with partial package info - * - * If this package file was constructed via parsing REST, it will only contain - * - * - package name - * - channel name - * - dependencies - * @var boolean - * @access private - */ - var $_incomplete = true; - - /** - * @param bool determines whether to return a PEAR_Error object, or use the PEAR_ErrorStack - * @param string Name of Error Stack class to use. - */ - function PEAR_PackageFile_v1() - { - $this->_stack = &new PEAR_ErrorStack('PEAR_PackageFile_v1'); - $this->_stack->setErrorMessageTemplate($this->_getErrorMessage()); - $this->_isValid = 0; - } - - function installBinary($installer) - { - return false; - } - - function isExtension($name) - { - return false; - } - - function setConfig(&$config) - { - $this->_config = &$config; - $this->_registry = &$config->getRegistry(); - } - - function setRequestedGroup() - { - // placeholder - } - - /** - * For saving in the registry. - * - * Set the last version that was installed - * @param string - */ - function setLastInstalledVersion($version) - { - $this->_packageInfo['_lastversion'] = $version; - } - - /** - * @return string|false - */ - function getLastInstalledVersion() - { - if (isset($this->_packageInfo['_lastversion'])) { - return $this->_packageInfo['_lastversion']; - } - return false; - } - - function getInstalledBinary() - { - return false; - } - - function listPostinstallScripts() - { - return false; - } - - function initPostinstallScripts() - { - return false; - } - - function setLogger(&$logger) - { - if ($logger && (!is_object($logger) || !method_exists($logger, 'log'))) { - return PEAR::raiseError('Logger must be compatible with PEAR_Common::log'); - } - $this->_logger = &$logger; - } - - function setPackagefile($file, $archive = false) - { - $this->_packageFile = $file; - $this->_archiveFile = $archive ? $archive : $file; - } - - function getPackageFile() - { - return isset($this->_packageFile) ? $this->_packageFile : false; - } - - function getPackageType() - { - return 'php'; - } - - function getArchiveFile() - { - return $this->_archiveFile; - } - - function packageInfo($field) - { - if (!is_string($field) || empty($field) || - !isset($this->_packageInfo[$field])) { - return false; - } - return $this->_packageInfo[$field]; - } - - function setDirtree($path) - { - if (!isset($this->_packageInfo['dirtree'])) { - $this->_packageInfo['dirtree'] = array(); - } - $this->_packageInfo['dirtree'][$path] = true; - } - - function getDirtree() - { - if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) { - return $this->_packageInfo['dirtree']; - } - return false; - } - - function resetDirtree() - { - unset($this->_packageInfo['dirtree']); - } - - function fromArray($pinfo) - { - $this->_incomplete = false; - $this->_packageInfo = $pinfo; - } - - function isIncomplete() - { - return $this->_incomplete; - } - - function getChannel() - { - return 'pear.php.net'; - } - - function getUri() - { - return false; - } - - function getTime() - { - return false; - } - - function getExtends() - { - if (isset($this->_packageInfo['extends'])) { - return $this->_packageInfo['extends']; - } - return false; - } - - /** - * @return array - */ - function toArray() - { - if (!$this->validate(PEAR_VALIDATE_NORMAL)) { - return false; - } - return $this->getArray(); - } - - function getArray() - { - return $this->_packageInfo; - } - - function getName() - { - return $this->getPackage(); - } - - function getPackage() - { - if (isset($this->_packageInfo['package'])) { - return $this->_packageInfo['package']; - } - return false; - } - - /** - * WARNING - don't use this unless you know what you are doing - */ - function setRawPackage($package) - { - $this->_packageInfo['package'] = $package; - } - - function setPackage($package) - { - $this->_packageInfo['package'] = $package; - $this->_isValid = false; - } - - function getVersion() - { - if (isset($this->_packageInfo['version'])) { - return $this->_packageInfo['version']; - } - return false; - } - - function setVersion($version) - { - $this->_packageInfo['version'] = $version; - $this->_isValid = false; - } - - function clearMaintainers() - { - unset($this->_packageInfo['maintainers']); - } - - function getMaintainers() - { - if (isset($this->_packageInfo['maintainers'])) { - return $this->_packageInfo['maintainers']; - } - return false; - } - - /** - * Adds a new maintainer - no checking of duplicates is performed, use - * updatemaintainer for that purpose. - */ - function addMaintainer($role, $handle, $name, $email) - { - $this->_packageInfo['maintainers'][] = - array('handle' => $handle, 'role' => $role, 'email' => $email, 'name' => $name); - $this->_isValid = false; - } - - function updateMaintainer($role, $handle, $name, $email) - { - $found = false; - if (!isset($this->_packageInfo['maintainers']) || - !is_array($this->_packageInfo['maintainers'])) { - return $this->addMaintainer($role, $handle, $name, $email); - } - foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) { - if ($maintainer['handle'] == $handle) { - $found = $i; - break; - } - } - if ($found !== false) { - unset($this->_packageInfo['maintainers'][$found]); - $this->_packageInfo['maintainers'] = - array_values($this->_packageInfo['maintainers']); - } - $this->addMaintainer($role, $handle, $name, $email); - } - - function deleteMaintainer($handle) - { - $found = false; - foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) { - if ($maintainer['handle'] == $handle) { - $found = $i; - break; - } - } - if ($found !== false) { - unset($this->_packageInfo['maintainers'][$found]); - $this->_packageInfo['maintainers'] = - array_values($this->_packageInfo['maintainers']); - return true; - } - return false; - } - - function getState() - { - if (isset($this->_packageInfo['release_state'])) { - return $this->_packageInfo['release_state']; - } - return false; - } - - function setRawState($state) - { - $this->_packageInfo['release_state'] = $state; - } - - function setState($state) - { - $this->_packageInfo['release_state'] = $state; - $this->_isValid = false; - } - - function getDate() - { - if (isset($this->_packageInfo['release_date'])) { - return $this->_packageInfo['release_date']; - } - return false; - } - - function setDate($date) - { - $this->_packageInfo['release_date'] = $date; - $this->_isValid = false; - } - - function getLicense() - { - if (isset($this->_packageInfo['release_license'])) { - return $this->_packageInfo['release_license']; - } - return false; - } - - function setLicense($date) - { - $this->_packageInfo['release_license'] = $date; - $this->_isValid = false; - } - - function getSummary() - { - if (isset($this->_packageInfo['summary'])) { - return $this->_packageInfo['summary']; - } - return false; - } - - function setSummary($summary) - { - $this->_packageInfo['summary'] = $summary; - $this->_isValid = false; - } - - function getDescription() - { - if (isset($this->_packageInfo['description'])) { - return $this->_packageInfo['description']; - } - return false; - } - - function setDescription($desc) - { - $this->_packageInfo['description'] = $desc; - $this->_isValid = false; - } - - function getNotes() - { - if (isset($this->_packageInfo['release_notes'])) { - return $this->_packageInfo['release_notes']; - } - return false; - } - - function setNotes($notes) - { - $this->_packageInfo['release_notes'] = $notes; - $this->_isValid = false; - } - - function getDeps() - { - if (isset($this->_packageInfo['release_deps'])) { - return $this->_packageInfo['release_deps']; - } - return false; - } - - /** - * Reset dependencies prior to adding new ones - */ - function clearDeps() - { - unset($this->_packageInfo['release_deps']); - } - - function addPhpDep($version, $rel) - { - $this->_isValid = false; - $this->_packageInfo['release_deps'][] = - array('type' => 'php', - 'rel' => $rel, - 'version' => $version); - } - - function addPackageDep($name, $version, $rel, $optional = 'no') - { - $this->_isValid = false; - $dep = - array('type' => 'pkg', - 'name' => $name, - 'rel' => $rel, - 'optional' => $optional); - if ($rel != 'has' && $rel != 'not') { - $dep['version'] = $version; - } - $this->_packageInfo['release_deps'][] = $dep; - } - - function addExtensionDep($name, $version, $rel, $optional = 'no') - { - $this->_isValid = false; - $this->_packageInfo['release_deps'][] = - array('type' => 'ext', - 'name' => $name, - 'rel' => $rel, - 'version' => $version, - 'optional' => $optional); - } - - /** - * WARNING - do not use this function directly unless you know what you're doing - */ - function setDeps($deps) - { - $this->_packageInfo['release_deps'] = $deps; - } - - function hasDeps() - { - return isset($this->_packageInfo['release_deps']) && - count($this->_packageInfo['release_deps']); - } - - function getDependencyGroup($group) - { - return false; - } - - function isCompatible($pf) - { - return false; - } - - function isSubpackageOf($p) - { - return $p->isSubpackage($this); - } - - function isSubpackage($p) - { - return false; - } - - function dependsOn($package, $channel) - { - if (strtolower($channel) != 'pear.php.net') { - return false; - } - if (!($deps = $this->getDeps())) { - return false; - } - foreach ($deps as $dep) { - if ($dep['type'] != 'pkg') { - continue; - } - if (strtolower($dep['name']) == strtolower($package)) { - return true; - } - } - return false; - } - - function getConfigureOptions() - { - if (isset($this->_packageInfo['configure_options'])) { - return $this->_packageInfo['configure_options']; - } - return false; - } - - function hasConfigureOptions() - { - return isset($this->_packageInfo['configure_options']) && - count($this->_packageInfo['configure_options']); - } - - function addConfigureOption($name, $prompt, $default = false) - { - $o = array('name' => $name, 'prompt' => $prompt); - if ($default !== false) { - $o['default'] = $default; - } - if (!isset($this->_packageInfo['configure_options'])) { - $this->_packageInfo['configure_options'] = array(); - } - $this->_packageInfo['configure_options'][] = $o; - } - - function clearConfigureOptions() - { - unset($this->_packageInfo['configure_options']); - } - - function getProvides() - { - if (isset($this->_packageInfo['provides'])) { - return $this->_packageInfo['provides']; - } - return false; - } - - function getProvidesExtension() - { - return false; - } - - function addFile($dir, $file, $attrs) - { - $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir); - if ($dir == '/' || $dir == '') { - $dir = ''; - } else { - $dir .= '/'; - } - $file = $dir . $file; - $file = preg_replace('![\\/]+!', '/', $file); - $this->_packageInfo['filelist'][$file] = $attrs; - } - - function getInstallationFilelist() - { - return $this->getFilelist(); - } - - function getFilelist() - { - if (isset($this->_packageInfo['filelist'])) { - return $this->_packageInfo['filelist']; - } - return false; - } - - function setFileAttribute($file, $attr, $value) - { - $this->_packageInfo['filelist'][$file][$attr] = $value; - } - - function resetFilelist() - { - $this->_packageInfo['filelist'] = array(); - } - - function setInstalledAs($file, $path) - { - if ($path) { - return $this->_packageInfo['filelist'][$file]['installed_as'] = $path; - } - unset($this->_packageInfo['filelist'][$file]['installed_as']); - } - - function installedFile($file, $atts) - { - if (isset($this->_packageInfo['filelist'][$file])) { - $this->_packageInfo['filelist'][$file] = - array_merge($this->_packageInfo['filelist'][$file], $atts); - } else { - $this->_packageInfo['filelist'][$file] = $atts; - } - } - - function getChangelog() - { - if (isset($this->_packageInfo['changelog'])) { - return $this->_packageInfo['changelog']; - } - return false; - } - - function getPackagexmlVersion() - { - return '1.0'; - } - - /** - * Wrapper to {@link PEAR_ErrorStack::getErrors()} - * @param boolean determines whether to purge the error stack after retrieving - * @return array - */ - function getValidationWarnings($purge = true) - { - return $this->_stack->getErrors($purge); - } - - // }}} - /** - * Validation error. Also marks the object contents as invalid - * @param error code - * @param array error information - * @access private - */ - function _validateError($code, $params = array()) - { - $this->_stack->push($code, 'error', $params, false, false, debug_backtrace()); - $this->_isValid = false; - } - - /** - * Validation warning. Does not mark the object contents invalid. - * @param error code - * @param array error information - * @access private - */ - function _validateWarning($code, $params = array()) - { - $this->_stack->push($code, 'warning', $params, false, false, debug_backtrace()); - } - - /** - * @param integer error code - * @access protected - */ - function _getErrorMessage() - { - return array( - PEAR_PACKAGEFILE_ERROR_NO_NAME => - 'Missing Package Name', - PEAR_PACKAGEFILE_ERROR_NO_SUMMARY => - 'No summary found', - PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY => - 'Summary should be on one line', - PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION => - 'Missing description', - PEAR_PACKAGEFILE_ERROR_NO_LICENSE => - 'Missing license', - PEAR_PACKAGEFILE_ERROR_NO_VERSION => - 'No release version found', - PEAR_PACKAGEFILE_ERROR_NO_STATE => - 'No release state found', - PEAR_PACKAGEFILE_ERROR_NO_DATE => - 'No release date found', - PEAR_PACKAGEFILE_ERROR_NO_NOTES => - 'No release notes found', - PEAR_PACKAGEFILE_ERROR_NO_LEAD => - 'Package must have at least one lead maintainer', - PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS => - 'No maintainers found, at least one must be defined', - PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE => - 'Maintainer %index% has no handle (user ID at channel server)', - PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE => - 'Maintainer %index% has no role', - PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME => - 'Maintainer %index% has no name', - PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL => - 'Maintainer %index% has no email', - PEAR_PACKAGEFILE_ERROR_NO_DEPNAME => - 'Dependency %index% is not a php dependency, and has no name', - PEAR_PACKAGEFILE_ERROR_NO_DEPREL => - 'Dependency %index% has no relation (rel)', - PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE => - 'Dependency %index% has no type', - PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED => - 'PHP Dependency %index% has a name attribute of "%name%" which will be' . - ' ignored!', - PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION => - 'Dependency %index% is not a rel="has" or rel="not" dependency, ' . - 'and has no version', - PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION => - 'Dependency %index% is a type="php" dependency, ' . - 'and has no version', - PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED => - 'Dependency %index% is a rel="%rel%" dependency, versioning is ignored', - PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL => - 'Dependency %index% has invalid optional value "%opt%", should be yes or no', - PEAR_PACKAGEFILE_PHP_NO_NOT => - 'Dependency %index%: php dependencies cannot use "not" rel, use "ne"' . - ' to exclude specific versions', - PEAR_PACKAGEFILE_ERROR_NO_CONFNAME => - 'Configure Option %index% has no name', - PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT => - 'Configure Option %index% has no prompt', - PEAR_PACKAGEFILE_ERROR_NO_FILES => - 'No files in section of package.xml', - PEAR_PACKAGEFILE_ERROR_NO_FILEROLE => - 'File "%file%" has no role, expecting one of "%roles%"', - PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE => - 'File "%file%" has invalid role "%role%", expecting one of "%roles%"', - PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME => - 'File "%file%" cannot start with ".", cannot package or install', - PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE => - 'Parser error: invalid PHP found in file "%file%"', - PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX => - 'in %file%: %type% "%name%" not prefixed with package name "%package%"', - PEAR_PACKAGEFILE_ERROR_INVALID_FILE => - 'Parser error: invalid PHP file "%file%"', - PEAR_PACKAGEFILE_ERROR_CHANNELVAL => - 'Channel validator error: field "%field%" - %reason%', - PEAR_PACKAGEFILE_ERROR_PHP5 => - 'Error, PHP5 token encountered in %file%, analysis should be in PHP5', - PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND => - 'File "%file%" in package.xml does not exist', - PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS => - 'Package.xml contains non-ISO-8859-1 characters, and may not validate', - ); - } - - /** - * Validate XML package definition file. - * - * @access public - * @return boolean - */ - function validate($state = PEAR_VALIDATE_NORMAL, $nofilechecking = false) - { - if (($this->_isValid & $state) == $state) { - return true; - } - $this->_isValid = true; - $info = $this->_packageInfo; - if (empty($info['package'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NAME); - $this->_packageName = $pn = 'unknown'; - } else { - $this->_packageName = $pn = $info['package']; - } - - if (empty($info['summary'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_SUMMARY); - } elseif (strpos(trim($info['summary']), "\n") !== false) { - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY, - array('summary' => $info['summary'])); - } - if (empty($info['description'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION); - } - if (empty($info['release_license'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LICENSE); - } - if (empty($info['version'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_VERSION); - } - if (empty($info['release_state'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_STATE); - } - if (empty($info['release_date'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DATE); - } - if (empty($info['release_notes'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NOTES); - } - if (empty($info['maintainers'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS); - } else { - $haslead = false; - $i = 1; - foreach ($info['maintainers'] as $m) { - if (empty($m['handle'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE, - array('index' => $i)); - } - if (empty($m['role'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE, - array('index' => $i, 'roles' => PEAR_Common::getUserRoles())); - } elseif ($m['role'] == 'lead') { - $haslead = true; - } - if (empty($m['name'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME, - array('index' => $i)); - } - if (empty($m['email'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL, - array('index' => $i)); - } - $i++; - } - if (!$haslead) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LEAD); - } - } - if (!empty($info['release_deps'])) { - $i = 1; - foreach ($info['release_deps'] as $d) { - if (!isset($d['type']) || empty($d['type'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE, - array('index' => $i, 'types' => PEAR_Common::getDependencyTypes())); - continue; - } - if (!isset($d['rel']) || empty($d['rel'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPREL, - array('index' => $i, 'rels' => PEAR_Common::getDependencyRelations())); - continue; - } - if (!empty($d['optional'])) { - if (!in_array($d['optional'], array('yes', 'no'))) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL, - array('index' => $i, 'opt' => $d['optional'])); - } - } - if ($d['rel'] != 'has' && $d['rel'] != 'not' && empty($d['version'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION, - array('index' => $i)); - } elseif (($d['rel'] == 'has' || $d['rel'] == 'not') && !empty($d['version'])) { - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED, - array('index' => $i, 'rel' => $d['rel'])); - } - if ($d['type'] == 'php' && !empty($d['name'])) { - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED, - array('index' => $i, 'name' => $d['name'])); - } elseif ($d['type'] != 'php' && empty($d['name'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPNAME, - array('index' => $i)); - } - if ($d['type'] == 'php' && empty($d['version'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION, - array('index' => $i)); - } - if (($d['rel'] == 'not') && ($d['type'] == 'php')) { - $this->_validateError(PEAR_PACKAGEFILE_PHP_NO_NOT, - array('index' => $i)); - } - $i++; - } - } - if (!empty($info['configure_options'])) { - $i = 1; - foreach ($info['configure_options'] as $c) { - if (empty($c['name'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFNAME, - array('index' => $i)); - } - if (empty($c['prompt'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT, - array('index' => $i)); - } - $i++; - } - } - if (empty($info['filelist'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILES); - $errors[] = 'no files'; - } else { - foreach ($info['filelist'] as $file => $fa) { - if (empty($fa['role'])) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILEROLE, - array('file' => $file, 'roles' => PEAR_Common::getFileRoles())); - continue; - } elseif (!in_array($fa['role'], PEAR_Common::getFileRoles())) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE, - array('file' => $file, 'role' => $fa['role'], 'roles' => PEAR_Common::getFileRoles())); - } - if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', str_replace('\\', '/', $file))) { - // file contains .. parent directory or . cur directory references - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME, - array('file' => $file)); - } - if (isset($fa['install-as']) && - preg_match('~/\.\.?(/|\\z)|^\.\.?/~', - str_replace('\\', '/', $fa['install-as']))) { - // install-as contains .. parent directory or . cur directory references - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME, - array('file' => $file . ' [installed as ' . $fa['install-as'] . ']')); - } - if (isset($fa['baseinstalldir']) && - preg_match('~/\.\.?(/|\\z)|^\.\.?/~', - str_replace('\\', '/', $fa['baseinstalldir']))) { - // install-as contains .. parent directory or . cur directory references - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME, - array('file' => $file . ' [baseinstalldir ' . $fa['baseinstalldir'] . ']')); - } - } - } - if (isset($this->_registry) && $this->_isValid) { - $chan = $this->_registry->getChannel('pear.php.net'); - if (PEAR::isError($chan)) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $chan->getMessage()); - return $this->_isValid = 0; - } - $validator = $chan->getValidationObject(); - $validator->setPackageFile($this); - $validator->validate($state); - $failures = $validator->getFailures(); - foreach ($failures['errors'] as $error) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $error); - } - foreach ($failures['warnings'] as $warning) { - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $warning); - } - } - if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$nofilechecking) { - if ($this->_analyzePhpFiles()) { - $this->_isValid = true; - } - } - if ($this->_isValid) { - return $this->_isValid = $state; - } - return $this->_isValid = 0; - } - - function _analyzePhpFiles() - { - if (!$this->_isValid) { - return false; - } - if (!isset($this->_packageFile)) { - return false; - } - $dir_prefix = dirname($this->_packageFile); - $common = new PEAR_Common; - $log = isset($this->_logger) ? array(&$this->_logger, 'log') : - array($common, 'log'); - $info = $this->getFilelist(); - foreach ($info as $file => $fa) { - if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND, - array('file' => realpath($dir_prefix) . DIRECTORY_SEPARATOR . $file)); - continue; - } - if ($fa['role'] == 'php' && $dir_prefix) { - call_user_func_array($log, array(1, "Analyzing $file")); - $srcinfo = $this->_analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file); - if ($srcinfo) { - $this->_buildProvidesArray($srcinfo); - } - } - } - $this->_packageName = $pn = $this->getPackage(); - $pnl = strlen($pn); - if (isset($this->_packageInfo['provides'])) { - foreach ((array) $this->_packageInfo['provides'] as $key => $what) { - if (isset($what['explicit'])) { - // skip conformance checks if the provides entry is - // specified in the package.xml file - continue; - } - extract($what); - if ($type == 'class') { - if (!strncasecmp($name, $pn, $pnl)) { - continue; - } - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX, - array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn)); - } elseif ($type == 'function') { - if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) { - continue; - } - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX, - array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn)); - } - } - } - return $this->_isValid; - } - - /** - * Get the default xml generator object - * - * @return PEAR_PackageFile_Generator_v1 - */ - function &getDefaultGenerator() - { - if (!class_exists('PEAR_PackageFile_Generator_v1')) { - require_once 'PEAR/PackageFile/Generator/v1.php'; - } - $a = &new PEAR_PackageFile_Generator_v1($this); - return $a; - } - - /** - * Get the contents of a file listed within the package.xml - * @param string - * @return string - */ - function getFileContents($file) - { - if ($this->_archiveFile == $this->_packageFile) { // unpacked - $dir = dirname($this->_packageFile); - $file = $dir . DIRECTORY_SEPARATOR . $file; - $file = str_replace(array('/', '\\'), - array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file); - if (file_exists($file) && is_readable($file)) { - return implode('', file($file)); - } - } else { // tgz - if (!class_exists('Archive_Tar')) { - require_once 'Archive/Tar.php'; - } - $tar = &new Archive_Tar($this->_archiveFile); - $tar->pushErrorHandling(PEAR_ERROR_RETURN); - if ($file != 'package.xml' && $file != 'package2.xml') { - $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file; - } - $file = $tar->extractInString($file); - $tar->popErrorHandling(); - if (PEAR::isError($file)) { - return PEAR::raiseError("Cannot locate file '$file' in archive"); - } - return $file; - } - } - - // {{{ analyzeSourceCode() - /** - * Analyze the source code of the given PHP file - * - * @param string Filename of the PHP file - * @return mixed - * @access private - */ - function _analyzeSourceCode($file) - { - if (!function_exists("token_get_all")) { - return false; - } - if (!defined('T_DOC_COMMENT')) { - define('T_DOC_COMMENT', T_COMMENT); - } - if (!defined('T_INTERFACE')) { - define('T_INTERFACE', -1); - } - if (!defined('T_IMPLEMENTS')) { - define('T_IMPLEMENTS', -1); - } - if (!$fp = @fopen($file, "r")) { - return false; - } - fclose($fp); - $contents = file_get_contents($file); - $tokens = token_get_all($contents); -/* - for ($i = 0; $i < sizeof($tokens); $i++) { - @list($token, $data) = $tokens[$i]; - if (is_string($token)) { - var_dump($token); - } else { - print token_name($token) . ' '; - var_dump(rtrim($data)); - } - } -*/ - $look_for = 0; - $paren_level = 0; - $bracket_level = 0; - $brace_level = 0; - $lastphpdoc = ''; - $current_class = ''; - $current_interface = ''; - $current_class_level = -1; - $current_function = ''; - $current_function_level = -1; - $declared_classes = array(); - $declared_interfaces = array(); - $declared_functions = array(); - $declared_methods = array(); - $used_classes = array(); - $used_functions = array(); - $extends = array(); - $implements = array(); - $nodeps = array(); - $inquote = false; - $interface = false; - for ($i = 0; $i < sizeof($tokens); $i++) { - if (is_array($tokens[$i])) { - list($token, $data) = $tokens[$i]; - } else { - $token = $tokens[$i]; - $data = ''; - } - if ($inquote) { - if ($token != '"' && $token != T_END_HEREDOC) { - continue; - } else { - $inquote = false; - continue; - } - } - switch ($token) { - case T_WHITESPACE : - continue; - case ';': - if ($interface) { - $current_function = ''; - $current_function_level = -1; - } - break; - case '"': - case T_START_HEREDOC: - $inquote = true; - break; - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - case '{': $brace_level++; continue 2; - case '}': - $brace_level--; - if ($current_class_level == $brace_level) { - $current_class = ''; - $current_class_level = -1; - } - if ($current_function_level == $brace_level) { - $current_function = ''; - $current_function_level = -1; - } - continue 2; - case '[': $bracket_level++; continue 2; - case ']': $bracket_level--; continue 2; - case '(': $paren_level++; continue 2; - case ')': $paren_level--; continue 2; - case T_INTERFACE: - $interface = true; - case T_CLASS: - if (($current_class_level != -1) || ($current_function_level != -1)) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE, - array('file' => $file)); - return false; - } - case T_FUNCTION: - case T_NEW: - case T_EXTENDS: - case T_IMPLEMENTS: - $look_for = $token; - continue 2; - case T_STRING: - if (version_compare(zend_version(), '2.0', '<')) { - if (in_array(strtolower($data), - array('public', 'private', 'protected', 'abstract', - 'interface', 'implements', 'throw') - )) { - $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_PHP5, - array($file)); - } - } - if ($look_for == T_CLASS) { - $current_class = $data; - $current_class_level = $brace_level; - $declared_classes[] = $current_class; - } elseif ($look_for == T_INTERFACE) { - $current_interface = $data; - $current_class_level = $brace_level; - $declared_interfaces[] = $current_interface; - } elseif ($look_for == T_IMPLEMENTS) { - $implements[$current_class] = $data; - } elseif ($look_for == T_EXTENDS) { - $extends[$current_class] = $data; - } elseif ($look_for == T_FUNCTION) { - if ($current_class) { - $current_function = "$current_class::$data"; - $declared_methods[$current_class][] = $data; - } elseif ($current_interface) { - $current_function = "$current_interface::$data"; - $declared_methods[$current_interface][] = $data; - } else { - $current_function = $data; - $declared_functions[] = $current_function; - } - $current_function_level = $brace_level; - $m = array(); - } elseif ($look_for == T_NEW) { - $used_classes[$data] = true; - } - $look_for = 0; - continue 2; - case T_VARIABLE: - $look_for = 0; - continue 2; - case T_DOC_COMMENT: - case T_COMMENT: - if (preg_match('!^/\*\*\s!', $data)) { - $lastphpdoc = $data; - if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) { - $nodeps = array_merge($nodeps, $m[1]); - } - } - continue 2; - case T_DOUBLE_COLON: - if (!($tokens[$i - 1][0] == T_WHITESPACE || $tokens[$i - 1][0] == T_STRING)) { - $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE, - array('file' => $file)); - return false; - } - $class = $tokens[$i - 1][1]; - if (strtolower($class) != 'parent') { - $used_classes[$class] = true; - } - continue 2; - } - } - return array( - "source_file" => $file, - "declared_classes" => $declared_classes, - "declared_interfaces" => $declared_interfaces, - "declared_methods" => $declared_methods, - "declared_functions" => $declared_functions, - "used_classes" => array_diff(array_keys($used_classes), $nodeps), - "inheritance" => $extends, - "implements" => $implements, - ); - } - - /** - * Build a "provides" array from data returned by - * analyzeSourceCode(). The format of the built array is like - * this: - * - * array( - * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), - * ... - * ) - * - * - * @param array $srcinfo array with information about a source file - * as returned by the analyzeSourceCode() method. - * - * @return void - * - * @access private - * - */ - function _buildProvidesArray($srcinfo) - { - if (!$this->_isValid) { - return false; - } - $file = basename($srcinfo['source_file']); - $pn = $this->getPackage(); - $pnl = strlen($pn); - foreach ($srcinfo['declared_classes'] as $class) { - $key = "class;$class"; - if (isset($this->_packageInfo['provides'][$key])) { - continue; - } - $this->_packageInfo['provides'][$key] = - array('file'=> $file, 'type' => 'class', 'name' => $class); - if (isset($srcinfo['inheritance'][$class])) { - $this->_packageInfo['provides'][$key]['extends'] = - $srcinfo['inheritance'][$class]; - } - } - foreach ($srcinfo['declared_methods'] as $class => $methods) { - foreach ($methods as $method) { - $function = "$class::$method"; - $key = "function;$function"; - if ($method{0} == '_' || !strcasecmp($method, $class) || - isset($this->_packageInfo['provides'][$key])) { - continue; - } - $this->_packageInfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - foreach ($srcinfo['declared_functions'] as $function) { - $key = "function;$function"; - if ($function{0} == '_' || isset($this->_packageInfo['provides'][$key])) { - continue; - } - if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) { - $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\""; - } - $this->_packageInfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - // }}} -} -?> diff --git a/3rdparty/PEAR/PackageFile/v2.php b/3rdparty/PEAR/PackageFile/v2.php deleted file mode 100644 index 1ca412dc8c..0000000000 --- a/3rdparty/PEAR/PackageFile/v2.php +++ /dev/null @@ -1,2049 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: v2.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * For error handling - */ -require_once 'PEAR/ErrorStack.php'; -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_PackageFile_v2 -{ - - /** - * Parsed package information - * @var array - * @access private - */ - var $_packageInfo = array(); - - /** - * path to package .tgz or false if this is a local/extracted package.xml - * @var string|false - * @access private - */ - var $_archiveFile; - - /** - * path to package .xml or false if this is an abstract parsed-from-string xml - * @var string|false - * @access private - */ - var $_packageFile; - - /** - * This is used by file analysis routines to log progress information - * @var PEAR_Common - * @access protected - */ - var $_logger; - - /** - * This is set to the highest validation level that has been validated - * - * If the package.xml is invalid or unknown, this is set to 0. If - * normal validation has occurred, this is set to PEAR_VALIDATE_NORMAL. If - * downloading/installation validation has occurred it is set to PEAR_VALIDATE_DOWNLOADING - * or INSTALLING, and so on up to PEAR_VALIDATE_PACKAGING. This allows validation - * "caching" to occur, which is particularly important for package validation, so - * that PHP files are not validated twice - * @var int - * @access private - */ - var $_isValid = 0; - - /** - * True if the filelist has been validated - * @param bool - */ - var $_filesValid = false; - - /** - * @var PEAR_Registry - * @access protected - */ - var $_registry; - - /** - * @var PEAR_Config - * @access protected - */ - var $_config; - - /** - * Optional Dependency group requested for installation - * @var string - * @access private - */ - var $_requestedGroup = false; - - /** - * @var PEAR_ErrorStack - * @access protected - */ - var $_stack; - - /** - * Namespace prefix used for tasks in this package.xml - use tasks: whenever possible - */ - var $_tasksNs; - - /** - * Determines whether this packagefile was initialized only with partial package info - * - * If this package file was constructed via parsing REST, it will only contain - * - * - package name - * - channel name - * - dependencies - * @var boolean - * @access private - */ - var $_incomplete = true; - - /** - * @var PEAR_PackageFile_v2_Validator - */ - var $_v2Validator; - - /** - * The constructor merely sets up the private error stack - */ - function PEAR_PackageFile_v2() - { - $this->_stack = new PEAR_ErrorStack('PEAR_PackageFile_v2', false, null); - $this->_isValid = false; - } - - /** - * To make unit-testing easier - * @param PEAR_Frontend_* - * @param array options - * @param PEAR_Config - * @return PEAR_Downloader - * @access protected - */ - function &getPEARDownloader(&$i, $o, &$c) - { - $z = &new PEAR_Downloader($i, $o, $c); - return $z; - } - - /** - * To make unit-testing easier - * @param PEAR_Config - * @param array options - * @param array package name as returned from {@link PEAR_Registry::parsePackageName()} - * @param int PEAR_VALIDATE_* constant - * @return PEAR_Dependency2 - * @access protected - */ - function &getPEARDependency2(&$c, $o, $p, $s = PEAR_VALIDATE_INSTALLING) - { - if (!class_exists('PEAR_Dependency2')) { - require_once 'PEAR/Dependency2.php'; - } - $z = &new PEAR_Dependency2($c, $o, $p, $s); - return $z; - } - - function getInstalledBinary() - { - return isset($this->_packageInfo['#binarypackage']) ? $this->_packageInfo['#binarypackage'] : - false; - } - - /** - * Installation of source package has failed, attempt to download and install the - * binary version of this package. - * @param PEAR_Installer - * @return array|false - */ - function installBinary(&$installer) - { - if (!OS_WINDOWS) { - $a = false; - return $a; - } - if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { - $releasetype = $this->getPackageType() . 'release'; - if (!is_array($installer->getInstallPackages())) { - $a = false; - return $a; - } - foreach ($installer->getInstallPackages() as $p) { - if ($p->isExtension($this->_packageInfo['providesextension'])) { - if ($p->getPackageType() != 'extsrc' && $p->getPackageType() != 'zendextsrc') { - $a = false; - return $a; // the user probably downloaded it separately - } - } - } - if (isset($this->_packageInfo[$releasetype]['binarypackage'])) { - $installer->log(0, 'Attempting to download binary version of extension "' . - $this->_packageInfo['providesextension'] . '"'); - $params = $this->_packageInfo[$releasetype]['binarypackage']; - if (!is_array($params) || !isset($params[0])) { - $params = array($params); - } - if (isset($this->_packageInfo['channel'])) { - foreach ($params as $i => $param) { - $params[$i] = array('channel' => $this->_packageInfo['channel'], - 'package' => $param, 'version' => $this->getVersion()); - } - } - $dl = &$this->getPEARDownloader($installer->ui, $installer->getOptions(), - $installer->config); - $verbose = $dl->config->get('verbose'); - $dl->config->set('verbose', -1); - foreach ($params as $param) { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $ret = $dl->download(array($param)); - PEAR::popErrorHandling(); - if (is_array($ret) && count($ret)) { - break; - } - } - $dl->config->set('verbose', $verbose); - if (is_array($ret)) { - if (count($ret) == 1) { - $pf = $ret[0]->getPackageFile(); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $err = $installer->install($ret[0]); - PEAR::popErrorHandling(); - if (is_array($err)) { - $this->_packageInfo['#binarypackage'] = $ret[0]->getPackage(); - // "install" self, so all dependencies will work transparently - $this->_registry->addPackage2($this); - $installer->log(0, 'Download and install of binary extension "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pf->getChannel(), - 'package' => $pf->getPackage()), true) . '" successful'); - $a = array($ret[0], $err); - return $a; - } - $installer->log(0, 'Download and install of binary extension "' . - $this->_registry->parsedPackageNameToString( - array('channel' => $pf->getChannel(), - 'package' => $pf->getPackage()), true) . '" failed'); - } - } - } - } - $a = false; - return $a; - } - - /** - * @return string|false Extension name - */ - function getProvidesExtension() - { - if (in_array($this->getPackageType(), - array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { - if (isset($this->_packageInfo['providesextension'])) { - return $this->_packageInfo['providesextension']; - } - } - return false; - } - - /** - * @param string Extension name - * @return bool - */ - function isExtension($extension) - { - if (in_array($this->getPackageType(), - array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { - return $this->_packageInfo['providesextension'] == $extension; - } - return false; - } - - /** - * Tests whether every part of the package.xml 1.0 is represented in - * this package.xml 2.0 - * @param PEAR_PackageFile_v1 - * @return bool - */ - function isEquivalent($pf1) - { - if (!$pf1) { - return true; - } - if ($this->getPackageType() == 'bundle') { - return false; - } - $this->_stack->getErrors(true); - if (!$pf1->validate(PEAR_VALIDATE_NORMAL)) { - return false; - } - $pass = true; - if ($pf1->getPackage() != $this->getPackage()) { - $this->_differentPackage($pf1->getPackage()); - $pass = false; - } - if ($pf1->getVersion() != $this->getVersion()) { - $this->_differentVersion($pf1->getVersion()); - $pass = false; - } - if (trim($pf1->getSummary()) != $this->getSummary()) { - $this->_differentSummary($pf1->getSummary()); - $pass = false; - } - if (preg_replace('/\s+/', '', $pf1->getDescription()) != - preg_replace('/\s+/', '', $this->getDescription())) { - $this->_differentDescription($pf1->getDescription()); - $pass = false; - } - if ($pf1->getState() != $this->getState()) { - $this->_differentState($pf1->getState()); - $pass = false; - } - if (!strstr(preg_replace('/\s+/', '', $this->getNotes()), - preg_replace('/\s+/', '', $pf1->getNotes()))) { - $this->_differentNotes($pf1->getNotes()); - $pass = false; - } - $mymaintainers = $this->getMaintainers(); - $yourmaintainers = $pf1->getMaintainers(); - for ($i1 = 0; $i1 < count($yourmaintainers); $i1++) { - $reset = false; - for ($i2 = 0; $i2 < count($mymaintainers); $i2++) { - if ($mymaintainers[$i2]['handle'] == $yourmaintainers[$i1]['handle']) { - if ($mymaintainers[$i2]['role'] != $yourmaintainers[$i1]['role']) { - $this->_differentRole($mymaintainers[$i2]['handle'], - $yourmaintainers[$i1]['role'], $mymaintainers[$i2]['role']); - $pass = false; - } - if ($mymaintainers[$i2]['email'] != $yourmaintainers[$i1]['email']) { - $this->_differentEmail($mymaintainers[$i2]['handle'], - $yourmaintainers[$i1]['email'], $mymaintainers[$i2]['email']); - $pass = false; - } - if ($mymaintainers[$i2]['name'] != $yourmaintainers[$i1]['name']) { - $this->_differentName($mymaintainers[$i2]['handle'], - $yourmaintainers[$i1]['name'], $mymaintainers[$i2]['name']); - $pass = false; - } - unset($mymaintainers[$i2]); - $mymaintainers = array_values($mymaintainers); - unset($yourmaintainers[$i1]); - $yourmaintainers = array_values($yourmaintainers); - $reset = true; - break; - } - } - if ($reset) { - $i1 = -1; - } - } - $this->_unmatchedMaintainers($mymaintainers, $yourmaintainers); - $filelist = $this->getFilelist(); - foreach ($pf1->getFilelist() as $file => $atts) { - if (!isset($filelist[$file])) { - $this->_missingFile($file); - $pass = false; - } - } - return $pass; - } - - function _differentPackage($package) - { - $this->_stack->push(__FUNCTION__, 'error', array('package' => $package, - 'self' => $this->getPackage()), - 'package.xml 1.0 package "%package%" does not match "%self%"'); - } - - function _differentVersion($version) - { - $this->_stack->push(__FUNCTION__, 'error', array('version' => $version, - 'self' => $this->getVersion()), - 'package.xml 1.0 version "%version%" does not match "%self%"'); - } - - function _differentState($state) - { - $this->_stack->push(__FUNCTION__, 'error', array('state' => $state, - 'self' => $this->getState()), - 'package.xml 1.0 state "%state%" does not match "%self%"'); - } - - function _differentRole($handle, $role, $selfrole) - { - $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle, - 'role' => $role, 'self' => $selfrole), - 'package.xml 1.0 maintainer "%handle%" role "%role%" does not match "%self%"'); - } - - function _differentEmail($handle, $email, $selfemail) - { - $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle, - 'email' => $email, 'self' => $selfemail), - 'package.xml 1.0 maintainer "%handle%" email "%email%" does not match "%self%"'); - } - - function _differentName($handle, $name, $selfname) - { - $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle, - 'name' => $name, 'self' => $selfname), - 'package.xml 1.0 maintainer "%handle%" name "%name%" does not match "%self%"'); - } - - function _unmatchedMaintainers($my, $yours) - { - if ($my) { - array_walk($my, create_function('&$i, $k', '$i = $i["handle"];')); - $this->_stack->push(__FUNCTION__, 'error', array('handles' => $my), - 'package.xml 2.0 has unmatched extra maintainers "%handles%"'); - } - if ($yours) { - array_walk($yours, create_function('&$i, $k', '$i = $i["handle"];')); - $this->_stack->push(__FUNCTION__, 'error', array('handles' => $yours), - 'package.xml 1.0 has unmatched extra maintainers "%handles%"'); - } - } - - function _differentNotes($notes) - { - $truncnotes = strlen($notes) < 25 ? $notes : substr($notes, 0, 24) . '...'; - $truncmynotes = strlen($this->getNotes()) < 25 ? $this->getNotes() : - substr($this->getNotes(), 0, 24) . '...'; - $this->_stack->push(__FUNCTION__, 'error', array('notes' => $truncnotes, - 'self' => $truncmynotes), - 'package.xml 1.0 release notes "%notes%" do not match "%self%"'); - } - - function _differentSummary($summary) - { - $truncsummary = strlen($summary) < 25 ? $summary : substr($summary, 0, 24) . '...'; - $truncmysummary = strlen($this->getsummary()) < 25 ? $this->getSummary() : - substr($this->getsummary(), 0, 24) . '...'; - $this->_stack->push(__FUNCTION__, 'error', array('summary' => $truncsummary, - 'self' => $truncmysummary), - 'package.xml 1.0 summary "%summary%" does not match "%self%"'); - } - - function _differentDescription($description) - { - $truncdescription = trim(strlen($description) < 25 ? $description : substr($description, 0, 24) . '...'); - $truncmydescription = trim(strlen($this->getDescription()) < 25 ? $this->getDescription() : - substr($this->getdescription(), 0, 24) . '...'); - $this->_stack->push(__FUNCTION__, 'error', array('description' => $truncdescription, - 'self' => $truncmydescription), - 'package.xml 1.0 description "%description%" does not match "%self%"'); - } - - function _missingFile($file) - { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'package.xml 1.0 file "%file%" is not present in '); - } - - /** - * WARNING - do not use this function unless you know what you're doing - */ - function setRawState($state) - { - if (!isset($this->_packageInfo['stability'])) { - $this->_packageInfo['stability'] = array(); - } - $this->_packageInfo['stability']['release'] = $state; - } - - /** - * WARNING - do not use this function unless you know what you're doing - */ - function setRawCompatible($compatible) - { - $this->_packageInfo['compatible'] = $compatible; - } - - /** - * WARNING - do not use this function unless you know what you're doing - */ - function setRawPackage($package) - { - $this->_packageInfo['name'] = $package; - } - - /** - * WARNING - do not use this function unless you know what you're doing - */ - function setRawChannel($channel) - { - $this->_packageInfo['channel'] = $channel; - } - - function setRequestedGroup($group) - { - $this->_requestedGroup = $group; - } - - function getRequestedGroup() - { - if (isset($this->_requestedGroup)) { - return $this->_requestedGroup; - } - return false; - } - - /** - * For saving in the registry. - * - * Set the last version that was installed - * @param string - */ - function setLastInstalledVersion($version) - { - $this->_packageInfo['_lastversion'] = $version; - } - - /** - * @return string|false - */ - function getLastInstalledVersion() - { - if (isset($this->_packageInfo['_lastversion'])) { - return $this->_packageInfo['_lastversion']; - } - return false; - } - - /** - * Determines whether this package.xml has post-install scripts or not - * @return array|false - */ - function listPostinstallScripts() - { - $filelist = $this->getFilelist(); - $contents = $this->getContents(); - $contents = $contents['dir']['file']; - if (!is_array($contents) || !isset($contents[0])) { - $contents = array($contents); - } - $taskfiles = array(); - foreach ($contents as $file) { - $atts = $file['attribs']; - unset($file['attribs']); - if (count($file)) { - $taskfiles[$atts['name']] = $file; - } - } - $common = new PEAR_Common; - $common->debug = $this->_config->get('verbose'); - $this->_scripts = array(); - $ret = array(); - foreach ($taskfiles as $name => $tasks) { - if (!isset($filelist[$name])) { - // ignored files will not be in the filelist - continue; - } - $atts = $filelist[$name]; - foreach ($tasks as $tag => $raw) { - $task = $this->getTask($tag); - $task = &new $task($this->_config, $common, PEAR_TASK_INSTALL); - if ($task->isScript()) { - $ret[] = $filelist[$name]['installed_as']; - } - } - } - if (count($ret)) { - return $ret; - } - return false; - } - - /** - * Initialize post-install scripts for running - * - * This method can be used to detect post-install scripts, as the return value - * indicates whether any exist - * @return bool - */ - function initPostinstallScripts() - { - $filelist = $this->getFilelist(); - $contents = $this->getContents(); - $contents = $contents['dir']['file']; - if (!is_array($contents) || !isset($contents[0])) { - $contents = array($contents); - } - $taskfiles = array(); - foreach ($contents as $file) { - $atts = $file['attribs']; - unset($file['attribs']); - if (count($file)) { - $taskfiles[$atts['name']] = $file; - } - } - $common = new PEAR_Common; - $common->debug = $this->_config->get('verbose'); - $this->_scripts = array(); - foreach ($taskfiles as $name => $tasks) { - if (!isset($filelist[$name])) { - // file was not installed due to installconditions - continue; - } - $atts = $filelist[$name]; - foreach ($tasks as $tag => $raw) { - $taskname = $this->getTask($tag); - $task = &new $taskname($this->_config, $common, PEAR_TASK_INSTALL); - if (!$task->isScript()) { - continue; // scripts are only handled after installation - } - $lastversion = isset($this->_packageInfo['_lastversion']) ? - $this->_packageInfo['_lastversion'] : null; - $task->init($raw, $atts, $lastversion); - $res = $task->startSession($this, $atts['installed_as']); - if (!$res) { - continue; // skip this file - } - if (PEAR::isError($res)) { - return $res; - } - $assign = &$task; - $this->_scripts[] = &$assign; - } - } - if (count($this->_scripts)) { - return true; - } - return false; - } - - function runPostinstallScripts() - { - if ($this->initPostinstallScripts()) { - $ui = &PEAR_Frontend::singleton(); - if ($ui) { - $ui->runPostinstallScripts($this->_scripts, $this); - } - } - } - - - /** - * Convert a recursive set of and tags into a single tag with - * tags. - */ - function flattenFilelist() - { - if (isset($this->_packageInfo['bundle'])) { - return; - } - $filelist = array(); - if (isset($this->_packageInfo['contents']['dir']['dir'])) { - $this->_getFlattenedFilelist($filelist, $this->_packageInfo['contents']['dir']); - if (!isset($filelist[1])) { - $filelist = $filelist[0]; - } - $this->_packageInfo['contents']['dir']['file'] = $filelist; - unset($this->_packageInfo['contents']['dir']['dir']); - } else { - // else already flattened but check for baseinstalldir propagation - if (isset($this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'])) { - if (isset($this->_packageInfo['contents']['dir']['file'][0])) { - foreach ($this->_packageInfo['contents']['dir']['file'] as $i => $file) { - if (isset($file['attribs']['baseinstalldir'])) { - continue; - } - $this->_packageInfo['contents']['dir']['file'][$i]['attribs']['baseinstalldir'] - = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir']; - } - } else { - if (!isset($this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir'])) { - $this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir'] - = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir']; - } - } - } - } - } - - /** - * @param array the final flattened file list - * @param array the current directory being processed - * @param string|false any recursively inherited baeinstalldir attribute - * @param string private recursion variable - * @return array - * @access protected - */ - function _getFlattenedFilelist(&$files, $dir, $baseinstall = false, $path = '') - { - if (isset($dir['attribs']) && isset($dir['attribs']['baseinstalldir'])) { - $baseinstall = $dir['attribs']['baseinstalldir']; - } - if (isset($dir['dir'])) { - if (!isset($dir['dir'][0])) { - $dir['dir'] = array($dir['dir']); - } - foreach ($dir['dir'] as $subdir) { - if (!isset($subdir['attribs']) || !isset($subdir['attribs']['name'])) { - $name = '*unknown*'; - } else { - $name = $subdir['attribs']['name']; - } - $newpath = empty($path) ? $name : - $path . '/' . $name; - $this->_getFlattenedFilelist($files, $subdir, - $baseinstall, $newpath); - } - } - if (isset($dir['file'])) { - if (!isset($dir['file'][0])) { - $dir['file'] = array($dir['file']); - } - foreach ($dir['file'] as $file) { - $attrs = $file['attribs']; - $name = $attrs['name']; - if ($baseinstall && !isset($attrs['baseinstalldir'])) { - $attrs['baseinstalldir'] = $baseinstall; - } - $attrs['name'] = empty($path) ? $name : $path . '/' . $name; - $attrs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), - $attrs['name']); - $file['attribs'] = $attrs; - $files[] = $file; - } - } - } - - function setConfig(&$config) - { - $this->_config = &$config; - $this->_registry = &$config->getRegistry(); - } - - function setLogger(&$logger) - { - if (!is_object($logger) || !method_exists($logger, 'log')) { - return PEAR::raiseError('Logger must be compatible with PEAR_Common::log'); - } - $this->_logger = &$logger; - } - - /** - * WARNING - do not use this function directly unless you know what you're doing - */ - function setDeps($deps) - { - $this->_packageInfo['dependencies'] = $deps; - } - - /** - * WARNING - do not use this function directly unless you know what you're doing - */ - function setCompatible($compat) - { - $this->_packageInfo['compatible'] = $compat; - } - - function setPackagefile($file, $archive = false) - { - $this->_packageFile = $file; - $this->_archiveFile = $archive ? $archive : $file; - } - - /** - * Wrapper to {@link PEAR_ErrorStack::getErrors()} - * @param boolean determines whether to purge the error stack after retrieving - * @return array - */ - function getValidationWarnings($purge = true) - { - return $this->_stack->getErrors($purge); - } - - function getPackageFile() - { - return $this->_packageFile; - } - - function getArchiveFile() - { - return $this->_archiveFile; - } - - - /** - * Directly set the array that defines this packagefile - * - * WARNING: no validation. This should only be performed by internal methods - * inside PEAR or by inputting an array saved from an existing PEAR_PackageFile_v2 - * @param array - */ - function fromArray($pinfo) - { - unset($pinfo['old']); - unset($pinfo['xsdversion']); - // If the changelog isn't an array then it was passed in as an empty tag - if (isset($pinfo['changelog']) && !is_array($pinfo['changelog'])) { - unset($pinfo['changelog']); - } - $this->_incomplete = false; - $this->_packageInfo = $pinfo; - } - - function isIncomplete() - { - return $this->_incomplete; - } - - /** - * @return array - */ - function toArray($forreg = false) - { - if (!$this->validate(PEAR_VALIDATE_NORMAL)) { - return false; - } - return $this->getArray($forreg); - } - - function getArray($forReg = false) - { - if ($forReg) { - $arr = $this->_packageInfo; - $arr['old'] = array(); - $arr['old']['version'] = $this->getVersion(); - $arr['old']['release_date'] = $this->getDate(); - $arr['old']['release_state'] = $this->getState(); - $arr['old']['release_license'] = $this->getLicense(); - $arr['old']['release_notes'] = $this->getNotes(); - $arr['old']['release_deps'] = $this->getDeps(); - $arr['old']['maintainers'] = $this->getMaintainers(); - $arr['xsdversion'] = '2.0'; - return $arr; - } else { - $info = $this->_packageInfo; - unset($info['dirtree']); - if (isset($info['_lastversion'])) { - unset($info['_lastversion']); - } - if (isset($info['#binarypackage'])) { - unset($info['#binarypackage']); - } - return $info; - } - } - - function packageInfo($field) - { - $arr = $this->getArray(true); - if ($field == 'state') { - return $arr['stability']['release']; - } - if ($field == 'api-version') { - return $arr['version']['api']; - } - if ($field == 'api-state') { - return $arr['stability']['api']; - } - if (isset($arr['old'][$field])) { - if (!is_string($arr['old'][$field])) { - return null; - } - return $arr['old'][$field]; - } - if (isset($arr[$field])) { - if (!is_string($arr[$field])) { - return null; - } - return $arr[$field]; - } - return null; - } - - function getName() - { - return $this->getPackage(); - } - - function getPackage() - { - if (isset($this->_packageInfo['name'])) { - return $this->_packageInfo['name']; - } - return false; - } - - function getChannel() - { - if (isset($this->_packageInfo['uri'])) { - return '__uri'; - } - if (isset($this->_packageInfo['channel'])) { - return strtolower($this->_packageInfo['channel']); - } - return false; - } - - function getUri() - { - if (isset($this->_packageInfo['uri'])) { - return $this->_packageInfo['uri']; - } - return false; - } - - function getExtends() - { - if (isset($this->_packageInfo['extends'])) { - return $this->_packageInfo['extends']; - } - return false; - } - - function getSummary() - { - if (isset($this->_packageInfo['summary'])) { - return $this->_packageInfo['summary']; - } - return false; - } - - function getDescription() - { - if (isset($this->_packageInfo['description'])) { - return $this->_packageInfo['description']; - } - return false; - } - - function getMaintainers($raw = false) - { - if (!isset($this->_packageInfo['lead'])) { - return false; - } - if ($raw) { - $ret = array('lead' => $this->_packageInfo['lead']); - (isset($this->_packageInfo['developer'])) ? - $ret['developer'] = $this->_packageInfo['developer'] :null; - (isset($this->_packageInfo['contributor'])) ? - $ret['contributor'] = $this->_packageInfo['contributor'] :null; - (isset($this->_packageInfo['helper'])) ? - $ret['helper'] = $this->_packageInfo['helper'] :null; - return $ret; - } else { - $ret = array(); - $leads = isset($this->_packageInfo['lead'][0]) ? $this->_packageInfo['lead'] : - array($this->_packageInfo['lead']); - foreach ($leads as $lead) { - $s = $lead; - $s['handle'] = $s['user']; - unset($s['user']); - $s['role'] = 'lead'; - $ret[] = $s; - } - if (isset($this->_packageInfo['developer'])) { - $leads = isset($this->_packageInfo['developer'][0]) ? - $this->_packageInfo['developer'] : - array($this->_packageInfo['developer']); - foreach ($leads as $maintainer) { - $s = $maintainer; - $s['handle'] = $s['user']; - unset($s['user']); - $s['role'] = 'developer'; - $ret[] = $s; - } - } - if (isset($this->_packageInfo['contributor'])) { - $leads = isset($this->_packageInfo['contributor'][0]) ? - $this->_packageInfo['contributor'] : - array($this->_packageInfo['contributor']); - foreach ($leads as $maintainer) { - $s = $maintainer; - $s['handle'] = $s['user']; - unset($s['user']); - $s['role'] = 'contributor'; - $ret[] = $s; - } - } - if (isset($this->_packageInfo['helper'])) { - $leads = isset($this->_packageInfo['helper'][0]) ? - $this->_packageInfo['helper'] : - array($this->_packageInfo['helper']); - foreach ($leads as $maintainer) { - $s = $maintainer; - $s['handle'] = $s['user']; - unset($s['user']); - $s['role'] = 'helper'; - $ret[] = $s; - } - } - return $ret; - } - return false; - } - - function getLeads() - { - if (isset($this->_packageInfo['lead'])) { - return $this->_packageInfo['lead']; - } - return false; - } - - function getDevelopers() - { - if (isset($this->_packageInfo['developer'])) { - return $this->_packageInfo['developer']; - } - return false; - } - - function getContributors() - { - if (isset($this->_packageInfo['contributor'])) { - return $this->_packageInfo['contributor']; - } - return false; - } - - function getHelpers() - { - if (isset($this->_packageInfo['helper'])) { - return $this->_packageInfo['helper']; - } - return false; - } - - function setDate($date) - { - if (!isset($this->_packageInfo['date'])) { - // ensure that the extends tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', - 'zendextbinrelease', 'bundle', 'changelog'), array(), 'date'); - } - $this->_packageInfo['date'] = $date; - $this->_isValid = 0; - } - - function setTime($time) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['time'])) { - // ensure that the time tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', - 'zendextbinrelease', 'bundle', 'changelog'), $time, 'time'); - } - $this->_packageInfo['time'] = $time; - } - - function getDate() - { - if (isset($this->_packageInfo['date'])) { - return $this->_packageInfo['date']; - } - return false; - } - - function getTime() - { - if (isset($this->_packageInfo['time'])) { - return $this->_packageInfo['time']; - } - return false; - } - - /** - * @param package|api version category to return - */ - function getVersion($key = 'release') - { - if (isset($this->_packageInfo['version'][$key])) { - return $this->_packageInfo['version'][$key]; - } - return false; - } - - function getStability() - { - if (isset($this->_packageInfo['stability'])) { - return $this->_packageInfo['stability']; - } - return false; - } - - function getState($key = 'release') - { - if (isset($this->_packageInfo['stability'][$key])) { - return $this->_packageInfo['stability'][$key]; - } - return false; - } - - function getLicense($raw = false) - { - if (isset($this->_packageInfo['license'])) { - if ($raw) { - return $this->_packageInfo['license']; - } - if (is_array($this->_packageInfo['license'])) { - return $this->_packageInfo['license']['_content']; - } else { - return $this->_packageInfo['license']; - } - } - return false; - } - - function getLicenseLocation() - { - if (!isset($this->_packageInfo['license']) || !is_array($this->_packageInfo['license'])) { - return false; - } - return $this->_packageInfo['license']['attribs']; - } - - function getNotes() - { - if (isset($this->_packageInfo['notes'])) { - return $this->_packageInfo['notes']; - } - return false; - } - - /** - * Return the tag contents, if any - * @return array|false - */ - function getUsesrole() - { - if (isset($this->_packageInfo['usesrole'])) { - return $this->_packageInfo['usesrole']; - } - return false; - } - - /** - * Return the tag contents, if any - * @return array|false - */ - function getUsestask() - { - if (isset($this->_packageInfo['usestask'])) { - return $this->_packageInfo['usestask']; - } - return false; - } - - /** - * This should only be used to retrieve filenames and install attributes - */ - function getFilelist($preserve = false) - { - if (isset($this->_packageInfo['filelist']) && !$preserve) { - return $this->_packageInfo['filelist']; - } - $this->flattenFilelist(); - if ($contents = $this->getContents()) { - $ret = array(); - if (!isset($contents['dir'])) { - return false; - } - if (!isset($contents['dir']['file'][0])) { - $contents['dir']['file'] = array($contents['dir']['file']); - } - foreach ($contents['dir']['file'] as $file) { - $name = $file['attribs']['name']; - if (!$preserve) { - $file = $file['attribs']; - } - $ret[$name] = $file; - } - if (!$preserve) { - $this->_packageInfo['filelist'] = $ret; - } - return $ret; - } - return false; - } - - /** - * Return configure options array, if any - * - * @return array|false - */ - function getConfigureOptions() - { - if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { - return false; - } - - $releases = $this->getReleases(); - if (isset($releases[0])) { - $releases = $releases[0]; - } - - if (isset($releases['configureoption'])) { - if (!isset($releases['configureoption'][0])) { - $releases['configureoption'] = array($releases['configureoption']); - } - - for ($i = 0; $i < count($releases['configureoption']); $i++) { - $releases['configureoption'][$i] = $releases['configureoption'][$i]['attribs']; - } - - return $releases['configureoption']; - } - - return false; - } - - /** - * This is only used at install-time, after all serialization - * is over. - */ - function resetFilelist() - { - $this->_packageInfo['filelist'] = array(); - } - - /** - * Retrieve a list of files that should be installed on this computer - * @return array - */ - function getInstallationFilelist($forfilecheck = false) - { - $contents = $this->getFilelist(true); - if (isset($contents['dir']['attribs']['baseinstalldir'])) { - $base = $contents['dir']['attribs']['baseinstalldir']; - } - if (isset($this->_packageInfo['bundle'])) { - return PEAR::raiseError( - 'Exception: bundles should be handled in download code only'); - } - $release = $this->getReleases(); - if ($release) { - if (!isset($release[0])) { - if (!isset($release['installconditions']) && !isset($release['filelist'])) { - if ($forfilecheck) { - return $this->getFilelist(); - } - return $contents; - } - $release = array($release); - } - $depchecker = &$this->getPEARDependency2($this->_config, array(), - array('channel' => $this->getChannel(), 'package' => $this->getPackage()), - PEAR_VALIDATE_INSTALLING); - foreach ($release as $instance) { - if (isset($instance['installconditions'])) { - $installconditions = $instance['installconditions']; - if (is_array($installconditions)) { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - foreach ($installconditions as $type => $conditions) { - if (!isset($conditions[0])) { - $conditions = array($conditions); - } - foreach ($conditions as $condition) { - $ret = $depchecker->{"validate{$type}Dependency"}($condition); - if (PEAR::isError($ret)) { - PEAR::popErrorHandling(); - continue 3; // skip this release - } - } - } - PEAR::popErrorHandling(); - } - } - // this is the release to use - if (isset($instance['filelist'])) { - // ignore files - if (isset($instance['filelist']['ignore'])) { - $ignore = isset($instance['filelist']['ignore'][0]) ? - $instance['filelist']['ignore'] : - array($instance['filelist']['ignore']); - foreach ($ignore as $ig) { - unset ($contents[$ig['attribs']['name']]); - } - } - // install files as this name - if (isset($instance['filelist']['install'])) { - $installas = isset($instance['filelist']['install'][0]) ? - $instance['filelist']['install'] : - array($instance['filelist']['install']); - foreach ($installas as $as) { - $contents[$as['attribs']['name']]['attribs']['install-as'] = - $as['attribs']['as']; - } - } - } - if ($forfilecheck) { - foreach ($contents as $file => $attrs) { - $contents[$file] = $attrs['attribs']; - } - } - return $contents; - } - } else { // simple release - no installconditions or install-as - if ($forfilecheck) { - return $this->getFilelist(); - } - return $contents; - } - // no releases matched - return PEAR::raiseError('No releases in package.xml matched the existing operating ' . - 'system, extensions installed, or architecture, cannot install'); - } - - /** - * This is only used at install-time, after all serialization - * is over. - * @param string file name - * @param string installed path - */ - function setInstalledAs($file, $path) - { - if ($path) { - return $this->_packageInfo['filelist'][$file]['installed_as'] = $path; - } - unset($this->_packageInfo['filelist'][$file]['installed_as']); - } - - function getInstalledLocation($file) - { - if (isset($this->_packageInfo['filelist'][$file]['installed_as'])) { - return $this->_packageInfo['filelist'][$file]['installed_as']; - } - return false; - } - - /** - * This is only used at install-time, after all serialization - * is over. - */ - function installedFile($file, $atts) - { - if (isset($this->_packageInfo['filelist'][$file])) { - $this->_packageInfo['filelist'][$file] = - array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']); - } else { - $this->_packageInfo['filelist'][$file] = $atts['attribs']; - } - } - - /** - * Retrieve the contents tag - */ - function getContents() - { - if (isset($this->_packageInfo['contents'])) { - return $this->_packageInfo['contents']; - } - return false; - } - - /** - * @param string full path to file - * @param string attribute name - * @param string attribute value - * @param int risky but fast - use this to choose a file based on its position in the list - * of files. Index is zero-based like PHP arrays. - * @return bool success of operation - */ - function setFileAttribute($filename, $attr, $value, $index = false) - { - $this->_isValid = 0; - if (in_array($attr, array('role', 'name', 'baseinstalldir'))) { - $this->_filesValid = false; - } - if ($index !== false && - isset($this->_packageInfo['contents']['dir']['file'][$index]['attribs'])) { - $this->_packageInfo['contents']['dir']['file'][$index]['attribs'][$attr] = $value; - return true; - } - if (!isset($this->_packageInfo['contents']['dir']['file'])) { - return false; - } - $files = $this->_packageInfo['contents']['dir']['file']; - if (!isset($files[0])) { - $files = array($files); - $ind = false; - } else { - $ind = true; - } - foreach ($files as $i => $file) { - if (isset($file['attribs'])) { - if ($file['attribs']['name'] == $filename) { - if ($ind) { - $this->_packageInfo['contents']['dir']['file'][$i]['attribs'][$attr] = $value; - } else { - $this->_packageInfo['contents']['dir']['file']['attribs'][$attr] = $value; - } - return true; - } - } - } - return false; - } - - function setDirtree($path) - { - if (!isset($this->_packageInfo['dirtree'])) { - $this->_packageInfo['dirtree'] = array(); - } - $this->_packageInfo['dirtree'][$path] = true; - } - - function getDirtree() - { - if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) { - return $this->_packageInfo['dirtree']; - } - return false; - } - - function resetDirtree() - { - unset($this->_packageInfo['dirtree']); - } - - /** - * Determines whether this package claims it is compatible with the version of - * the package that has a recommended version dependency - * @param PEAR_PackageFile_v2|PEAR_PackageFile_v1|PEAR_Downloader_Package - * @return boolean - */ - function isCompatible($pf) - { - if (!isset($this->_packageInfo['compatible'])) { - return false; - } - if (!isset($this->_packageInfo['channel'])) { - return false; - } - $me = $pf->getVersion(); - $compatible = $this->_packageInfo['compatible']; - if (!isset($compatible[0])) { - $compatible = array($compatible); - } - $found = false; - foreach ($compatible as $info) { - if (strtolower($info['name']) == strtolower($pf->getPackage())) { - if (strtolower($info['channel']) == strtolower($pf->getChannel())) { - $found = true; - break; - } - } - } - if (!$found) { - return false; - } - if (isset($info['exclude'])) { - if (!isset($info['exclude'][0])) { - $info['exclude'] = array($info['exclude']); - } - foreach ($info['exclude'] as $exclude) { - if (version_compare($me, $exclude, '==')) { - return false; - } - } - } - if (version_compare($me, $info['min'], '>=') && version_compare($me, $info['max'], '<=')) { - return true; - } - return false; - } - - /** - * @return array|false - */ - function getCompatible() - { - if (isset($this->_packageInfo['compatible'])) { - return $this->_packageInfo['compatible']; - } - return false; - } - - function getDependencies() - { - if (isset($this->_packageInfo['dependencies'])) { - return $this->_packageInfo['dependencies']; - } - return false; - } - - function isSubpackageOf($p) - { - return $p->isSubpackage($this); - } - - /** - * Determines whether the passed in package is a subpackage of this package. - * - * No version checking is done, only name verification. - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @return bool - */ - function isSubpackage($p) - { - $sub = array(); - if (isset($this->_packageInfo['dependencies']['required']['subpackage'])) { - $sub = $this->_packageInfo['dependencies']['required']['subpackage']; - if (!isset($sub[0])) { - $sub = array($sub); - } - } - if (isset($this->_packageInfo['dependencies']['optional']['subpackage'])) { - $sub1 = $this->_packageInfo['dependencies']['optional']['subpackage']; - if (!isset($sub1[0])) { - $sub1 = array($sub1); - } - $sub = array_merge($sub, $sub1); - } - if (isset($this->_packageInfo['dependencies']['group'])) { - $group = $this->_packageInfo['dependencies']['group']; - if (!isset($group[0])) { - $group = array($group); - } - foreach ($group as $deps) { - if (isset($deps['subpackage'])) { - $sub2 = $deps['subpackage']; - if (!isset($sub2[0])) { - $sub2 = array($sub2); - } - $sub = array_merge($sub, $sub2); - } - } - } - foreach ($sub as $dep) { - if (strtolower($dep['name']) == strtolower($p->getPackage())) { - if (isset($dep['channel'])) { - if (strtolower($dep['channel']) == strtolower($p->getChannel())) { - return true; - } - } else { - if ($dep['uri'] == $p->getURI()) { - return true; - } - } - } - } - return false; - } - - function dependsOn($package, $channel) - { - if (!($deps = $this->getDependencies())) { - return false; - } - foreach (array('package', 'subpackage') as $type) { - foreach (array('required', 'optional') as $needed) { - if (isset($deps[$needed][$type])) { - if (!isset($deps[$needed][$type][0])) { - $deps[$needed][$type] = array($deps[$needed][$type]); - } - foreach ($deps[$needed][$type] as $dep) { - $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri'; - if (strtolower($dep['name']) == strtolower($package) && - $depchannel == $channel) { - return true; - } - } - } - } - if (isset($deps['group'])) { - if (!isset($deps['group'][0])) { - $dep['group'] = array($deps['group']); - } - foreach ($deps['group'] as $group) { - if (isset($group[$type])) { - if (!is_array($group[$type])) { - $group[$type] = array($group[$type]); - } - foreach ($group[$type] as $dep) { - $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri'; - if (strtolower($dep['name']) == strtolower($package) && - $depchannel == $channel) { - return true; - } - } - } - } - } - } - return false; - } - - /** - * Get the contents of a dependency group - * @param string - * @return array|false - */ - function getDependencyGroup($name) - { - $name = strtolower($name); - if (!isset($this->_packageInfo['dependencies']['group'])) { - return false; - } - $groups = $this->_packageInfo['dependencies']['group']; - if (!isset($groups[0])) { - $groups = array($groups); - } - foreach ($groups as $group) { - if (strtolower($group['attribs']['name']) == $name) { - return $group; - } - } - return false; - } - - /** - * Retrieve a partial package.xml 1.0 representation of dependencies - * - * a very limited representation of dependencies is returned by this method. - * The tag for excluding certain versions of a dependency is - * completely ignored. In addition, dependency groups are ignored, with the - * assumption that all dependencies in dependency groups are also listed in - * the optional group that work with all dependency groups - * @param boolean return package.xml 2.0 tag - * @return array|false - */ - function getDeps($raw = false, $nopearinstaller = false) - { - if (isset($this->_packageInfo['dependencies'])) { - if ($raw) { - return $this->_packageInfo['dependencies']; - } - $ret = array(); - $map = array( - 'php' => 'php', - 'package' => 'pkg', - 'subpackage' => 'pkg', - 'extension' => 'ext', - 'os' => 'os', - 'pearinstaller' => 'pkg', - ); - foreach (array('required', 'optional') as $type) { - $optional = ($type == 'optional') ? 'yes' : 'no'; - if (!isset($this->_packageInfo['dependencies'][$type]) - || empty($this->_packageInfo['dependencies'][$type])) { - continue; - } - foreach ($this->_packageInfo['dependencies'][$type] as $dtype => $deps) { - if ($dtype == 'pearinstaller' && $nopearinstaller) { - continue; - } - if (!isset($deps[0])) { - $deps = array($deps); - } - foreach ($deps as $dep) { - if (!isset($map[$dtype])) { - // no support for arch type - continue; - } - if ($dtype == 'pearinstaller') { - $dep['name'] = 'PEAR'; - $dep['channel'] = 'pear.php.net'; - } - $s = array('type' => $map[$dtype]); - if (isset($dep['channel'])) { - $s['channel'] = $dep['channel']; - } - if (isset($dep['uri'])) { - $s['uri'] = $dep['uri']; - } - if (isset($dep['name'])) { - $s['name'] = $dep['name']; - } - if (isset($dep['conflicts'])) { - $s['rel'] = 'not'; - } else { - if (!isset($dep['min']) && - !isset($dep['max'])) { - $s['rel'] = 'has'; - $s['optional'] = $optional; - } elseif (isset($dep['min']) && - isset($dep['max'])) { - $s['rel'] = 'ge'; - $s1 = $s; - $s1['rel'] = 'le'; - $s['version'] = $dep['min']; - $s1['version'] = $dep['max']; - if (isset($dep['channel'])) { - $s1['channel'] = $dep['channel']; - } - if ($dtype != 'php') { - $s['name'] = $dep['name']; - $s1['name'] = $dep['name']; - } - $s['optional'] = $optional; - $s1['optional'] = $optional; - $ret[] = $s1; - } elseif (isset($dep['min'])) { - if (isset($dep['exclude']) && - $dep['exclude'] == $dep['min']) { - $s['rel'] = 'gt'; - } else { - $s['rel'] = 'ge'; - } - $s['version'] = $dep['min']; - $s['optional'] = $optional; - if ($dtype != 'php') { - $s['name'] = $dep['name']; - } - } elseif (isset($dep['max'])) { - if (isset($dep['exclude']) && - $dep['exclude'] == $dep['max']) { - $s['rel'] = 'lt'; - } else { - $s['rel'] = 'le'; - } - $s['version'] = $dep['max']; - $s['optional'] = $optional; - if ($dtype != 'php') { - $s['name'] = $dep['name']; - } - } - } - $ret[] = $s; - } - } - } - if (count($ret)) { - return $ret; - } - } - return false; - } - - /** - * @return php|extsrc|extbin|zendextsrc|zendextbin|bundle|false - */ - function getPackageType() - { - if (isset($this->_packageInfo['phprelease'])) { - return 'php'; - } - if (isset($this->_packageInfo['extsrcrelease'])) { - return 'extsrc'; - } - if (isset($this->_packageInfo['extbinrelease'])) { - return 'extbin'; - } - if (isset($this->_packageInfo['zendextsrcrelease'])) { - return 'zendextsrc'; - } - if (isset($this->_packageInfo['zendextbinrelease'])) { - return 'zendextbin'; - } - if (isset($this->_packageInfo['bundle'])) { - return 'bundle'; - } - return false; - } - - /** - * @return array|false - */ - function getReleases() - { - $type = $this->getPackageType(); - if ($type != 'bundle') { - $type .= 'release'; - } - if ($this->getPackageType() && isset($this->_packageInfo[$type])) { - return $this->_packageInfo[$type]; - } - return false; - } - - /** - * @return array - */ - function getChangelog() - { - if (isset($this->_packageInfo['changelog'])) { - return $this->_packageInfo['changelog']; - } - return false; - } - - function hasDeps() - { - return isset($this->_packageInfo['dependencies']); - } - - function getPackagexmlVersion() - { - if (isset($this->_packageInfo['zendextsrcrelease'])) { - return '2.1'; - } - if (isset($this->_packageInfo['zendextbinrelease'])) { - return '2.1'; - } - return '2.0'; - } - - /** - * @return array|false - */ - function getSourcePackage() - { - if (isset($this->_packageInfo['extbinrelease']) || - isset($this->_packageInfo['zendextbinrelease'])) { - return array('channel' => $this->_packageInfo['srcchannel'], - 'package' => $this->_packageInfo['srcpackage']); - } - return false; - } - - function getBundledPackages() - { - if (isset($this->_packageInfo['bundle'])) { - return $this->_packageInfo['contents']['bundledpackage']; - } - return false; - } - - function getLastModified() - { - if (isset($this->_packageInfo['_lastmodified'])) { - return $this->_packageInfo['_lastmodified']; - } - return false; - } - - /** - * Get the contents of a file listed within the package.xml - * @param string - * @return string - */ - function getFileContents($file) - { - if ($this->_archiveFile == $this->_packageFile) { // unpacked - $dir = dirname($this->_packageFile); - $file = $dir . DIRECTORY_SEPARATOR . $file; - $file = str_replace(array('/', '\\'), - array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file); - if (file_exists($file) && is_readable($file)) { - return implode('', file($file)); - } - } else { // tgz - $tar = &new Archive_Tar($this->_archiveFile); - $tar->pushErrorHandling(PEAR_ERROR_RETURN); - if ($file != 'package.xml' && $file != 'package2.xml') { - $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file; - } - $file = $tar->extractInString($file); - $tar->popErrorHandling(); - if (PEAR::isError($file)) { - return PEAR::raiseError("Cannot locate file '$file' in archive"); - } - return $file; - } - } - - function &getRW() - { - if (!class_exists('PEAR_PackageFile_v2_rw')) { - require_once 'PEAR/PackageFile/v2/rw.php'; - } - $a = new PEAR_PackageFile_v2_rw; - foreach (get_object_vars($this) as $name => $unused) { - if (!isset($this->$name)) { - continue; - } - if ($name == '_config' || $name == '_logger'|| $name == '_registry' || - $name == '_stack') { - $a->$name = &$this->$name; - } else { - $a->$name = $this->$name; - } - } - return $a; - } - - function &getDefaultGenerator() - { - if (!class_exists('PEAR_PackageFile_Generator_v2')) { - require_once 'PEAR/PackageFile/Generator/v2.php'; - } - $a = &new PEAR_PackageFile_Generator_v2($this); - return $a; - } - - function analyzeSourceCode($file, $string = false) - { - if (!isset($this->_v2Validator) || - !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) { - if (!class_exists('PEAR_PackageFile_v2_Validator')) { - require_once 'PEAR/PackageFile/v2/Validator.php'; - } - $this->_v2Validator = new PEAR_PackageFile_v2_Validator; - } - return $this->_v2Validator->analyzeSourceCode($file, $string); - } - - function validate($state = PEAR_VALIDATE_NORMAL) - { - if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) { - return false; - } - if (!isset($this->_v2Validator) || - !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) { - if (!class_exists('PEAR_PackageFile_v2_Validator')) { - require_once 'PEAR/PackageFile/v2/Validator.php'; - } - $this->_v2Validator = new PEAR_PackageFile_v2_Validator; - } - if (isset($this->_packageInfo['xsdversion'])) { - unset($this->_packageInfo['xsdversion']); - } - return $this->_v2Validator->validate($this, $state); - } - - function getTasksNs() - { - if (!isset($this->_tasksNs)) { - if (isset($this->_packageInfo['attribs'])) { - foreach ($this->_packageInfo['attribs'] as $name => $value) { - if ($value == 'http://pear.php.net/dtd/tasks-1.0') { - $this->_tasksNs = str_replace('xmlns:', '', $name); - break; - } - } - } - } - return $this->_tasksNs; - } - - /** - * Determine whether a task name is a valid task. Custom tasks may be defined - * using subdirectories by putting a "-" in the name, as in - * - * Note that this method will auto-load the task class file and test for the existence - * of the name with "-" replaced by "_" as in PEAR/Task/mycustom/task.php makes class - * PEAR_Task_mycustom_task - * @param string - * @return boolean - */ - function getTask($task) - { - $this->getTasksNs(); - // transform all '-' to '/' and 'tasks:' to '' so tasks:replace becomes replace - $task = str_replace(array($this->_tasksNs . ':', '-'), array('', ' '), $task); - $taskfile = str_replace(' ', '/', ucwords($task)); - $task = str_replace(array(' ', '/'), '_', ucwords($task)); - if (class_exists("PEAR_Task_$task")) { - return "PEAR_Task_$task"; - } - $fp = @fopen("PEAR/Task/$taskfile.php", 'r', true); - if ($fp) { - fclose($fp); - require_once "PEAR/Task/$taskfile.php"; - return "PEAR_Task_$task"; - } - return false; - } - - /** - * Key-friendly array_splice - * @param tagname to splice a value in before - * @param mixed the value to splice in - * @param string the new tag name - */ - function _ksplice($array, $key, $value, $newkey) - { - $offset = array_search($key, array_keys($array)); - $after = array_slice($array, $offset); - $before = array_slice($array, 0, $offset); - $before[$newkey] = $value; - return array_merge($before, $after); - } - - /** - * @param array a list of possible keys, in the order they may occur - * @param mixed contents of the new package.xml tag - * @param string tag name - * @access private - */ - function _insertBefore($array, $keys, $contents, $newkey) - { - foreach ($keys as $key) { - if (isset($array[$key])) { - return $array = $this->_ksplice($array, $key, $contents, $newkey); - } - } - $array[$newkey] = $contents; - return $array; - } - - /** - * @param subsection of {@link $_packageInfo} - * @param array|string tag contents - * @param array format: - *
    -     * array(
    -     *   tagname => array(list of tag names that follow this one),
    -     *   childtagname => array(list of child tag names that follow this one),
    -     * )
    -     * 
    - * - * This allows construction of nested tags - * @access private - */ - function _mergeTag($manip, $contents, $order) - { - if (count($order)) { - foreach ($order as $tag => $curorder) { - if (!isset($manip[$tag])) { - // ensure that the tag is set up - $manip = $this->_insertBefore($manip, $curorder, array(), $tag); - } - if (count($order) > 1) { - $manip[$tag] = $this->_mergeTag($manip[$tag], $contents, array_slice($order, 1)); - return $manip; - } - } - } else { - return $manip; - } - if (is_array($manip[$tag]) && !empty($manip[$tag]) && isset($manip[$tag][0])) { - $manip[$tag][] = $contents; - } else { - if (!count($manip[$tag])) { - $manip[$tag] = $contents; - } else { - $manip[$tag] = array($manip[$tag]); - $manip[$tag][] = $contents; - } - } - return $manip; - } -} -?> diff --git a/3rdparty/PEAR/PackageFile/v2/Validator.php b/3rdparty/PEAR/PackageFile/v2/Validator.php deleted file mode 100644 index 33c8eee387..0000000000 --- a/3rdparty/PEAR/PackageFile/v2/Validator.php +++ /dev/null @@ -1,2154 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Validator.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a8 - */ -/** - * Private validation class used by PEAR_PackageFile_v2 - do not use directly, its - * sole purpose is to split up the PEAR/PackageFile/v2.php file to make it smaller - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a8 - * @access private - */ -class PEAR_PackageFile_v2_Validator -{ - /** - * @var array - */ - var $_packageInfo; - /** - * @var PEAR_PackageFile_v2 - */ - var $_pf; - /** - * @var PEAR_ErrorStack - */ - var $_stack; - /** - * @var int - */ - var $_isValid = 0; - /** - * @var int - */ - var $_filesValid = 0; - /** - * @var int - */ - var $_curState = 0; - /** - * @param PEAR_PackageFile_v2 - * @param int - */ - function validate(&$pf, $state = PEAR_VALIDATE_NORMAL) - { - $this->_pf = &$pf; - $this->_curState = $state; - $this->_packageInfo = $this->_pf->getArray(); - $this->_isValid = $this->_pf->_isValid; - $this->_filesValid = $this->_pf->_filesValid; - $this->_stack = &$pf->_stack; - $this->_stack->getErrors(true); - if (($this->_isValid & $state) == $state) { - return true; - } - if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) { - return false; - } - if (!isset($this->_packageInfo['attribs']['version']) || - ($this->_packageInfo['attribs']['version'] != '2.0' && - $this->_packageInfo['attribs']['version'] != '2.1') - ) { - $this->_noPackageVersion(); - } - $structure = - array( - 'name', - 'channel|uri', - '*extends', // can't be multiple, but this works fine - 'summary', - 'description', - '+lead', // these all need content checks - '*developer', - '*contributor', - '*helper', - 'date', - '*time', - 'version', - 'stability', - 'license->?uri->?filesource', - 'notes', - 'contents', //special validation needed - '*compatible', - 'dependencies', //special validation needed - '*usesrole', - '*usestask', // reserve these for 1.4.0a1 to implement - // this will allow a package.xml to gracefully say it - // needs a certain package installed in order to implement a role or task - '*providesextension', - '*srcpackage|*srcuri', - '+phprelease|+extsrcrelease|+extbinrelease|' . - '+zendextsrcrelease|+zendextbinrelease|bundle', //special validation needed - '*changelog', - ); - $test = $this->_packageInfo; - if (isset($test['dependencies']) && - isset($test['dependencies']['required']) && - isset($test['dependencies']['required']['pearinstaller']) && - isset($test['dependencies']['required']['pearinstaller']['min']) && - version_compare('1.9.4', - $test['dependencies']['required']['pearinstaller']['min'], '<') - ) { - $this->_pearVersionTooLow($test['dependencies']['required']['pearinstaller']['min']); - return false; - } - // ignore post-installation array fields - if (array_key_exists('filelist', $test)) { - unset($test['filelist']); - } - if (array_key_exists('_lastmodified', $test)) { - unset($test['_lastmodified']); - } - if (array_key_exists('#binarypackage', $test)) { - unset($test['#binarypackage']); - } - if (array_key_exists('old', $test)) { - unset($test['old']); - } - if (array_key_exists('_lastversion', $test)) { - unset($test['_lastversion']); - } - if (!$this->_stupidSchemaValidate($structure, $test, '')) { - return false; - } - if (empty($this->_packageInfo['name'])) { - $this->_tagCannotBeEmpty('name'); - } - $test = isset($this->_packageInfo['uri']) ? 'uri' :'channel'; - if (empty($this->_packageInfo[$test])) { - $this->_tagCannotBeEmpty($test); - } - if (is_array($this->_packageInfo['license']) && - (!isset($this->_packageInfo['license']['_content']) || - empty($this->_packageInfo['license']['_content']))) { - $this->_tagCannotBeEmpty('license'); - } elseif (empty($this->_packageInfo['license'])) { - $this->_tagCannotBeEmpty('license'); - } - if (empty($this->_packageInfo['summary'])) { - $this->_tagCannotBeEmpty('summary'); - } - if (empty($this->_packageInfo['description'])) { - $this->_tagCannotBeEmpty('description'); - } - if (empty($this->_packageInfo['date'])) { - $this->_tagCannotBeEmpty('date'); - } - if (empty($this->_packageInfo['notes'])) { - $this->_tagCannotBeEmpty('notes'); - } - if (isset($this->_packageInfo['time']) && empty($this->_packageInfo['time'])) { - $this->_tagCannotBeEmpty('time'); - } - if (isset($this->_packageInfo['dependencies'])) { - $this->_validateDependencies(); - } - if (isset($this->_packageInfo['compatible'])) { - $this->_validateCompatible(); - } - if (!isset($this->_packageInfo['bundle'])) { - if (empty($this->_packageInfo['contents'])) { - $this->_tagCannotBeEmpty('contents'); - } - if (!isset($this->_packageInfo['contents']['dir'])) { - $this->_filelistMustContainDir('contents'); - return false; - } - if (isset($this->_packageInfo['contents']['file'])) { - $this->_filelistCannotContainFile('contents'); - return false; - } - } - $this->_validateMaintainers(); - $this->_validateStabilityVersion(); - $fail = false; - if (array_key_exists('usesrole', $this->_packageInfo)) { - $roles = $this->_packageInfo['usesrole']; - if (!is_array($roles) || !isset($roles[0])) { - $roles = array($roles); - } - foreach ($roles as $role) { - if (!isset($role['role'])) { - $this->_usesroletaskMustHaveRoleTask('usesrole', 'role'); - $fail = true; - } else { - if (!isset($role['channel'])) { - if (!isset($role['uri'])) { - $this->_usesroletaskMustHaveChannelOrUri($role['role'], 'usesrole'); - $fail = true; - } - } elseif (!isset($role['package'])) { - $this->_usesroletaskMustHavePackage($role['role'], 'usesrole'); - $fail = true; - } - } - } - } - if (array_key_exists('usestask', $this->_packageInfo)) { - $roles = $this->_packageInfo['usestask']; - if (!is_array($roles) || !isset($roles[0])) { - $roles = array($roles); - } - foreach ($roles as $role) { - if (!isset($role['task'])) { - $this->_usesroletaskMustHaveRoleTask('usestask', 'task'); - $fail = true; - } else { - if (!isset($role['channel'])) { - if (!isset($role['uri'])) { - $this->_usesroletaskMustHaveChannelOrUri($role['task'], 'usestask'); - $fail = true; - } - } elseif (!isset($role['package'])) { - $this->_usesroletaskMustHavePackage($role['task'], 'usestask'); - $fail = true; - } - } - } - } - - if ($fail) { - return false; - } - - $list = $this->_packageInfo['contents']; - if (isset($list['dir']) && is_array($list['dir']) && isset($list['dir'][0])) { - $this->_multipleToplevelDirNotAllowed(); - return $this->_isValid = 0; - } - - $this->_validateFilelist(); - $this->_validateRelease(); - if (!$this->_stack->hasErrors()) { - $chan = $this->_pf->_registry->getChannel($this->_pf->getChannel(), true); - if (PEAR::isError($chan)) { - $this->_unknownChannel($this->_pf->getChannel()); - } else { - $valpack = $chan->getValidationPackage(); - // for channel validator packages, always use the default PEAR validator. - // otherwise, they can't be installed or packaged - $validator = $chan->getValidationObject($this->_pf->getPackage()); - if (!$validator) { - $this->_stack->push(__FUNCTION__, 'error', - array('channel' => $chan->getName(), - 'package' => $this->_pf->getPackage(), - 'name' => $valpack['_content'], - 'version' => $valpack['attribs']['version']), - 'package "%channel%/%package%" cannot be properly validated without ' . - 'validation package "%channel%/%name%-%version%"'); - return $this->_isValid = 0; - } - $validator->setPackageFile($this->_pf); - $validator->validate($state); - $failures = $validator->getFailures(); - foreach ($failures['errors'] as $error) { - $this->_stack->push(__FUNCTION__, 'error', $error, - 'Channel validator error: field "%field%" - %reason%'); - } - foreach ($failures['warnings'] as $warning) { - $this->_stack->push(__FUNCTION__, 'warning', $warning, - 'Channel validator warning: field "%field%" - %reason%'); - } - } - } - - $this->_pf->_isValid = $this->_isValid = !$this->_stack->hasErrors('error'); - if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$this->_filesValid) { - if ($this->_pf->getPackageType() == 'bundle') { - if ($this->_analyzeBundledPackages()) { - $this->_filesValid = $this->_pf->_filesValid = true; - } else { - $this->_pf->_isValid = $this->_isValid = 0; - } - } else { - if (!$this->_analyzePhpFiles()) { - $this->_pf->_isValid = $this->_isValid = 0; - } else { - $this->_filesValid = $this->_pf->_filesValid = true; - } - } - } - - if ($this->_isValid) { - return $this->_pf->_isValid = $this->_isValid = $state; - } - - return $this->_pf->_isValid = $this->_isValid = 0; - } - - function _stupidSchemaValidate($structure, $xml, $root) - { - if (!is_array($xml)) { - $xml = array(); - } - $keys = array_keys($xml); - reset($keys); - $key = current($keys); - while ($key == 'attribs' || $key == '_contents') { - $key = next($keys); - } - $unfoundtags = $optionaltags = array(); - $ret = true; - $mismatch = false; - foreach ($structure as $struc) { - if ($key) { - $tag = $xml[$key]; - } - $test = $this->_processStructure($struc); - if (isset($test['choices'])) { - $loose = true; - foreach ($test['choices'] as $choice) { - if ($key == $choice['tag']) { - $key = next($keys); - while ($key == 'attribs' || $key == '_contents') { - $key = next($keys); - } - $unfoundtags = $optionaltags = array(); - $mismatch = false; - if ($key && $key != $choice['tag'] && isset($choice['multiple'])) { - $unfoundtags[] = $choice['tag']; - $optionaltags[] = $choice['tag']; - if ($key) { - $mismatch = true; - } - } - $ret &= $this->_processAttribs($choice, $tag, $root); - continue 2; - } else { - $unfoundtags[] = $choice['tag']; - $mismatch = true; - } - if (!isset($choice['multiple']) || $choice['multiple'] != '*') { - $loose = false; - } else { - $optionaltags[] = $choice['tag']; - } - } - if (!$loose) { - $this->_invalidTagOrder($unfoundtags, $key, $root); - return false; - } - } else { - if ($key != $test['tag']) { - if (isset($test['multiple']) && $test['multiple'] != '*') { - $unfoundtags[] = $test['tag']; - $this->_invalidTagOrder($unfoundtags, $key, $root); - return false; - } else { - if ($key) { - $mismatch = true; - } - $unfoundtags[] = $test['tag']; - $optionaltags[] = $test['tag']; - } - if (!isset($test['multiple'])) { - $this->_invalidTagOrder($unfoundtags, $key, $root); - return false; - } - continue; - } else { - $unfoundtags = $optionaltags = array(); - $mismatch = false; - } - $key = next($keys); - while ($key == 'attribs' || $key == '_contents') { - $key = next($keys); - } - if ($key && $key != $test['tag'] && isset($test['multiple'])) { - $unfoundtags[] = $test['tag']; - $optionaltags[] = $test['tag']; - $mismatch = true; - } - $ret &= $this->_processAttribs($test, $tag, $root); - continue; - } - } - if (!$mismatch && count($optionaltags)) { - // don't error out on any optional tags - $unfoundtags = array_diff($unfoundtags, $optionaltags); - } - if (count($unfoundtags)) { - $this->_invalidTagOrder($unfoundtags, $key, $root); - } elseif ($key) { - // unknown tags - $this->_invalidTagOrder('*no tags allowed here*', $key, $root); - while ($key = next($keys)) { - $this->_invalidTagOrder('*no tags allowed here*', $key, $root); - } - } - return $ret; - } - - function _processAttribs($choice, $tag, $context) - { - if (isset($choice['attribs'])) { - if (!is_array($tag)) { - $tag = array($tag); - } - $tags = $tag; - if (!isset($tags[0])) { - $tags = array($tags); - } - $ret = true; - foreach ($tags as $i => $tag) { - if (!is_array($tag) || !isset($tag['attribs'])) { - foreach ($choice['attribs'] as $attrib) { - if ($attrib{0} != '?') { - $ret &= $this->_tagHasNoAttribs($choice['tag'], - $context); - continue 2; - } - } - } - foreach ($choice['attribs'] as $attrib) { - if ($attrib{0} != '?') { - if (!isset($tag['attribs'][$attrib])) { - $ret &= $this->_tagMissingAttribute($choice['tag'], - $attrib, $context); - } - } - } - } - return $ret; - } - return true; - } - - function _processStructure($key) - { - $ret = array(); - if (count($pieces = explode('|', $key)) > 1) { - $ret['choices'] = array(); - foreach ($pieces as $piece) { - $ret['choices'][] = $this->_processStructure($piece); - } - return $ret; - } - $multi = $key{0}; - if ($multi == '+' || $multi == '*') { - $ret['multiple'] = $key{0}; - $key = substr($key, 1); - } - if (count($attrs = explode('->', $key)) > 1) { - $ret['tag'] = array_shift($attrs); - $ret['attribs'] = $attrs; - } else { - $ret['tag'] = $key; - } - return $ret; - } - - function _validateStabilityVersion() - { - $structure = array('release', 'api'); - $a = $this->_stupidSchemaValidate($structure, $this->_packageInfo['version'], ''); - $a &= $this->_stupidSchemaValidate($structure, $this->_packageInfo['stability'], ''); - if ($a) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $this->_packageInfo['version']['release'])) { - $this->_invalidVersion('release', $this->_packageInfo['version']['release']); - } - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $this->_packageInfo['version']['api'])) { - $this->_invalidVersion('api', $this->_packageInfo['version']['api']); - } - if (!in_array($this->_packageInfo['stability']['release'], - array('snapshot', 'devel', 'alpha', 'beta', 'stable'))) { - $this->_invalidState('release', $this->_packageInfo['stability']['release']); - } - if (!in_array($this->_packageInfo['stability']['api'], - array('devel', 'alpha', 'beta', 'stable'))) { - $this->_invalidState('api', $this->_packageInfo['stability']['api']); - } - } - } - - function _validateMaintainers() - { - $structure = - array( - 'name', - 'user', - 'email', - 'active', - ); - foreach (array('lead', 'developer', 'contributor', 'helper') as $type) { - if (!isset($this->_packageInfo[$type])) { - continue; - } - if (isset($this->_packageInfo[$type][0])) { - foreach ($this->_packageInfo[$type] as $lead) { - $this->_stupidSchemaValidate($structure, $lead, '<' . $type . '>'); - } - } else { - $this->_stupidSchemaValidate($structure, $this->_packageInfo[$type], - '<' . $type . '>'); - } - } - } - - function _validatePhpDep($dep, $installcondition = false) - { - $structure = array( - 'min', - '*max', - '*exclude', - ); - $type = $installcondition ? '' : ''; - $this->_stupidSchemaValidate($structure, $dep, $type); - if (isset($dep['min'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/', - $dep['min'])) { - $this->_invalidVersion($type . '', $dep['min']); - } - } - if (isset($dep['max'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/', - $dep['max'])) { - $this->_invalidVersion($type . '', $dep['max']); - } - } - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - foreach ($dep['exclude'] as $exclude) { - if (!preg_match( - '/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/', - $exclude)) { - $this->_invalidVersion($type . '', $exclude); - } - } - } - } - - function _validatePearinstallerDep($dep) - { - $structure = array( - 'min', - '*max', - '*recommended', - '*exclude', - ); - $this->_stupidSchemaValidate($structure, $dep, ''); - if (isset($dep['min'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['min'])) { - $this->_invalidVersion('', - $dep['min']); - } - } - if (isset($dep['max'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['max'])) { - $this->_invalidVersion('', - $dep['max']); - } - } - if (isset($dep['recommended'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['recommended'])) { - $this->_invalidVersion('', - $dep['recommended']); - } - } - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - foreach ($dep['exclude'] as $exclude) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $exclude)) { - $this->_invalidVersion('', - $exclude); - } - } - } - } - - function _validatePackageDep($dep, $group, $type = '') - { - if (isset($dep['uri'])) { - if (isset($dep['conflicts'])) { - $structure = array( - 'name', - 'uri', - 'conflicts', - '*providesextension', - ); - } else { - $structure = array( - 'name', - 'uri', - '*providesextension', - ); - } - } else { - if (isset($dep['conflicts'])) { - $structure = array( - 'name', - 'channel', - '*min', - '*max', - '*exclude', - 'conflicts', - '*providesextension', - ); - } else { - $structure = array( - 'name', - 'channel', - '*min', - '*max', - '*recommended', - '*exclude', - '*nodefault', - '*providesextension', - ); - } - } - if (isset($dep['name'])) { - $type .= '' . $dep['name'] . ''; - } - $this->_stupidSchemaValidate($structure, $dep, '' . $group . $type); - if (isset($dep['uri']) && (isset($dep['min']) || isset($dep['max']) || - isset($dep['recommended']) || isset($dep['exclude']))) { - $this->_uriDepsCannotHaveVersioning('' . $group . $type); - } - if (isset($dep['channel']) && strtolower($dep['channel']) == '__uri') { - $this->_DepchannelCannotBeUri('' . $group . $type); - } - if (isset($dep['min'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['min'])) { - $this->_invalidVersion('' . $group . $type . '', $dep['min']); - } - } - if (isset($dep['max'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['max'])) { - $this->_invalidVersion('' . $group . $type . '', $dep['max']); - } - } - if (isset($dep['recommended'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['recommended'])) { - $this->_invalidVersion('' . $group . $type . '', - $dep['recommended']); - } - } - if (isset($dep['exclude'])) { - if (!is_array($dep['exclude'])) { - $dep['exclude'] = array($dep['exclude']); - } - foreach ($dep['exclude'] as $exclude) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $exclude)) { - $this->_invalidVersion('' . $group . $type . '', - $exclude); - } - } - } - } - - function _validateSubpackageDep($dep, $group) - { - $this->_validatePackageDep($dep, $group, ''); - if (isset($dep['providesextension'])) { - $this->_subpackageCannotProvideExtension(isset($dep['name']) ? $dep['name'] : ''); - } - if (isset($dep['conflicts'])) { - $this->_subpackagesCannotConflict(isset($dep['name']) ? $dep['name'] : ''); - } - } - - function _validateExtensionDep($dep, $group = false, $installcondition = false) - { - if (isset($dep['conflicts'])) { - $structure = array( - 'name', - '*min', - '*max', - '*exclude', - 'conflicts', - ); - } else { - $structure = array( - 'name', - '*min', - '*max', - '*recommended', - '*exclude', - ); - } - if ($installcondition) { - $type = ''; - } else { - $type = '' . $group . ''; - } - if (isset($dep['name'])) { - $type .= '' . $dep['name'] . ''; - } - $this->_stupidSchemaValidate($structure, $dep, $type); - if (isset($dep['min'])) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $dep['min'])) { - $this->_invalidVersion(substr($type, 1) . '_invalidVersion(substr($type, 1) . '_invalidVersion(substr($type, 1) . '_invalidVersion(substr($type, 1) . '' : ''; - if ($this->_stupidSchemaValidate($structure, $dep, $type)) { - if ($dep['name'] == '*') { - if (array_key_exists('conflicts', $dep)) { - $this->_cannotConflictWithAllOs($type); - } - } - } - } - - function _validateArchDep($dep, $installcondition = false) - { - $structure = array( - 'pattern', - '*conflicts', - ); - $type = $installcondition ? '' : ''; - $this->_stupidSchemaValidate($structure, $dep, $type); - } - - function _validateInstallConditions($cond, $release) - { - $structure = array( - '*php', - '*extension', - '*os', - '*arch', - ); - if (!$this->_stupidSchemaValidate($structure, - $cond, $release)) { - return false; - } - foreach (array('php', 'extension', 'os', 'arch') as $type) { - if (isset($cond[$type])) { - $iter = $cond[$type]; - if (!is_array($iter) || !isset($iter[0])) { - $iter = array($iter); - } - foreach ($iter as $package) { - if ($type == 'extension') { - $this->{"_validate{$type}Dep"}($package, false, true); - } else { - $this->{"_validate{$type}Dep"}($package, true); - } - } - } - } - } - - function _validateDependencies() - { - $structure = array( - 'required', - '*optional', - '*group->name->hint' - ); - if (!$this->_stupidSchemaValidate($structure, - $this->_packageInfo['dependencies'], '')) { - return false; - } - foreach (array('required', 'optional') as $simpledep) { - if (isset($this->_packageInfo['dependencies'][$simpledep])) { - if ($simpledep == 'optional') { - $structure = array( - '*package', - '*subpackage', - '*extension', - ); - } else { - $structure = array( - 'php', - 'pearinstaller', - '*package', - '*subpackage', - '*extension', - '*os', - '*arch', - ); - } - if ($this->_stupidSchemaValidate($structure, - $this->_packageInfo['dependencies'][$simpledep], - "<$simpledep>")) { - foreach (array('package', 'subpackage', 'extension') as $type) { - if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) { - $iter = $this->_packageInfo['dependencies'][$simpledep][$type]; - if (!isset($iter[0])) { - $iter = array($iter); - } - foreach ($iter as $package) { - if ($type != 'extension') { - if (isset($package['uri'])) { - if (isset($package['channel'])) { - $this->_UrlOrChannel($type, - $package['name']); - } - } else { - if (!isset($package['channel'])) { - $this->_NoChannel($type, $package['name']); - } - } - } - $this->{"_validate{$type}Dep"}($package, "<$simpledep>"); - } - } - } - if ($simpledep == 'optional') { - continue; - } - foreach (array('php', 'pearinstaller', 'os', 'arch') as $type) { - if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) { - $iter = $this->_packageInfo['dependencies'][$simpledep][$type]; - if (!isset($iter[0])) { - $iter = array($iter); - } - foreach ($iter as $package) { - $this->{"_validate{$type}Dep"}($package); - } - } - } - } - } - } - if (isset($this->_packageInfo['dependencies']['group'])) { - $groups = $this->_packageInfo['dependencies']['group']; - if (!isset($groups[0])) { - $groups = array($groups); - } - $structure = array( - '*package', - '*subpackage', - '*extension', - ); - foreach ($groups as $group) { - if ($this->_stupidSchemaValidate($structure, $group, '')) { - if (!PEAR_Validate::validGroupName($group['attribs']['name'])) { - $this->_invalidDepGroupName($group['attribs']['name']); - } - foreach (array('package', 'subpackage', 'extension') as $type) { - if (isset($group[$type])) { - $iter = $group[$type]; - if (!isset($iter[0])) { - $iter = array($iter); - } - foreach ($iter as $package) { - if ($type != 'extension') { - if (isset($package['uri'])) { - if (isset($package['channel'])) { - $this->_UrlOrChannelGroup($type, - $package['name'], - $group['name']); - } - } else { - if (!isset($package['channel'])) { - $this->_NoChannelGroup($type, - $package['name'], - $group['name']); - } - } - } - $this->{"_validate{$type}Dep"}($package, ''); - } - } - } - } - } - } - } - - function _validateCompatible() - { - $compat = $this->_packageInfo['compatible']; - if (!isset($compat[0])) { - $compat = array($compat); - } - $required = array('name', 'channel', 'min', 'max', '*exclude'); - foreach ($compat as $package) { - $type = ''; - if (is_array($package) && array_key_exists('name', $package)) { - $type .= '' . $package['name'] . ''; - } - $this->_stupidSchemaValidate($required, $package, $type); - if (is_array($package) && array_key_exists('min', $package)) { - if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/', - $package['min'])) { - $this->_invalidVersion(substr($type, 1) . '_invalidVersion(substr($type, 1) . '_invalidVersion(substr($type, 1) . '_NoBundledPackages(); - } - if (!is_array($list['bundledpackage']) || !isset($list['bundledpackage'][0])) { - return $this->_AtLeast2BundledPackages(); - } - foreach ($list['bundledpackage'] as $package) { - if (!is_string($package)) { - $this->_bundledPackagesMustBeFilename(); - } - } - } - - function _validateFilelist($list = false, $allowignore = false, $dirs = '') - { - $iscontents = false; - if (!$list) { - $iscontents = true; - $list = $this->_packageInfo['contents']; - if (isset($this->_packageInfo['bundle'])) { - return $this->_validateBundle($list); - } - } - if ($allowignore) { - $struc = array( - '*install->name->as', - '*ignore->name' - ); - } else { - $struc = array( - '*dir->name->?baseinstalldir', - '*file->name->role->?baseinstalldir->?md5sum' - ); - if (isset($list['dir']) && isset($list['file'])) { - // stave off validation errors without requiring a set order. - $_old = $list; - if (isset($list['attribs'])) { - $list = array('attribs' => $_old['attribs']); - } - $list['dir'] = $_old['dir']; - $list['file'] = $_old['file']; - } - } - if (!isset($list['attribs']) || !isset($list['attribs']['name'])) { - $unknown = $allowignore ? '' : ''; - $dirname = $iscontents ? '' : $unknown; - } else { - $dirname = ''; - if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', - str_replace('\\', '/', $list['attribs']['name']))) { - // file contains .. parent directory or . cur directory - $this->_invalidDirName($list['attribs']['name']); - } - } - $res = $this->_stupidSchemaValidate($struc, $list, $dirname); - if ($allowignore && $res) { - $ignored_or_installed = array(); - $this->_pf->getFilelist(); - $fcontents = $this->_pf->getContents(); - $filelist = array(); - if (!isset($fcontents['dir']['file'][0])) { - $fcontents['dir']['file'] = array($fcontents['dir']['file']); - } - foreach ($fcontents['dir']['file'] as $file) { - $filelist[$file['attribs']['name']] = true; - } - if (isset($list['install'])) { - if (!isset($list['install'][0])) { - $list['install'] = array($list['install']); - } - foreach ($list['install'] as $file) { - if (!isset($filelist[$file['attribs']['name']])) { - $this->_notInContents($file['attribs']['name'], 'install'); - continue; - } - if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) { - $this->_multipleInstallAs($file['attribs']['name']); - } - if (!isset($ignored_or_installed[$file['attribs']['name']])) { - $ignored_or_installed[$file['attribs']['name']] = array(); - } - $ignored_or_installed[$file['attribs']['name']][] = 1; - if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', - str_replace('\\', '/', $file['attribs']['as']))) { - // file contains .. parent directory or . cur directory references - $this->_invalidFileInstallAs($file['attribs']['name'], - $file['attribs']['as']); - } - } - } - if (isset($list['ignore'])) { - if (!isset($list['ignore'][0])) { - $list['ignore'] = array($list['ignore']); - } - foreach ($list['ignore'] as $file) { - if (!isset($filelist[$file['attribs']['name']])) { - $this->_notInContents($file['attribs']['name'], 'ignore'); - continue; - } - if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) { - $this->_ignoreAndInstallAs($file['attribs']['name']); - } - } - } - } - if (!$allowignore && isset($list['file'])) { - if (is_string($list['file'])) { - $this->_oldStyleFileNotAllowed(); - return false; - } - if (!isset($list['file'][0])) { - // single file - $list['file'] = array($list['file']); - } - foreach ($list['file'] as $i => $file) - { - if (isset($file['attribs']) && isset($file['attribs']['name'])) { - if ($file['attribs']['name']{0} == '.' && - $file['attribs']['name']{1} == '/') { - // name is something like "./doc/whatever.txt" - $this->_invalidFileName($file['attribs']['name'], $dirname); - } - if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', - str_replace('\\', '/', $file['attribs']['name']))) { - // file contains .. parent directory or . cur directory - $this->_invalidFileName($file['attribs']['name'], $dirname); - } - } - if (isset($file['attribs']) && isset($file['attribs']['role'])) { - if (!$this->_validateRole($file['attribs']['role'])) { - if (isset($this->_packageInfo['usesrole'])) { - $roles = $this->_packageInfo['usesrole']; - if (!isset($roles[0])) { - $roles = array($roles); - } - foreach ($roles as $role) { - if ($role['role'] = $file['attribs']['role']) { - $msg = 'This package contains role "%role%" and requires ' . - 'package "%package%" to be used'; - if (isset($role['uri'])) { - $params = array('role' => $role['role'], - 'package' => $role['uri']); - } else { - $params = array('role' => $role['role'], - 'package' => $this->_pf->_registry-> - parsedPackageNameToString(array('package' => - $role['package'], 'channel' => $role['channel']), - true)); - } - $this->_stack->push('_mustInstallRole', 'error', $params, $msg); - } - } - } - $this->_invalidFileRole($file['attribs']['name'], - $dirname, $file['attribs']['role']); - } - } - if (!isset($file['attribs'])) { - continue; - } - $save = $file['attribs']; - if ($dirs) { - $save['name'] = $dirs . '/' . $save['name']; - } - unset($file['attribs']); - if (count($file) && $this->_curState != PEAR_VALIDATE_DOWNLOADING) { // has tasks - foreach ($file as $task => $value) { - if ($tagClass = $this->_pf->getTask($task)) { - if (!is_array($value) || !isset($value[0])) { - $value = array($value); - } - foreach ($value as $v) { - $ret = call_user_func(array($tagClass, 'validateXml'), - $this->_pf, $v, $this->_pf->_config, $save); - if (is_array($ret)) { - $this->_invalidTask($task, $ret, isset($save['name']) ? - $save['name'] : ''); - } - } - } else { - if (isset($this->_packageInfo['usestask'])) { - $roles = $this->_packageInfo['usestask']; - if (!isset($roles[0])) { - $roles = array($roles); - } - foreach ($roles as $role) { - if ($role['task'] = $task) { - $msg = 'This package contains task "%task%" and requires ' . - 'package "%package%" to be used'; - if (isset($role['uri'])) { - $params = array('task' => $role['task'], - 'package' => $role['uri']); - } else { - $params = array('task' => $role['task'], - 'package' => $this->_pf->_registry-> - parsedPackageNameToString(array('package' => - $role['package'], 'channel' => $role['channel']), - true)); - } - $this->_stack->push('_mustInstallTask', 'error', - $params, $msg); - } - } - } - $this->_unknownTask($task, $save['name']); - } - } - } - } - } - if (isset($list['ignore'])) { - if (!$allowignore) { - $this->_ignoreNotAllowed('ignore'); - } - } - if (isset($list['install'])) { - if (!$allowignore) { - $this->_ignoreNotAllowed('install'); - } - } - if (isset($list['file'])) { - if ($allowignore) { - $this->_fileNotAllowed('file'); - } - } - if (isset($list['dir'])) { - if ($allowignore) { - $this->_fileNotAllowed('dir'); - } else { - if (!isset($list['dir'][0])) { - $list['dir'] = array($list['dir']); - } - foreach ($list['dir'] as $dir) { - if (isset($dir['attribs']) && isset($dir['attribs']['name'])) { - if ($dir['attribs']['name'] == '/' || - !isset($this->_packageInfo['contents']['dir']['dir'])) { - // always use nothing if the filelist has already been flattened - $newdirs = ''; - } elseif ($dirs == '') { - $newdirs = $dir['attribs']['name']; - } else { - $newdirs = $dirs . '/' . $dir['attribs']['name']; - } - } else { - $newdirs = $dirs; - } - $this->_validateFilelist($dir, $allowignore, $newdirs); - } - } - } - } - - function _validateRelease() - { - if (isset($this->_packageInfo['phprelease'])) { - $release = 'phprelease'; - if (isset($this->_packageInfo['providesextension'])) { - $this->_cannotProvideExtension($release); - } - if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) { - $this->_cannotHaveSrcpackage($release); - } - $releases = $this->_packageInfo['phprelease']; - if (!is_array($releases)) { - return true; - } - if (!isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*filelist', - ), $rel, ''); - } - } - foreach (array('', 'zend') as $prefix) { - $releasetype = $prefix . 'extsrcrelease'; - if (isset($this->_packageInfo[$releasetype])) { - $release = $releasetype; - if (!isset($this->_packageInfo['providesextension'])) { - $this->_mustProvideExtension($release); - } - if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) { - $this->_cannotHaveSrcpackage($release); - } - $releases = $this->_packageInfo[$releasetype]; - if (!is_array($releases)) { - return true; - } - if (!isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*configureoption->name->prompt->?default', - '*binarypackage', - '*filelist', - ), $rel, '<' . $releasetype . '>'); - if (isset($rel['binarypackage'])) { - if (!is_array($rel['binarypackage']) || !isset($rel['binarypackage'][0])) { - $rel['binarypackage'] = array($rel['binarypackage']); - } - foreach ($rel['binarypackage'] as $bin) { - if (!is_string($bin)) { - $this->_binaryPackageMustBePackagename(); - } - } - } - } - } - $releasetype = 'extbinrelease'; - if (isset($this->_packageInfo[$releasetype])) { - $release = $releasetype; - if (!isset($this->_packageInfo['providesextension'])) { - $this->_mustProvideExtension($release); - } - if (isset($this->_packageInfo['channel']) && - !isset($this->_packageInfo['srcpackage'])) { - $this->_mustSrcPackage($release); - } - if (isset($this->_packageInfo['uri']) && !isset($this->_packageInfo['srcuri'])) { - $this->_mustSrcuri($release); - } - $releases = $this->_packageInfo[$releasetype]; - if (!is_array($releases)) { - return true; - } - if (!isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*filelist', - ), $rel, '<' . $releasetype . '>'); - } - } - } - if (isset($this->_packageInfo['bundle'])) { - $release = 'bundle'; - if (isset($this->_packageInfo['providesextension'])) { - $this->_cannotProvideExtension($release); - } - if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) { - $this->_cannotHaveSrcpackage($release); - } - $releases = $this->_packageInfo['bundle']; - if (!is_array($releases) || !isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*filelist', - ), $rel, ''); - } - } - foreach ($releases as $rel) { - if (is_array($rel) && array_key_exists('installconditions', $rel)) { - $this->_validateInstallConditions($rel['installconditions'], - "<$release>"); - } - if (is_array($rel) && array_key_exists('filelist', $rel)) { - if ($rel['filelist']) { - - $this->_validateFilelist($rel['filelist'], true); - } - } - } - } - - /** - * This is here to allow role extension through plugins - * @param string - */ - function _validateRole($role) - { - return in_array($role, PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType())); - } - - function _pearVersionTooLow($version) - { - $this->_stack->push(__FUNCTION__, 'error', - array('version' => $version), - 'This package.xml requires PEAR version %version% to parse properly, we are ' . - 'version 1.9.4'); - } - - function _invalidTagOrder($oktags, $actual, $root) - { - $this->_stack->push(__FUNCTION__, 'error', - array('oktags' => $oktags, 'actual' => $actual, 'root' => $root), - 'Invalid tag order in %root%, found <%actual%> expected one of "%oktags%"'); - } - - function _ignoreNotAllowed($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), - '<%type%> is not allowed inside global , only inside ' . - '//, use and only'); - } - - function _fileNotAllowed($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), - '<%type%> is not allowed inside release , only inside ' . - ', use and only'); - } - - function _oldStyleFileNotAllowed() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'Old-style name is not allowed. Use' . - ''); - } - - function _tagMissingAttribute($tag, $attr, $context) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag, - 'attribute' => $attr, 'context' => $context), - 'tag <%tag%> in context "%context%" has no attribute "%attribute%"'); - } - - function _tagHasNoAttribs($tag, $context) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag, - 'context' => $context), - 'tag <%tag%> has no attributes in context "%context%"'); - } - - function _invalidInternalStructure() - { - $this->_stack->push(__FUNCTION__, 'exception', array(), - 'internal array was not generated by compatible parser, or extreme parser error, cannot continue'); - } - - function _invalidFileRole($file, $dir, $role) - { - $this->_stack->push(__FUNCTION__, 'error', array( - 'file' => $file, 'dir' => $dir, 'role' => $role, - 'roles' => PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType())), - 'File "%file%" in directory "%dir%" has invalid role "%role%", should be one of %roles%'); - } - - function _invalidFileName($file, $dir) - { - $this->_stack->push(__FUNCTION__, 'error', array( - 'file' => $file), - 'File "%file%" in directory "%dir%" cannot begin with "./" or contain ".."'); - } - - function _invalidFileInstallAs($file, $as) - { - $this->_stack->push(__FUNCTION__, 'error', array( - 'file' => $file, 'as' => $as), - 'File "%file%" cannot contain "./" or contain ".."'); - } - - function _invalidDirName($dir) - { - $this->_stack->push(__FUNCTION__, 'error', array( - 'dir' => $file), - 'Directory "%dir%" cannot begin with "./" or contain ".."'); - } - - function _filelistCannotContainFile($filelist) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist), - '<%tag%> can only contain , contains . Use ' . - ' as the first dir element'); - } - - function _filelistMustContainDir($filelist) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist), - '<%tag%> must contain . Use as the ' . - 'first dir element'); - } - - function _tagCannotBeEmpty($tag) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag), - '<%tag%> cannot be empty (<%tag%/>)'); - } - - function _UrlOrChannel($type, $name) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, - 'name' => $name), - 'Required dependency <%type%> "%name%" can have either url OR ' . - 'channel attributes, and not both'); - } - - function _NoChannel($type, $name) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, - 'name' => $name), - 'Required dependency <%type%> "%name%" must have either url OR ' . - 'channel attributes'); - } - - function _UrlOrChannelGroup($type, $name, $group) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, - 'name' => $name, 'group' => $group), - 'Group "%group%" dependency <%type%> "%name%" can have either url OR ' . - 'channel attributes, and not both'); - } - - function _NoChannelGroup($type, $name, $group) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, - 'name' => $name, 'group' => $group), - 'Group "%group%" dependency <%type%> "%name%" must have either url OR ' . - 'channel attributes'); - } - - function _unknownChannel($channel) - { - $this->_stack->push(__FUNCTION__, 'error', array('channel' => $channel), - 'Unknown channel "%channel%"'); - } - - function _noPackageVersion() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'package.xml tag has no version attribute, or version is not 2.0'); - } - - function _NoBundledPackages() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'No tag was found in , required for bundle packages'); - } - - function _AtLeast2BundledPackages() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'At least 2 packages must be bundled in a bundle package'); - } - - function _ChannelOrUri($name) - { - $this->_stack->push(__FUNCTION__, 'error', array('name' => $name), - 'Bundled package "%name%" can have either a uri or a channel, not both'); - } - - function _noChildTag($child, $tag) - { - $this->_stack->push(__FUNCTION__, 'error', array('child' => $child, 'tag' => $tag), - 'Tag <%tag%> is missing child tag <%child%>'); - } - - function _invalidVersion($type, $value) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value), - 'Version type <%type%> is not a valid version (%value%)'); - } - - function _invalidState($type, $value) - { - $states = array('stable', 'beta', 'alpha', 'devel'); - if ($type != 'api') { - $states[] = 'snapshot'; - } - if (strtolower($value) == 'rc') { - $this->_stack->push(__FUNCTION__, 'error', - array('version' => $this->_packageInfo['version']['release']), - 'RC is not a state, it is a version postfix, try %version%RC1, stability beta'); - } - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value, - 'types' => $states), - 'Stability type <%type%> is not a valid stability (%value%), must be one of ' . - '%types%'); - } - - function _invalidTask($task, $ret, $file) - { - switch ($ret[0]) { - case PEAR_TASK_ERROR_MISSING_ATTRIB : - $info = array('attrib' => $ret[1], 'task' => $task, 'file' => $file); - $msg = 'task <%task%> is missing attribute "%attrib%" in file %file%'; - break; - case PEAR_TASK_ERROR_NOATTRIBS : - $info = array('task' => $task, 'file' => $file); - $msg = 'task <%task%> has no attributes in file %file%'; - break; - case PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE : - $info = array('attrib' => $ret[1], 'values' => $ret[3], - 'was' => $ret[2], 'task' => $task, 'file' => $file); - $msg = 'task <%task%> attribute "%attrib%" has the wrong value "%was%" '. - 'in file %file%, expecting one of "%values%"'; - break; - case PEAR_TASK_ERROR_INVALID : - $info = array('reason' => $ret[1], 'task' => $task, 'file' => $file); - $msg = 'task <%task%> in file %file% is invalid because of "%reason%"'; - break; - } - $this->_stack->push(__FUNCTION__, 'error', $info, $msg); - } - - function _unknownTask($task, $file) - { - $this->_stack->push(__FUNCTION__, 'error', array('task' => $task, 'file' => $file), - 'Unknown task "%task%" passed in file '); - } - - function _subpackageCannotProvideExtension($name) - { - $this->_stack->push(__FUNCTION__, 'error', array('name' => $name), - 'Subpackage dependency "%name%" cannot use , ' . - 'only package dependencies can use this tag'); - } - - function _subpackagesCannotConflict($name) - { - $this->_stack->push(__FUNCTION__, 'error', array('name' => $name), - 'Subpackage dependency "%name%" cannot use , ' . - 'only package dependencies can use this tag'); - } - - function _cannotProvideExtension($release) - { - $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '<%release%> packages cannot use , only extbinrelease, extsrcrelease, zendextsrcrelease, and zendextbinrelease can provide a PHP extension'); - } - - function _mustProvideExtension($release) - { - $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '<%release%> packages must use to indicate which PHP extension is provided'); - } - - function _cannotHaveSrcpackage($release) - { - $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '<%release%> packages cannot specify a source code package, only extension binaries may use the tag'); - } - - function _mustSrcPackage($release) - { - $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '/ packages must specify a source code package with '); - } - - function _mustSrcuri($release) - { - $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '/ packages must specify a source code package with '); - } - - function _uriDepsCannotHaveVersioning($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), - '%type%: dependencies with a tag cannot have any versioning information'); - } - - function _conflictingDepsCannotHaveVersioning($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), - '%type%: conflicting dependencies cannot have versioning info, use to ' . - 'exclude specific versions of a dependency'); - } - - function _DepchannelCannotBeUri($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), - '%type%: channel cannot be __uri, this is a pseudo-channel reserved for uri ' . - 'dependencies only'); - } - - function _bundledPackagesMustBeFilename() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - ' tags must contain only the filename of a package release ' . - 'in the bundle'); - } - - function _binaryPackageMustBePackagename() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - ' tags must contain the name of a package that is ' . - 'a compiled version of this extsrc/zendextsrc package'); - } - - function _fileNotFound($file) - { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'File "%file%" in package.xml does not exist'); - } - - function _notInContents($file, $tag) - { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file, 'tag' => $tag), - '<%tag% name="%file%"> is invalid, file is not in '); - } - - function _cannotValidateNoPathSet() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'Cannot validate files, no path to package file is set (use setPackageFile())'); - } - - function _usesroletaskMustHaveChannelOrUri($role, $tag) - { - $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag), - '<%tag%> for role "%role%" must contain either , or and '); - } - - function _usesroletaskMustHavePackage($role, $tag) - { - $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag), - '<%tag%> for role "%role%" must contain '); - } - - function _usesroletaskMustHaveRoleTask($tag, $type) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag, 'type' => $type), - '<%tag%> must contain <%type%> defining the %type% to be used'); - } - - function _cannotConflictWithAllOs($type) - { - $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag), - '%tag% cannot conflict with all OSes'); - } - - function _invalidDepGroupName($name) - { - $this->_stack->push(__FUNCTION__, 'error', array('name' => $name), - 'Invalid dependency group name "%name%"'); - } - - function _multipleToplevelDirNotAllowed() - { - $this->_stack->push(__FUNCTION__, 'error', array(), - 'Multiple top-level tags are not allowed. Enclose them ' . - 'in a '); - } - - function _multipleInstallAs($file) - { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'Only one tag is allowed for file "%file%"'); - } - - function _ignoreAndInstallAs($file) - { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'Cannot have both and tags for file "%file%"'); - } - - function _analyzeBundledPackages() - { - if (!$this->_isValid) { - return false; - } - if (!$this->_pf->getPackageType() == 'bundle') { - return false; - } - if (!isset($this->_pf->_packageFile)) { - return false; - } - $dir_prefix = dirname($this->_pf->_packageFile); - $common = new PEAR_Common; - $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') : - array($common, 'log'); - $info = $this->_pf->getContents(); - $info = $info['bundledpackage']; - if (!is_array($info)) { - $info = array($info); - } - $pkg = &new PEAR_PackageFile($this->_pf->_config); - foreach ($info as $package) { - if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $package)) { - $this->_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $package); - $this->_isValid = 0; - continue; - } - call_user_func_array($log, array(1, "Analyzing bundled package $package")); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $ret = $pkg->fromAnyFile($dir_prefix . DIRECTORY_SEPARATOR . $package, - PEAR_VALIDATE_NORMAL); - PEAR::popErrorHandling(); - if (PEAR::isError($ret)) { - call_user_func_array($log, array(0, "ERROR: package $package is not a valid " . - 'package')); - $inf = $ret->getUserInfo(); - if (is_array($inf)) { - foreach ($inf as $err) { - call_user_func_array($log, array(1, $err['message'])); - } - } - return false; - } - } - return true; - } - - function _analyzePhpFiles() - { - if (!$this->_isValid) { - return false; - } - if (!isset($this->_pf->_packageFile)) { - $this->_cannotValidateNoPathSet(); - return false; - } - $dir_prefix = dirname($this->_pf->_packageFile); - $common = new PEAR_Common; - $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') : - array(&$common, 'log'); - $info = $this->_pf->getContents(); - if (!$info || !isset($info['dir']['file'])) { - $this->_tagCannotBeEmpty('contents>_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $file); - $this->_isValid = 0; - continue; - } - if (in_array($fa['role'], PEAR_Installer_Role::getPhpRoles()) && $dir_prefix) { - call_user_func_array($log, array(1, "Analyzing $file")); - $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file); - if ($srcinfo) { - $provides = array_merge($provides, $this->_buildProvidesArray($srcinfo)); - } - } - } - $this->_packageName = $pn = $this->_pf->getPackage(); - $pnl = strlen($pn); - foreach ($provides as $key => $what) { - if (isset($what['explicit']) || !$what) { - // skip conformance checks if the provides entry is - // specified in the package.xml file - continue; - } - extract($what); - if ($type == 'class') { - if (!strncasecmp($name, $pn, $pnl)) { - continue; - } - $this->_stack->push(__FUNCTION__, 'warning', - array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn), - 'in %file%: %type% "%name%" not prefixed with package name "%package%"'); - } elseif ($type == 'function') { - if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) { - continue; - } - $this->_stack->push(__FUNCTION__, 'warning', - array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn), - 'in %file%: %type% "%name%" not prefixed with package name "%package%"'); - } - } - return $this->_isValid; - } - - /** - * Analyze the source code of the given PHP file - * - * @param string Filename of the PHP file - * @param boolean whether to analyze $file as the file contents - * @return mixed - */ - function analyzeSourceCode($file, $string = false) - { - if (!function_exists("token_get_all")) { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'Parser error: token_get_all() function must exist to analyze source code, PHP may have been compiled with --disable-tokenizer'); - return false; - } - - if (!defined('T_DOC_COMMENT')) { - define('T_DOC_COMMENT', T_COMMENT); - } - - if (!defined('T_INTERFACE')) { - define('T_INTERFACE', -1); - } - - if (!defined('T_IMPLEMENTS')) { - define('T_IMPLEMENTS', -1); - } - - if ($string) { - $contents = $file; - } else { - if (!$fp = @fopen($file, "r")) { - return false; - } - fclose($fp); - $contents = file_get_contents($file); - } - - // Silence this function so we can catch PHP Warnings and show our own custom message - $tokens = @token_get_all($contents); - if (isset($php_errormsg)) { - if (isset($this->_stack)) { - $pn = $this->_pf->getPackage(); - $this->_stack->push(__FUNCTION__, 'warning', - array('file' => $file, 'package' => $pn), - 'in %file%: Could not process file for unkown reasons,' . - ' possibly a PHP parse error in %file% from %package%'); - } - } -/* - for ($i = 0; $i < sizeof($tokens); $i++) { - @list($token, $data) = $tokens[$i]; - if (is_string($token)) { - var_dump($token); - } else { - print token_name($token) . ' '; - var_dump(rtrim($data)); - } - } -*/ - $look_for = 0; - $paren_level = 0; - $bracket_level = 0; - $brace_level = 0; - $lastphpdoc = ''; - $current_class = ''; - $current_interface = ''; - $current_class_level = -1; - $current_function = ''; - $current_function_level = -1; - $declared_classes = array(); - $declared_interfaces = array(); - $declared_functions = array(); - $declared_methods = array(); - $used_classes = array(); - $used_functions = array(); - $extends = array(); - $implements = array(); - $nodeps = array(); - $inquote = false; - $interface = false; - for ($i = 0; $i < sizeof($tokens); $i++) { - if (is_array($tokens[$i])) { - list($token, $data) = $tokens[$i]; - } else { - $token = $tokens[$i]; - $data = ''; - } - - if ($inquote) { - if ($token != '"' && $token != T_END_HEREDOC) { - continue; - } else { - $inquote = false; - continue; - } - } - - switch ($token) { - case T_WHITESPACE : - continue; - case ';': - if ($interface) { - $current_function = ''; - $current_function_level = -1; - } - break; - case '"': - case T_START_HEREDOC: - $inquote = true; - break; - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - case '{': $brace_level++; continue 2; - case '}': - $brace_level--; - if ($current_class_level == $brace_level) { - $current_class = ''; - $current_class_level = -1; - } - if ($current_function_level == $brace_level) { - $current_function = ''; - $current_function_level = -1; - } - continue 2; - case '[': $bracket_level++; continue 2; - case ']': $bracket_level--; continue 2; - case '(': $paren_level++; continue 2; - case ')': $paren_level--; continue 2; - case T_INTERFACE: - $interface = true; - case T_CLASS: - if (($current_class_level != -1) || ($current_function_level != -1)) { - if (isset($this->_stack)) { - $this->_stack->push(__FUNCTION__, 'error', array('file' => $file), - 'Parser error: invalid PHP found in file "%file%"'); - } else { - PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"", - PEAR_COMMON_ERROR_INVALIDPHP); - } - - return false; - } - case T_FUNCTION: - case T_NEW: - case T_EXTENDS: - case T_IMPLEMENTS: - $look_for = $token; - continue 2; - case T_STRING: - if (version_compare(zend_version(), '2.0', '<')) { - if (in_array(strtolower($data), - array('public', 'private', 'protected', 'abstract', - 'interface', 'implements', 'throw') - ) - ) { - if (isset($this->_stack)) { - $this->_stack->push(__FUNCTION__, 'warning', array( - 'file' => $file), - 'Error, PHP5 token encountered in %file%,' . - ' analysis should be in PHP5'); - } else { - PEAR::raiseError('Error: PHP5 token encountered in ' . $file . - 'packaging should be done in PHP 5'); - return false; - } - } - } - - if ($look_for == T_CLASS) { - $current_class = $data; - $current_class_level = $brace_level; - $declared_classes[] = $current_class; - } elseif ($look_for == T_INTERFACE) { - $current_interface = $data; - $current_class_level = $brace_level; - $declared_interfaces[] = $current_interface; - } elseif ($look_for == T_IMPLEMENTS) { - $implements[$current_class] = $data; - } elseif ($look_for == T_EXTENDS) { - $extends[$current_class] = $data; - } elseif ($look_for == T_FUNCTION) { - if ($current_class) { - $current_function = "$current_class::$data"; - $declared_methods[$current_class][] = $data; - } elseif ($current_interface) { - $current_function = "$current_interface::$data"; - $declared_methods[$current_interface][] = $data; - } else { - $current_function = $data; - $declared_functions[] = $current_function; - } - - $current_function_level = $brace_level; - $m = array(); - } elseif ($look_for == T_NEW) { - $used_classes[$data] = true; - } - - $look_for = 0; - continue 2; - case T_VARIABLE: - $look_for = 0; - continue 2; - case T_DOC_COMMENT: - case T_COMMENT: - if (preg_match('!^/\*\*\s!', $data)) { - $lastphpdoc = $data; - if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) { - $nodeps = array_merge($nodeps, $m[1]); - } - } - continue 2; - case T_DOUBLE_COLON: - $token = $tokens[$i - 1][0]; - if (!($token == T_WHITESPACE || $token == T_STRING || $token == T_STATIC)) { - if (isset($this->_stack)) { - $this->_stack->push(__FUNCTION__, 'warning', array('file' => $file), - 'Parser error: invalid PHP found in file "%file%"'); - } else { - PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"", - PEAR_COMMON_ERROR_INVALIDPHP); - } - - return false; - } - - $class = $tokens[$i - 1][1]; - if (strtolower($class) != 'parent') { - $used_classes[$class] = true; - } - - continue 2; - } - } - - return array( - "source_file" => $file, - "declared_classes" => $declared_classes, - "declared_interfaces" => $declared_interfaces, - "declared_methods" => $declared_methods, - "declared_functions" => $declared_functions, - "used_classes" => array_diff(array_keys($used_classes), $nodeps), - "inheritance" => $extends, - "implements" => $implements, - ); - } - - /** - * Build a "provides" array from data returned by - * analyzeSourceCode(). The format of the built array is like - * this: - * - * array( - * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), - * ... - * ) - * - * - * @param array $srcinfo array with information about a source file - * as returned by the analyzeSourceCode() method. - * - * @return void - * - * @access private - * - */ - function _buildProvidesArray($srcinfo) - { - if (!$this->_isValid) { - return array(); - } - - $providesret = array(); - $file = basename($srcinfo['source_file']); - $pn = isset($this->_pf) ? $this->_pf->getPackage() : ''; - $pnl = strlen($pn); - foreach ($srcinfo['declared_classes'] as $class) { - $key = "class;$class"; - if (isset($providesret[$key])) { - continue; - } - - $providesret[$key] = - array('file'=> $file, 'type' => 'class', 'name' => $class); - if (isset($srcinfo['inheritance'][$class])) { - $providesret[$key]['extends'] = - $srcinfo['inheritance'][$class]; - } - } - - foreach ($srcinfo['declared_methods'] as $class => $methods) { - foreach ($methods as $method) { - $function = "$class::$method"; - $key = "function;$function"; - if ($method{0} == '_' || !strcasecmp($method, $class) || - isset($providesret[$key])) { - continue; - } - - $providesret[$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - foreach ($srcinfo['declared_functions'] as $function) { - $key = "function;$function"; - if ($function{0} == '_' || isset($providesret[$key])) { - continue; - } - - if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) { - $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\""; - } - - $providesret[$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - - return $providesret; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/PackageFile/v2/rw.php b/3rdparty/PEAR/PackageFile/v2/rw.php deleted file mode 100644 index 58f76c5594..0000000000 --- a/3rdparty/PEAR/PackageFile/v2/rw.php +++ /dev/null @@ -1,1604 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: rw.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a8 - */ -/** - * For base class - */ -require_once 'PEAR/PackageFile/v2.php'; -/** - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a8 - */ -class PEAR_PackageFile_v2_rw extends PEAR_PackageFile_v2 -{ - /** - * @param string Extension name - * @return bool success of operation - */ - function setProvidesExtension($extension) - { - if (in_array($this->getPackageType(), - array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { - if (!isset($this->_packageInfo['providesextension'])) { - // ensure that the channel tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', - 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), - $extension, 'providesextension'); - } - $this->_packageInfo['providesextension'] = $extension; - return true; - } - return false; - } - - function setPackage($package) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['attribs'])) { - $this->_packageInfo = array_merge(array('attribs' => array( - 'version' => '2.0', - 'xmlns' => 'http://pear.php.net/dtd/package-2.0', - 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0', - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0 - http://pear.php.net/dtd/tasks-1.0.xsd - http://pear.php.net/dtd/package-2.0 - http://pear.php.net/dtd/package-2.0.xsd', - )), $this->_packageInfo); - } - if (!isset($this->_packageInfo['name'])) { - return $this->_packageInfo = array_merge(array('name' => $package), - $this->_packageInfo); - } - $this->_packageInfo['name'] = $package; - } - - /** - * set this as a package.xml version 2.1 - * @access private - */ - function _setPackageVersion2_1() - { - $info = array( - 'version' => '2.1', - 'xmlns' => 'http://pear.php.net/dtd/package-2.1', - 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0', - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0 - http://pear.php.net/dtd/tasks-1.0.xsd - http://pear.php.net/dtd/package-2.1 - http://pear.php.net/dtd/package-2.1.xsd', - ); - if (!isset($this->_packageInfo['attribs'])) { - $this->_packageInfo = array_merge(array('attribs' => $info), $this->_packageInfo); - } else { - $this->_packageInfo['attribs'] = $info; - } - } - - function setUri($uri) - { - unset($this->_packageInfo['channel']); - $this->_isValid = 0; - if (!isset($this->_packageInfo['uri'])) { - // ensure that the uri tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('extends', 'summary', 'description', 'lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $uri, 'uri'); - } - $this->_packageInfo['uri'] = $uri; - } - - function setChannel($channel) - { - unset($this->_packageInfo['uri']); - $this->_isValid = 0; - if (!isset($this->_packageInfo['channel'])) { - // ensure that the channel tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('extends', 'summary', 'description', 'lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $channel, 'channel'); - } - $this->_packageInfo['channel'] = $channel; - } - - function setExtends($extends) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['extends'])) { - // ensure that the extends tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('summary', 'description', 'lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $extends, 'extends'); - } - $this->_packageInfo['extends'] = $extends; - } - - function setSummary($summary) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['summary'])) { - // ensure that the summary tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('description', 'lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $summary, 'summary'); - } - $this->_packageInfo['summary'] = $summary; - } - - function setDescription($desc) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['description'])) { - // ensure that the description tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $desc, 'description'); - } - $this->_packageInfo['description'] = $desc; - } - - /** - * Adds a new maintainer - no checking of duplicates is performed, use - * updatemaintainer for that purpose. - */ - function addMaintainer($role, $handle, $name, $email, $active = 'yes') - { - if (!in_array($role, array('lead', 'developer', 'contributor', 'helper'))) { - return false; - } - if (isset($this->_packageInfo[$role])) { - if (!isset($this->_packageInfo[$role][0])) { - $this->_packageInfo[$role] = array($this->_packageInfo[$role]); - } - $this->_packageInfo[$role][] = - array( - 'name' => $name, - 'user' => $handle, - 'email' => $email, - 'active' => $active, - ); - } else { - $testarr = array('lead', - 'developer', 'contributor', 'helper', 'date', 'time', 'version', - 'stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'); - foreach (array('lead', 'developer', 'contributor', 'helper') as $testrole) { - array_shift($testarr); - if ($role == $testrole) { - break; - } - } - if (!isset($this->_packageInfo[$role])) { - // ensure that the extends tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, $testarr, - array(), $role); - } - $this->_packageInfo[$role] = - array( - 'name' => $name, - 'user' => $handle, - 'email' => $email, - 'active' => $active, - ); - } - $this->_isValid = 0; - } - - function updateMaintainer($newrole, $handle, $name, $email, $active = 'yes') - { - $found = false; - foreach (array('lead', 'developer', 'contributor', 'helper') as $role) { - if (!isset($this->_packageInfo[$role])) { - continue; - } - $info = $this->_packageInfo[$role]; - if (!isset($info[0])) { - if ($info['user'] == $handle) { - $found = true; - break; - } - } - foreach ($info as $i => $maintainer) { - if ($maintainer['user'] == $handle) { - $found = $i; - break 2; - } - } - } - if ($found === false) { - return $this->addMaintainer($newrole, $handle, $name, $email, $active); - } - if ($found !== false) { - if ($found === true) { - unset($this->_packageInfo[$role]); - } else { - unset($this->_packageInfo[$role][$found]); - $this->_packageInfo[$role] = array_values($this->_packageInfo[$role]); - } - } - $this->addMaintainer($newrole, $handle, $name, $email, $active); - $this->_isValid = 0; - } - - function deleteMaintainer($handle) - { - $found = false; - foreach (array('lead', 'developer', 'contributor', 'helper') as $role) { - if (!isset($this->_packageInfo[$role])) { - continue; - } - if (!isset($this->_packageInfo[$role][0])) { - $this->_packageInfo[$role] = array($this->_packageInfo[$role]); - } - foreach ($this->_packageInfo[$role] as $i => $maintainer) { - if ($maintainer['user'] == $handle) { - $found = $i; - break; - } - } - if ($found !== false) { - unset($this->_packageInfo[$role][$found]); - if (!count($this->_packageInfo[$role]) && $role == 'lead') { - $this->_isValid = 0; - } - if (!count($this->_packageInfo[$role])) { - unset($this->_packageInfo[$role]); - return true; - } - $this->_packageInfo[$role] = - array_values($this->_packageInfo[$role]); - if (count($this->_packageInfo[$role]) == 1) { - $this->_packageInfo[$role] = $this->_packageInfo[$role][0]; - } - return true; - } - if (count($this->_packageInfo[$role]) == 1) { - $this->_packageInfo[$role] = $this->_packageInfo[$role][0]; - } - } - return false; - } - - function setReleaseVersion($version) - { - if (isset($this->_packageInfo['version']) && - isset($this->_packageInfo['version']['release'])) { - unset($this->_packageInfo['version']['release']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array( - 'version' => array('stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), - 'release' => array('api'))); - $this->_isValid = 0; - } - - function setAPIVersion($version) - { - if (isset($this->_packageInfo['version']) && - isset($this->_packageInfo['version']['api'])) { - unset($this->_packageInfo['version']['api']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array( - 'version' => array('stability', 'license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), - 'api' => array())); - $this->_isValid = 0; - } - - /** - * snapshot|devel|alpha|beta|stable - */ - function setReleaseStability($state) - { - if (isset($this->_packageInfo['stability']) && - isset($this->_packageInfo['stability']['release'])) { - unset($this->_packageInfo['stability']['release']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array( - 'stability' => array('license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), - 'release' => array('api'))); - $this->_isValid = 0; - } - - /** - * @param devel|alpha|beta|stable - */ - function setAPIStability($state) - { - if (isset($this->_packageInfo['stability']) && - isset($this->_packageInfo['stability']['api'])) { - unset($this->_packageInfo['stability']['api']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array( - 'stability' => array('license', 'notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), - 'api' => array())); - $this->_isValid = 0; - } - - function setLicense($license, $uri = false, $filesource = false) - { - if (!isset($this->_packageInfo['license'])) { - // ensure that the license tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('notes', 'contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), 0, 'license'); - } - if ($uri || $filesource) { - $attribs = array(); - if ($uri) { - $attribs['uri'] = $uri; - } - $uri = true; // for test below - if ($filesource) { - $attribs['filesource'] = $filesource; - } - } - $license = $uri ? array('attribs' => $attribs, '_content' => $license) : $license; - $this->_packageInfo['license'] = $license; - $this->_isValid = 0; - } - - function setNotes($notes) - { - $this->_isValid = 0; - if (!isset($this->_packageInfo['notes'])) { - // ensure that the notes tag is set up in the right location - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('contents', 'compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'extbinrelease', 'bundle', 'changelog'), $notes, 'notes'); - } - $this->_packageInfo['notes'] = $notes; - } - - /** - * This is only used at install-time, after all serialization - * is over. - * @param string file name - * @param string installed path - */ - function setInstalledAs($file, $path) - { - if ($path) { - return $this->_packageInfo['filelist'][$file]['installed_as'] = $path; - } - unset($this->_packageInfo['filelist'][$file]['installed_as']); - } - - /** - * This is only used at install-time, after all serialization - * is over. - */ - function installedFile($file, $atts) - { - if (isset($this->_packageInfo['filelist'][$file])) { - $this->_packageInfo['filelist'][$file] = - array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']); - } else { - $this->_packageInfo['filelist'][$file] = $atts['attribs']; - } - } - - /** - * Reset the listing of package contents - * @param string base installation dir for the whole package, if any - */ - function clearContents($baseinstall = false) - { - $this->_filesValid = false; - $this->_isValid = 0; - if (!isset($this->_packageInfo['contents'])) { - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('compatible', - 'dependencies', 'providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), array(), 'contents'); - } - if ($this->getPackageType() != 'bundle') { - $this->_packageInfo['contents'] = - array('dir' => array('attribs' => array('name' => '/'))); - if ($baseinstall) { - $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'] = $baseinstall; - } - } else { - $this->_packageInfo['contents'] = array('bundledpackage' => array()); - } - } - - /** - * @param string relative path of the bundled package. - */ - function addBundledPackage($path) - { - if ($this->getPackageType() != 'bundle') { - return false; - } - $this->_filesValid = false; - $this->_isValid = 0; - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $path, array( - 'contents' => array('compatible', 'dependencies', 'providesextension', - 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', - 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), - 'bundledpackage' => array())); - } - - /** - * @param string file name - * @param PEAR_Task_Common a read/write task - */ - function addTaskToFile($filename, $task) - { - if (!method_exists($task, 'getXml')) { - return false; - } - if (!method_exists($task, 'getName')) { - return false; - } - if (!method_exists($task, 'validate')) { - return false; - } - if (!$task->validate()) { - return false; - } - if (!isset($this->_packageInfo['contents']['dir']['file'])) { - return false; - } - $this->getTasksNs(); // discover the tasks namespace if not done already - $files = $this->_packageInfo['contents']['dir']['file']; - if (!isset($files[0])) { - $files = array($files); - $ind = false; - } else { - $ind = true; - } - foreach ($files as $i => $file) { - if (isset($file['attribs'])) { - if ($file['attribs']['name'] == $filename) { - if ($ind) { - $t = isset($this->_packageInfo['contents']['dir']['file'][$i] - ['attribs'][$this->_tasksNs . - ':' . $task->getName()]) ? - $this->_packageInfo['contents']['dir']['file'][$i] - ['attribs'][$this->_tasksNs . - ':' . $task->getName()] : false; - if ($t && !isset($t[0])) { - $this->_packageInfo['contents']['dir']['file'][$i] - [$this->_tasksNs . ':' . $task->getName()] = array($t); - } - $this->_packageInfo['contents']['dir']['file'][$i][$this->_tasksNs . - ':' . $task->getName()][] = $task->getXml(); - } else { - $t = isset($this->_packageInfo['contents']['dir']['file'] - ['attribs'][$this->_tasksNs . - ':' . $task->getName()]) ? $this->_packageInfo['contents']['dir']['file'] - ['attribs'][$this->_tasksNs . - ':' . $task->getName()] : false; - if ($t && !isset($t[0])) { - $this->_packageInfo['contents']['dir']['file'] - [$this->_tasksNs . ':' . $task->getName()] = array($t); - } - $this->_packageInfo['contents']['dir']['file'][$this->_tasksNs . - ':' . $task->getName()][] = $task->getXml(); - } - return true; - } - } - } - return false; - } - - /** - * @param string path to the file - * @param string filename - * @param array extra attributes - */ - function addFile($dir, $file, $attrs) - { - if ($this->getPackageType() == 'bundle') { - return false; - } - $this->_filesValid = false; - $this->_isValid = 0; - $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir); - if ($dir == '/' || $dir == '') { - $dir = ''; - } else { - $dir .= '/'; - } - $attrs['name'] = $dir . $file; - if (!isset($this->_packageInfo['contents'])) { - // ensure that the contents tag is set up - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, - array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), array(), 'contents'); - } - if (isset($this->_packageInfo['contents']['dir']['file'])) { - if (!isset($this->_packageInfo['contents']['dir']['file'][0])) { - $this->_packageInfo['contents']['dir']['file'] = - array($this->_packageInfo['contents']['dir']['file']); - } - $this->_packageInfo['contents']['dir']['file'][]['attribs'] = $attrs; - } else { - $this->_packageInfo['contents']['dir']['file']['attribs'] = $attrs; - } - } - - /** - * @param string Dependent package name - * @param string Dependent package's channel name - * @param string minimum version of specified package that this release is guaranteed to be - * compatible with - * @param string maximum version of specified package that this release is guaranteed to be - * compatible with - * @param string versions of specified package that this release is not compatible with - */ - function addCompatiblePackage($name, $channel, $min, $max, $exclude = false) - { - $this->_isValid = 0; - $set = array( - 'name' => $name, - 'channel' => $channel, - 'min' => $min, - 'max' => $max, - ); - if ($exclude) { - $set['exclude'] = $exclude; - } - $this->_isValid = 0; - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( - 'compatible' => array('dependencies', 'providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') - )); - } - - /** - * Removes the tag entirely - */ - function resetUsesrole() - { - if (isset($this->_packageInfo['usesrole'])) { - unset($this->_packageInfo['usesrole']); - } - } - - /** - * @param string - * @param string package name or uri - * @param string channel name if non-uri - */ - function addUsesrole($role, $packageOrUri, $channel = false) { - $set = array('role' => $role); - if ($channel) { - $set['package'] = $packageOrUri; - $set['channel'] = $channel; - } else { - $set['uri'] = $packageOrUri; - } - $this->_isValid = 0; - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( - 'usesrole' => array('usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') - )); - } - - /** - * Removes the tag entirely - */ - function resetUsestask() - { - if (isset($this->_packageInfo['usestask'])) { - unset($this->_packageInfo['usestask']); - } - } - - - /** - * @param string - * @param string package name or uri - * @param string channel name if non-uri - */ - function addUsestask($task, $packageOrUri, $channel = false) { - $set = array('task' => $task); - if ($channel) { - $set['package'] = $packageOrUri; - $set['channel'] = $channel; - } else { - $set['uri'] = $packageOrUri; - } - $this->_isValid = 0; - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( - 'usestask' => array('srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') - )); - } - - /** - * Remove all compatible tags - */ - function clearCompatible() - { - unset($this->_packageInfo['compatible']); - } - - /** - * Reset dependencies prior to adding new ones - */ - function clearDeps() - { - if (!isset($this->_packageInfo['dependencies'])) { - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(), - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'))); - } - $this->_packageInfo['dependencies'] = array(); - } - - /** - * @param string minimum PHP version allowed - * @param string maximum PHP version allowed - * @param array $exclude incompatible PHP versions - */ - function setPhpDep($min, $max = false, $exclude = false) - { - $this->_isValid = 0; - $dep = - array( - 'min' => $min, - ); - if ($max) { - $dep['max'] = $max; - } - if ($exclude) { - if (count($exclude) == 1) { - $exclude = $exclude[0]; - } - $dep['exclude'] = $exclude; - } - if (isset($this->_packageInfo['dependencies']['required']['php'])) { - $this->_stack->push(__FUNCTION__, 'warning', array('dep' => - $this->_packageInfo['dependencies']['required']['php']), - 'warning: PHP dependency already exists, overwriting'); - unset($this->_packageInfo['dependencies']['required']['php']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'php' => array('pearinstaller', 'package', 'subpackage', 'extension', 'os', 'arch') - )); - return true; - } - - /** - * @param string minimum allowed PEAR installer version - * @param string maximum allowed PEAR installer version - * @param string recommended PEAR installer version - * @param array incompatible version of the PEAR installer - */ - function setPearinstallerDep($min, $max = false, $recommended = false, $exclude = false) - { - $this->_isValid = 0; - $dep = - array( - 'min' => $min, - ); - if ($max) { - $dep['max'] = $max; - } - if ($recommended) { - $dep['recommended'] = $recommended; - } - if ($exclude) { - if (count($exclude) == 1) { - $exclude = $exclude[0]; - } - $dep['exclude'] = $exclude; - } - if (isset($this->_packageInfo['dependencies']['required']['pearinstaller'])) { - $this->_stack->push(__FUNCTION__, 'warning', array('dep' => - $this->_packageInfo['dependencies']['required']['pearinstaller']), - 'warning: PEAR Installer dependency already exists, overwriting'); - unset($this->_packageInfo['dependencies']['required']['pearinstaller']); - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'pearinstaller' => array('package', 'subpackage', 'extension', 'os', 'arch') - )); - } - - /** - * Mark a package as conflicting with this package - * @param string package name - * @param string package channel - * @param string extension this package provides, if any - * @param string|false minimum version required - * @param string|false maximum version allowed - * @param array|false versions to exclude from installation - */ - function addConflictingPackageDepWithChannel($name, $channel, - $providesextension = false, $min = false, $max = false, $exclude = false) - { - $this->_isValid = 0; - $dep = $this->_constructDep($name, $channel, false, $min, $max, false, - $exclude, $providesextension, false, true); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'package' => array('subpackage', 'extension', 'os', 'arch') - )); - } - - /** - * Mark a package as conflicting with this package - * @param string package name - * @param string package channel - * @param string extension this package provides, if any - */ - function addConflictingPackageDepWithUri($name, $uri, $providesextension = false) - { - $this->_isValid = 0; - $dep = - array( - 'name' => $name, - 'uri' => $uri, - 'conflicts' => '', - ); - if ($providesextension) { - $dep['providesextension'] = $providesextension; - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'package' => array('subpackage', 'extension', 'os', 'arch') - )); - } - - function addDependencyGroup($name, $hint) - { - $this->_isValid = 0; - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, - array('attribs' => array('name' => $name, 'hint' => $hint)), - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'group' => array(), - )); - } - - /** - * @param string package name - * @param string|false channel name, false if this is a uri - * @param string|false uri name, false if this is a channel - * @param string|false minimum version required - * @param string|false maximum version allowed - * @param string|false recommended installation version - * @param array|false versions to exclude from installation - * @param string extension this package provides, if any - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - * @param bool if true, tells the installer to negate this dependency (conflicts) - * @return array - * @access private - */ - function _constructDep($name, $channel, $uri, $min, $max, $recommended, $exclude, - $providesextension = false, $nodefault = false, - $conflicts = false) - { - $dep = - array( - 'name' => $name, - ); - if ($channel) { - $dep['channel'] = $channel; - } elseif ($uri) { - $dep['uri'] = $uri; - } - if ($min) { - $dep['min'] = $min; - } - if ($max) { - $dep['max'] = $max; - } - if ($recommended) { - $dep['recommended'] = $recommended; - } - if ($exclude) { - if (is_array($exclude) && count($exclude) == 1) { - $exclude = $exclude[0]; - } - $dep['exclude'] = $exclude; - } - if ($conflicts) { - $dep['conflicts'] = ''; - } - if ($nodefault) { - $dep['nodefault'] = ''; - } - if ($providesextension) { - $dep['providesextension'] = $providesextension; - } - return $dep; - } - - /** - * @param package|subpackage - * @param string group name - * @param string package name - * @param string package channel - * @param string minimum version - * @param string maximum version - * @param string recommended version - * @param array|false optional excluded versions - * @param string extension this package provides, if any - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - * @return bool false if the dependency group has not been initialized with - * {@link addDependencyGroup()}, or a subpackage is added with - * a providesextension - */ - function addGroupPackageDepWithChannel($type, $groupname, $name, $channel, $min = false, - $max = false, $recommended = false, $exclude = false, - $providesextension = false, $nodefault = false) - { - if ($type == 'subpackage' && $providesextension) { - return false; // subpackages must be php packages - } - $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude, - $providesextension, $nodefault); - return $this->_addGroupDependency($type, $dep, $groupname); - } - - /** - * @param package|subpackage - * @param string group name - * @param string package name - * @param string package uri - * @param string extension this package provides, if any - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - * @return bool false if the dependency group has not been initialized with - * {@link addDependencyGroup()} - */ - function addGroupPackageDepWithURI($type, $groupname, $name, $uri, $providesextension = false, - $nodefault = false) - { - if ($type == 'subpackage' && $providesextension) { - return false; // subpackages must be php packages - } - $dep = $this->_constructDep($name, false, $uri, false, false, false, false, - $providesextension, $nodefault); - return $this->_addGroupDependency($type, $dep, $groupname); - } - - /** - * @param string group name (must be pre-existing) - * @param string extension name - * @param string minimum version allowed - * @param string maximum version allowed - * @param string recommended version - * @param array incompatible versions - */ - function addGroupExtensionDep($groupname, $name, $min = false, $max = false, - $recommended = false, $exclude = false) - { - $this->_isValid = 0; - $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude); - return $this->_addGroupDependency('extension', $dep, $groupname); - } - - /** - * @param package|subpackage|extension - * @param array dependency contents - * @param string name of the dependency group to add this to - * @return boolean - * @access private - */ - function _addGroupDependency($type, $dep, $groupname) - { - $arr = array('subpackage', 'extension'); - if ($type != 'package') { - array_shift($arr); - } - if ($type == 'extension') { - array_shift($arr); - } - if (!isset($this->_packageInfo['dependencies']['group'])) { - return false; - } else { - if (!isset($this->_packageInfo['dependencies']['group'][0])) { - if ($this->_packageInfo['dependencies']['group']['attribs']['name'] == $groupname) { - $this->_packageInfo['dependencies']['group'] = $this->_mergeTag( - $this->_packageInfo['dependencies']['group'], $dep, - array( - $type => $arr - )); - $this->_isValid = 0; - return true; - } else { - return false; - } - } else { - foreach ($this->_packageInfo['dependencies']['group'] as $i => $group) { - if ($group['attribs']['name'] == $groupname) { - $this->_packageInfo['dependencies']['group'][$i] = $this->_mergeTag( - $this->_packageInfo['dependencies']['group'][$i], $dep, - array( - $type => $arr - )); - $this->_isValid = 0; - return true; - } - } - return false; - } - } - } - - /** - * @param optional|required - * @param string package name - * @param string package channel - * @param string minimum version - * @param string maximum version - * @param string recommended version - * @param string extension this package provides, if any - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - * @param array|false optional excluded versions - */ - function addPackageDepWithChannel($type, $name, $channel, $min = false, $max = false, - $recommended = false, $exclude = false, - $providesextension = false, $nodefault = false) - { - if (!in_array($type, array('optional', 'required'), true)) { - $type = 'required'; - } - $this->_isValid = 0; - $arr = array('optional', 'group'); - if ($type != 'required') { - array_shift($arr); - } - $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude, - $providesextension, $nodefault); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - $type => $arr, - 'package' => array('subpackage', 'extension', 'os', 'arch') - )); - } - - /** - * @param optional|required - * @param string name of the package - * @param string uri of the package - * @param string extension this package provides, if any - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - */ - function addPackageDepWithUri($type, $name, $uri, $providesextension = false, - $nodefault = false) - { - $this->_isValid = 0; - $arr = array('optional', 'group'); - if ($type != 'required') { - array_shift($arr); - } - $dep = $this->_constructDep($name, false, $uri, false, false, false, false, - $providesextension, $nodefault); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - $type => $arr, - 'package' => array('subpackage', 'extension', 'os', 'arch') - )); - } - - /** - * @param optional|required optional, required - * @param string package name - * @param string package channel - * @param string minimum version - * @param string maximum version - * @param string recommended version - * @param array incompatible versions - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - */ - function addSubpackageDepWithChannel($type, $name, $channel, $min = false, $max = false, - $recommended = false, $exclude = false, - $nodefault = false) - { - $this->_isValid = 0; - $arr = array('optional', 'group'); - if ($type != 'required') { - array_shift($arr); - } - $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude, - $nodefault); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - $type => $arr, - 'subpackage' => array('extension', 'os', 'arch') - )); - } - - /** - * @param optional|required optional, required - * @param string package name - * @param string package uri for download - * @param bool if true, tells the installer to ignore the default optional dependency group - * when installing this package - */ - function addSubpackageDepWithUri($type, $name, $uri, $nodefault = false) - { - $this->_isValid = 0; - $arr = array('optional', 'group'); - if ($type != 'required') { - array_shift($arr); - } - $dep = $this->_constructDep($name, false, $uri, false, false, false, false, $nodefault); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - $type => $arr, - 'subpackage' => array('extension', 'os', 'arch') - )); - } - - /** - * @param optional|required optional, required - * @param string extension name - * @param string minimum version - * @param string maximum version - * @param string recommended version - * @param array incompatible versions - */ - function addExtensionDep($type, $name, $min = false, $max = false, $recommended = false, - $exclude = false) - { - $this->_isValid = 0; - $arr = array('optional', 'group'); - if ($type != 'required') { - array_shift($arr); - } - $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude); - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - $type => $arr, - 'extension' => array('os', 'arch') - )); - } - - /** - * @param string Operating system name - * @param boolean true if this package cannot be installed on this OS - */ - function addOsDep($name, $conflicts = false) - { - $this->_isValid = 0; - $dep = array('name' => $name); - if ($conflicts) { - $dep['conflicts'] = ''; - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'os' => array('arch') - )); - } - - /** - * @param string Architecture matching pattern - * @param boolean true if this package cannot be installed on this architecture - */ - function addArchDep($pattern, $conflicts = false) - { - $this->_isValid = 0; - $dep = array('pattern' => $pattern); - if ($conflicts) { - $dep['conflicts'] = ''; - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep, - array( - 'dependencies' => array('providesextension', 'usesrole', 'usestask', - 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), - 'required' => array('optional', 'group'), - 'arch' => array() - )); - } - - /** - * Set the kind of package, and erase all release tags - * - * - a php package is a PEAR-style package - * - an extbin package is a PECL-style extension binary - * - an extsrc package is a PECL-style source for a binary - * - an zendextbin package is a PECL-style zend extension binary - * - an zendextsrc package is a PECL-style source for a zend extension binary - * - a bundle package is a collection of other pre-packaged packages - * @param php|extbin|extsrc|zendextsrc|zendextbin|bundle - * @return bool success - */ - function setPackageType($type) - { - $this->_isValid = 0; - if (!in_array($type, array('php', 'extbin', 'extsrc', 'zendextsrc', - 'zendextbin', 'bundle'))) { - return false; - } - - if (in_array($type, array('zendextsrc', 'zendextbin'))) { - $this->_setPackageVersion2_1(); - } - - if ($type != 'bundle') { - $type .= 'release'; - } - - foreach (array('phprelease', 'extbinrelease', 'extsrcrelease', - 'zendextsrcrelease', 'zendextbinrelease', 'bundle') as $test) { - unset($this->_packageInfo[$test]); - } - - if (!isset($this->_packageInfo[$type])) { - // ensure that the release tag is set up - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('changelog'), - array(), $type); - } - - $this->_packageInfo[$type] = array(); - return true; - } - - /** - * @return bool true if package type is set up - */ - function addRelease() - { - if ($type = $this->getPackageType()) { - if ($type != 'bundle') { - $type .= 'release'; - } - $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(), - array($type => array('changelog'))); - return true; - } - return false; - } - - /** - * Get the current release tag in order to add to it - * @param bool returns only releases that have installcondition if true - * @return array|null - */ - function &_getCurrentRelease($strict = true) - { - if ($p = $this->getPackageType()) { - if ($strict) { - if ($p == 'extsrc' || $p == 'zendextsrc') { - $a = null; - return $a; - } - } - if ($p != 'bundle') { - $p .= 'release'; - } - if (isset($this->_packageInfo[$p][0])) { - return $this->_packageInfo[$p][count($this->_packageInfo[$p]) - 1]; - } else { - return $this->_packageInfo[$p]; - } - } else { - $a = null; - return $a; - } - } - - /** - * Add a file to the current release that should be installed under a different name - * @param string path to file - * @param string name the file should be installed as - */ - function addInstallAs($path, $as) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - $r = $this->_mergeTag($r, array('attribs' => array('name' => $path, 'as' => $as)), - array( - 'filelist' => array(), - 'install' => array('ignore') - )); - } - - /** - * Add a file to the current release that should be ignored - * @param string path to file - * @return bool success of operation - */ - function addIgnore($path) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - $r = $this->_mergeTag($r, array('attribs' => array('name' => $path)), - array( - 'filelist' => array(), - 'ignore' => array() - )); - } - - /** - * Add an extension binary package for this extension source code release - * - * Note that the package must be from the same channel as the extension source package - * @param string - */ - function addBinarypackage($package) - { - if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { - return false; - } - $r = &$this->_getCurrentRelease(false); - if ($r === null) { - return false; - } - $this->_isValid = 0; - $r = $this->_mergeTag($r, $package, - array( - 'binarypackage' => array('filelist'), - )); - } - - /** - * Add a configureoption to an extension source package - * @param string - * @param string - * @param string - */ - function addConfigureOption($name, $prompt, $default = null) - { - if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { - return false; - } - - $r = &$this->_getCurrentRelease(false); - if ($r === null) { - return false; - } - - $opt = array('attribs' => array('name' => $name, 'prompt' => $prompt)); - if ($default !== null) { - $opt['attribs']['default'] = $default; - } - - $this->_isValid = 0; - $r = $this->_mergeTag($r, $opt, - array( - 'configureoption' => array('binarypackage', 'filelist'), - )); - } - - /** - * Set an installation condition based on php version for the current release set - * @param string minimum version - * @param string maximum version - * @param false|array incompatible versions of PHP - */ - function setPhpInstallCondition($min, $max, $exclude = false) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - if (isset($r['installconditions']['php'])) { - unset($r['installconditions']['php']); - } - $dep = array('min' => $min, 'max' => $max); - if ($exclude) { - if (is_array($exclude) && count($exclude) == 1) { - $exclude = $exclude[0]; - } - $dep['exclude'] = $exclude; - } - if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('configureoption', 'binarypackage', - 'filelist'), - 'php' => array('extension', 'os', 'arch') - )); - } else { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('filelist'), - 'php' => array('extension', 'os', 'arch') - )); - } - } - - /** - * @param optional|required optional, required - * @param string extension name - * @param string minimum version - * @param string maximum version - * @param string recommended version - * @param array incompatible versions - */ - function addExtensionInstallCondition($name, $min = false, $max = false, $recommended = false, - $exclude = false) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude); - if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('configureoption', 'binarypackage', - 'filelist'), - 'extension' => array('os', 'arch') - )); - } else { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('filelist'), - 'extension' => array('os', 'arch') - )); - } - } - - /** - * Set an installation condition based on operating system for the current release set - * @param string OS name - * @param bool whether this OS is incompatible with the current release - */ - function setOsInstallCondition($name, $conflicts = false) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - if (isset($r['installconditions']['os'])) { - unset($r['installconditions']['os']); - } - $dep = array('name' => $name); - if ($conflicts) { - $dep['conflicts'] = ''; - } - if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('configureoption', 'binarypackage', - 'filelist'), - 'os' => array('arch') - )); - } else { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('filelist'), - 'os' => array('arch') - )); - } - } - - /** - * Set an installation condition based on architecture for the current release set - * @param string architecture pattern - * @param bool whether this arch is incompatible with the current release - */ - function setArchInstallCondition($pattern, $conflicts = false) - { - $r = &$this->_getCurrentRelease(); - if ($r === null) { - return false; - } - $this->_isValid = 0; - if (isset($r['installconditions']['arch'])) { - unset($r['installconditions']['arch']); - } - $dep = array('pattern' => $pattern); - if ($conflicts) { - $dep['conflicts'] = ''; - } - if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('configureoption', 'binarypackage', - 'filelist'), - 'arch' => array() - )); - } else { - $r = $this->_mergeTag($r, $dep, - array( - 'installconditions' => array('filelist'), - 'arch' => array() - )); - } - } - - /** - * For extension binary releases, this is used to specify either the - * static URI to a source package, or the package name and channel of the extsrc/zendextsrc - * package it is based on. - * @param string Package name, or full URI to source package (extsrc/zendextsrc type) - */ - function setSourcePackage($packageOrUri) - { - $this->_isValid = 0; - if (isset($this->_packageInfo['channel'])) { - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease', - 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), - $packageOrUri, 'srcpackage'); - } else { - $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease', - 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', - 'bundle', 'changelog'), $packageOrUri, 'srcuri'); - } - } - - /** - * Generate a valid change log entry from the current package.xml - * @param string|false - */ - function generateChangeLogEntry($notes = false) - { - return array( - 'version' => - array( - 'release' => $this->getVersion('release'), - 'api' => $this->getVersion('api'), - ), - 'stability' => - $this->getStability(), - 'date' => $this->getDate(), - 'license' => $this->getLicense(true), - 'notes' => $notes ? $notes : $this->getNotes() - ); - } - - /** - * @param string release version to set change log notes for - * @param array output of {@link generateChangeLogEntry()} - */ - function setChangelogEntry($releaseversion, $contents) - { - if (!isset($this->_packageInfo['changelog'])) { - $this->_packageInfo['changelog']['release'] = $contents; - return; - } - if (!isset($this->_packageInfo['changelog']['release'][0])) { - if ($this->_packageInfo['changelog']['release']['version']['release'] == $releaseversion) { - $this->_packageInfo['changelog']['release'] = array( - $this->_packageInfo['changelog']['release']); - } else { - $this->_packageInfo['changelog']['release'] = array( - $this->_packageInfo['changelog']['release']); - return $this->_packageInfo['changelog']['release'][] = $contents; - } - } - foreach($this->_packageInfo['changelog']['release'] as $index => $changelog) { - if (isset($changelog['version']) && - strnatcasecmp($changelog['version']['release'], $releaseversion) == 0) { - $curlog = $index; - } - } - if (isset($curlog)) { - $this->_packageInfo['changelog']['release'][$curlog] = $contents; - } else { - $this->_packageInfo['changelog']['release'][] = $contents; - } - } - - /** - * Remove the changelog entirely - */ - function clearChangeLog() - { - unset($this->_packageInfo['changelog']); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Packager.php b/3rdparty/PEAR/Packager.php deleted file mode 100644 index 8995a167fc..0000000000 --- a/3rdparty/PEAR/Packager.php +++ /dev/null @@ -1,201 +0,0 @@ - - * @author Tomas V. V. Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Packager.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR/Common.php'; -require_once 'PEAR/PackageFile.php'; -require_once 'System.php'; - -/** - * Administration class used to make a PEAR release tarball. - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 0.1 - */ -class PEAR_Packager extends PEAR_Common -{ - /** - * @var PEAR_Registry - */ - var $_registry; - - function package($pkgfile = null, $compress = true, $pkg2 = null) - { - // {{{ validate supplied package.xml file - if (empty($pkgfile)) { - $pkgfile = 'package.xml'; - } - - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $pkg = &new PEAR_PackageFile($this->config, $this->debug); - $pf = &$pkg->fromPackageFile($pkgfile, PEAR_VALIDATE_NORMAL); - $main = &$pf; - PEAR::staticPopErrorHandling(); - if (PEAR::isError($pf)) { - if (is_array($pf->getUserInfo())) { - foreach ($pf->getUserInfo() as $error) { - $this->log(0, 'Error: ' . $error['message']); - } - } - - $this->log(0, $pf->getMessage()); - return $this->raiseError("Cannot package, errors in package file"); - } - - foreach ($pf->getValidationWarnings() as $warning) { - $this->log(1, 'Warning: ' . $warning['message']); - } - - // }}} - if ($pkg2) { - $this->log(0, 'Attempting to process the second package file'); - PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $pf2 = &$pkg->fromPackageFile($pkg2, PEAR_VALIDATE_NORMAL); - PEAR::staticPopErrorHandling(); - if (PEAR::isError($pf2)) { - if (is_array($pf2->getUserInfo())) { - foreach ($pf2->getUserInfo() as $error) { - $this->log(0, 'Error: ' . $error['message']); - } - } - $this->log(0, $pf2->getMessage()); - return $this->raiseError("Cannot package, errors in second package file"); - } - - foreach ($pf2->getValidationWarnings() as $warning) { - $this->log(1, 'Warning: ' . $warning['message']); - } - - if ($pf2->getPackagexmlVersion() == '2.0' || - $pf2->getPackagexmlVersion() == '2.1' - ) { - $main = &$pf2; - $other = &$pf; - } else { - $main = &$pf; - $other = &$pf2; - } - - if ($main->getPackagexmlVersion() != '2.0' && - $main->getPackagexmlVersion() != '2.1') { - return PEAR::raiseError('Error: cannot package two package.xml version 1.0, can ' . - 'only package together a package.xml 1.0 and package.xml 2.0'); - } - - if ($other->getPackagexmlVersion() != '1.0') { - return PEAR::raiseError('Error: cannot package two package.xml version 2.0, can ' . - 'only package together a package.xml 1.0 and package.xml 2.0'); - } - } - - $main->setLogger($this); - if (!$main->validate(PEAR_VALIDATE_PACKAGING)) { - foreach ($main->getValidationWarnings() as $warning) { - $this->log(0, 'Error: ' . $warning['message']); - } - return $this->raiseError("Cannot package, errors in package"); - } - - foreach ($main->getValidationWarnings() as $warning) { - $this->log(1, 'Warning: ' . $warning['message']); - } - - if ($pkg2) { - $other->setLogger($this); - $a = false; - if (!$other->validate(PEAR_VALIDATE_NORMAL) || $a = !$main->isEquivalent($other)) { - foreach ($other->getValidationWarnings() as $warning) { - $this->log(0, 'Error: ' . $warning['message']); - } - - foreach ($main->getValidationWarnings() as $warning) { - $this->log(0, 'Error: ' . $warning['message']); - } - - if ($a) { - return $this->raiseError('The two package.xml files are not equivalent!'); - } - - return $this->raiseError("Cannot package, errors in package"); - } - - foreach ($other->getValidationWarnings() as $warning) { - $this->log(1, 'Warning: ' . $warning['message']); - } - - $gen = &$main->getDefaultGenerator(); - $tgzfile = $gen->toTgz2($this, $other, $compress); - if (PEAR::isError($tgzfile)) { - return $tgzfile; - } - - $dest_package = basename($tgzfile); - $pkgdir = dirname($pkgfile); - - // TAR the Package ------------------------------------------- - $this->log(1, "Package $dest_package done"); - if (file_exists("$pkgdir/CVS/Root")) { - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion()); - $cvstag = "RELEASE_$cvsversion"; - $this->log(1, 'Tag the released code with "pear cvstag ' . - $main->getPackageFile() . '"'); - $this->log(1, "(or set the CVS tag $cvstag by hand)"); - } elseif (file_exists("$pkgdir/.svn")) { - $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion()); - $svntag = $pf->getName() . "-$svnversion"; - $this->log(1, 'Tag the released code with "pear svntag ' . - $main->getPackageFile() . '"'); - $this->log(1, "(or set the SVN tag $svntag by hand)"); - } - } else { // this branch is executed for single packagefile packaging - $gen = &$pf->getDefaultGenerator(); - $tgzfile = $gen->toTgz($this, $compress); - if (PEAR::isError($tgzfile)) { - $this->log(0, $tgzfile->getMessage()); - return $this->raiseError("Cannot package, errors in package"); - } - - $dest_package = basename($tgzfile); - $pkgdir = dirname($pkgfile); - - // TAR the Package ------------------------------------------- - $this->log(1, "Package $dest_package done"); - if (file_exists("$pkgdir/CVS/Root")) { - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion()); - $cvstag = "RELEASE_$cvsversion"; - $this->log(1, "Tag the released code with `pear cvstag $pkgfile'"); - $this->log(1, "(or set the CVS tag $cvstag by hand)"); - } elseif (file_exists("$pkgdir/.svn")) { - $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion()); - $svntag = $pf->getName() . "-$svnversion"; - $this->log(1, "Tag the released code with `pear svntag $pkgfile'"); - $this->log(1, "(or set the SVN tag $svntag by hand)"); - } - } - - return $dest_package; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/REST.php b/3rdparty/PEAR/REST.php deleted file mode 100644 index 34a804f2bd..0000000000 --- a/3rdparty/PEAR/REST.php +++ /dev/null @@ -1,483 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: REST.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * For downloading xml files - */ -require_once 'PEAR.php'; -require_once 'PEAR/XMLParser.php'; - -/** - * Intelligently retrieve data, following hyperlinks if necessary, and re-directing - * as well - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_REST -{ - var $config; - var $_options; - - function PEAR_REST(&$config, $options = array()) - { - $this->config = &$config; - $this->_options = $options; - } - - /** - * Retrieve REST data, but always retrieve the local cache if it is available. - * - * This is useful for elements that should never change, such as information on a particular - * release - * @param string full URL to this resource - * @param array|false contents of the accept-encoding header - * @param boolean if true, xml will be returned as a string, otherwise, xml will be - * parsed using PEAR_XMLParser - * @return string|array - */ - function retrieveCacheFirst($url, $accept = false, $forcestring = false, $channel = false) - { - $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR . - md5($url) . 'rest.cachefile'; - - if (file_exists($cachefile)) { - return unserialize(implode('', file($cachefile))); - } - - return $this->retrieveData($url, $accept, $forcestring, $channel); - } - - /** - * Retrieve a remote REST resource - * @param string full URL to this resource - * @param array|false contents of the accept-encoding header - * @param boolean if true, xml will be returned as a string, otherwise, xml will be - * parsed using PEAR_XMLParser - * @return string|array - */ - function retrieveData($url, $accept = false, $forcestring = false, $channel = false) - { - $cacheId = $this->getCacheId($url); - if ($ret = $this->useLocalCache($url, $cacheId)) { - return $ret; - } - - $file = $trieddownload = false; - if (!isset($this->_options['offline'])) { - $trieddownload = true; - $file = $this->downloadHttp($url, $cacheId ? $cacheId['lastChange'] : false, $accept, $channel); - } - - if (PEAR::isError($file)) { - if ($file->getCode() !== -9276) { - return $file; - } - - $trieddownload = false; - $file = false; // use local copy if available on socket connect error - } - - if (!$file) { - $ret = $this->getCache($url); - if (!PEAR::isError($ret) && $trieddownload) { - // reset the age of the cache if the server says it was unmodified - $result = $this->saveCache($url, $ret, null, true, $cacheId); - if (PEAR::isError($result)) { - return PEAR::raiseError($result->getMessage()); - } - } - - return $ret; - } - - if (is_array($file)) { - $headers = $file[2]; - $lastmodified = $file[1]; - $content = $file[0]; - } else { - $headers = array(); - $lastmodified = false; - $content = $file; - } - - if ($forcestring) { - $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId); - if (PEAR::isError($result)) { - return PEAR::raiseError($result->getMessage()); - } - - return $content; - } - - if (isset($headers['content-type'])) { - switch ($headers['content-type']) { - case 'text/xml' : - case 'application/xml' : - case 'text/plain' : - if ($headers['content-type'] === 'text/plain') { - $check = substr($content, 0, 5); - if ($check !== 'parse($content); - PEAR::popErrorHandling(); - if (PEAR::isError($err)) { - return PEAR::raiseError('Invalid xml downloaded from "' . $url . '": ' . - $err->getMessage()); - } - $content = $parser->getData(); - case 'text/html' : - default : - // use it as a string - } - } else { - // assume XML - $parser = new PEAR_XMLParser; - $parser->parse($content); - $content = $parser->getData(); - } - - $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId); - if (PEAR::isError($result)) { - return PEAR::raiseError($result->getMessage()); - } - - return $content; - } - - function useLocalCache($url, $cacheid = null) - { - if ($cacheid === null) { - $cacheidfile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR . - md5($url) . 'rest.cacheid'; - if (!file_exists($cacheidfile)) { - return false; - } - - $cacheid = unserialize(implode('', file($cacheidfile))); - } - - $cachettl = $this->config->get('cache_ttl'); - // If cache is newer than $cachettl seconds, we use the cache! - if (time() - $cacheid['age'] < $cachettl) { - return $this->getCache($url); - } - - return false; - } - - function getCacheId($url) - { - $cacheidfile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR . - md5($url) . 'rest.cacheid'; - - if (!file_exists($cacheidfile)) { - return false; - } - - $ret = unserialize(implode('', file($cacheidfile))); - return $ret; - } - - function getCache($url) - { - $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR . - md5($url) . 'rest.cachefile'; - - if (!file_exists($cachefile)) { - return PEAR::raiseError('No cached content available for "' . $url . '"'); - } - - return unserialize(implode('', file($cachefile))); - } - - /** - * @param string full URL to REST resource - * @param string original contents of the REST resource - * @param array HTTP Last-Modified and ETag headers - * @param bool if true, then the cache id file should be regenerated to - * trigger a new time-to-live value - */ - function saveCache($url, $contents, $lastmodified, $nochange = false, $cacheid = null) - { - $cache_dir = $this->config->get('cache_dir'); - $d = $cache_dir . DIRECTORY_SEPARATOR . md5($url); - $cacheidfile = $d . 'rest.cacheid'; - $cachefile = $d . 'rest.cachefile'; - - if (!is_dir($cache_dir)) { - if (System::mkdir(array('-p', $cache_dir)) === false) { - return PEAR::raiseError("The value of config option cache_dir ($cache_dir) is not a directory and attempts to create the directory failed."); - } - } - - if ($cacheid === null && $nochange) { - $cacheid = unserialize(implode('', file($cacheidfile))); - } - - $idData = serialize(array( - 'age' => time(), - 'lastChange' => ($nochange ? $cacheid['lastChange'] : $lastmodified), - )); - - $result = $this->saveCacheFile($cacheidfile, $idData); - if (PEAR::isError($result)) { - return $result; - } elseif ($nochange) { - return true; - } - - $result = $this->saveCacheFile($cachefile, serialize($contents)); - if (PEAR::isError($result)) { - if (file_exists($cacheidfile)) { - @unlink($cacheidfile); - } - - return $result; - } - - return true; - } - - function saveCacheFile($file, $contents) - { - $len = strlen($contents); - - $cachefile_fp = @fopen($file, 'xb'); // x is the O_CREAT|O_EXCL mode - if ($cachefile_fp !== false) { // create file - if (fwrite($cachefile_fp, $contents, $len) < $len) { - fclose($cachefile_fp); - return PEAR::raiseError("Could not write $file."); - } - } else { // update file - $cachefile_lstat = lstat($file); - $cachefile_fp = @fopen($file, 'wb'); - if (!$cachefile_fp) { - return PEAR::raiseError("Could not open $file for writing."); - } - - $cachefile_fstat = fstat($cachefile_fp); - if ( - $cachefile_lstat['mode'] == $cachefile_fstat['mode'] && - $cachefile_lstat['ino'] == $cachefile_fstat['ino'] && - $cachefile_lstat['dev'] == $cachefile_fstat['dev'] && - $cachefile_fstat['nlink'] === 1 - ) { - if (fwrite($cachefile_fp, $contents, $len) < $len) { - fclose($cachefile_fp); - return PEAR::raiseError("Could not write $file."); - } - } else { - fclose($cachefile_fp); - $link = function_exists('readlink') ? readlink($file) : $file; - return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $file . ' as it is symlinked to ' . $link . ' - Possible symlink attack'); - } - } - - fclose($cachefile_fp); - return true; - } - - /** - * Efficiently Download a file through HTTP. Returns downloaded file as a string in-memory - * This is best used for small files - * - * If an HTTP proxy has been configured (http_proxy PEAR_Config - * setting), the proxy will be used. - * - * @param string $url the URL to download - * @param string $save_dir directory to save file in - * @param false|string|array $lastmodified header values to check against for caching - * use false to return the header values from this download - * @param false|array $accept Accept headers to send - * @return string|array Returns the contents of the downloaded file or a PEAR - * error on failure. If the error is caused by - * socket-related errors, the error object will - * have the fsockopen error code available through - * getCode(). If caching is requested, then return the header - * values. - * - * @access public - */ - function downloadHttp($url, $lastmodified = null, $accept = false, $channel = false) - { - static $redirect = 0; - // always reset , so we are clean case of error - $wasredirect = $redirect; - $redirect = 0; - - $info = parse_url($url); - if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) { - return PEAR::raiseError('Cannot download non-http URL "' . $url . '"'); - } - - if (!isset($info['host'])) { - return PEAR::raiseError('Cannot download from non-URL "' . $url . '"'); - } - - $host = isset($info['host']) ? $info['host'] : null; - $port = isset($info['port']) ? $info['port'] : null; - $path = isset($info['path']) ? $info['path'] : null; - $schema = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http'; - - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - if ($this->config->get('http_proxy')&& - $proxy = parse_url($this->config->get('http_proxy')) - ) { - $proxy_host = isset($proxy['host']) ? $proxy['host'] : null; - if ($schema === 'https') { - $proxy_host = 'ssl://' . $proxy_host; - } - - $proxy_port = isset($proxy['port']) ? $proxy['port'] : 8080; - $proxy_user = isset($proxy['user']) ? urldecode($proxy['user']) : null; - $proxy_pass = isset($proxy['pass']) ? urldecode($proxy['pass']) : null; - $proxy_schema = (isset($proxy['scheme']) && $proxy['scheme'] == 'https') ? 'https' : 'http'; - } - - if (empty($port)) { - $port = (isset($info['scheme']) && $info['scheme'] == 'https') ? 443 : 80; - } - - if (isset($proxy['host'])) { - $request = "GET $url HTTP/1.1\r\n"; - } else { - $request = "GET $path HTTP/1.1\r\n"; - } - - $request .= "Host: $host\r\n"; - $ifmodifiedsince = ''; - if (is_array($lastmodified)) { - if (isset($lastmodified['Last-Modified'])) { - $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n"; - } - - if (isset($lastmodified['ETag'])) { - $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n"; - } - } else { - $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : ''); - } - - $request .= $ifmodifiedsince . - "User-Agent: PEAR/1.9.4/PHP/" . PHP_VERSION . "\r\n"; - - $username = $this->config->get('username', null, $channel); - $password = $this->config->get('password', null, $channel); - - if ($username && $password) { - $tmp = base64_encode("$username:$password"); - $request .= "Authorization: Basic $tmp\r\n"; - } - - if ($proxy_host != '' && $proxy_user != '') { - $request .= 'Proxy-Authorization: Basic ' . - base64_encode($proxy_user . ':' . $proxy_pass) . "\r\n"; - } - - if ($accept) { - $request .= 'Accept: ' . implode(', ', $accept) . "\r\n"; - } - - $request .= "Accept-Encoding:\r\n"; - $request .= "Connection: close\r\n"; - $request .= "\r\n"; - - if ($proxy_host != '') { - $fp = @fsockopen($proxy_host, $proxy_port, $errno, $errstr, 15); - if (!$fp) { - return PEAR::raiseError("Connection to `$proxy_host:$proxy_port' failed: $errstr", -9276); - } - } else { - if ($schema === 'https') { - $host = 'ssl://' . $host; - } - - $fp = @fsockopen($host, $port, $errno, $errstr); - if (!$fp) { - return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno); - } - } - - fwrite($fp, $request); - - $headers = array(); - $reply = 0; - while ($line = trim(fgets($fp, 1024))) { - if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) { - $headers[strtolower($matches[1])] = trim($matches[2]); - } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) { - $reply = (int)$matches[1]; - if ($reply == 304 && ($lastmodified || ($lastmodified === false))) { - return false; - } - - if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) { - return PEAR::raiseError("File $schema://$host:$port$path not valid (received: $line)"); - } - } - } - - if ($reply != 200) { - if (!isset($headers['location'])) { - return PEAR::raiseError("File $schema://$host:$port$path not valid (redirected but no location)"); - } - - if ($wasredirect > 4) { - return PEAR::raiseError("File $schema://$host:$port$path not valid (redirection looped more than 5 times)"); - } - - $redirect = $wasredirect + 1; - return $this->downloadHttp($headers['location'], $lastmodified, $accept, $channel); - } - - $length = isset($headers['content-length']) ? $headers['content-length'] : -1; - - $data = ''; - while ($chunk = @fread($fp, 8192)) { - $data .= $chunk; - } - fclose($fp); - - if ($lastmodified === false || $lastmodified) { - if (isset($headers['etag'])) { - $lastmodified = array('ETag' => $headers['etag']); - } - - if (isset($headers['last-modified'])) { - if (is_array($lastmodified)) { - $lastmodified['Last-Modified'] = $headers['last-modified']; - } else { - $lastmodified = $headers['last-modified']; - } - } - - return array($data, $lastmodified, $headers); - } - - return $data; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/REST/10.php b/3rdparty/PEAR/REST/10.php deleted file mode 100644 index 6ded7aeace..0000000000 --- a/3rdparty/PEAR/REST/10.php +++ /dev/null @@ -1,871 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: 10.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a12 - */ - -/** - * For downloading REST xml/txt files - */ -require_once 'PEAR/REST.php'; - -/** - * Implement REST 1.0 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a12 - */ -class PEAR_REST_10 -{ - /** - * @var PEAR_REST - */ - var $_rest; - function PEAR_REST_10($config, $options = array()) - { - $this->_rest = &new PEAR_REST($config, $options); - } - - /** - * Retrieve information about a remote package to be downloaded from a REST server - * - * @param string $base The uri to prepend to all REST calls - * @param array $packageinfo an array of format: - *
    -     *  array(
    -     *   'package' => 'packagename',
    -     *   'channel' => 'channelname',
    -     *  ['state' => 'alpha' (or valid state),]
    -     *  -or-
    -     *  ['version' => '1.whatever']
    -     * 
    - * @param string $prefstate Current preferred_state config variable value - * @param bool $installed the installed version of this package to compare against - * @return array|false|PEAR_Error see {@link _returnDownloadURL()} - */ - function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false) - { - $states = $this->betterStates($prefstate, true); - if (!$states) { - return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); - } - - $channel = $packageinfo['channel']; - $package = $packageinfo['package']; - $state = isset($packageinfo['state']) ? $packageinfo['state'] : null; - $version = isset($packageinfo['version']) ? $packageinfo['version'] : null; - $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml'; - - $info = $this->_rest->retrieveData($restFile, false, false, $channel); - if (PEAR::isError($info)) { - return PEAR::raiseError('No releases available for package "' . - $channel . '/' . $package . '"'); - } - - if (!isset($info['r'])) { - return false; - } - - $release = $found = false; - if (!is_array($info['r']) || !isset($info['r'][0])) { - $info['r'] = array($info['r']); - } - - foreach ($info['r'] as $release) { - if (!isset($this->_rest->_options['force']) && ($installed && - version_compare($release['v'], $installed, '<'))) { - continue; - } - - if (isset($state)) { - // try our preferred state first - if ($release['s'] == $state) { - $found = true; - break; - } - // see if there is something newer and more stable - // bug #7221 - if (in_array($release['s'], $this->betterStates($state), true)) { - $found = true; - break; - } - } elseif (isset($version)) { - if ($release['v'] == $version) { - $found = true; - break; - } - } else { - if (in_array($release['s'], $states)) { - $found = true; - break; - } - } - } - - return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel); - } - - function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage, - $prefstate = 'stable', $installed = false, $channel = false) - { - $states = $this->betterStates($prefstate, true); - if (!$states) { - return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); - } - - $channel = $dependency['channel']; - $package = $dependency['name']; - $state = isset($dependency['state']) ? $dependency['state'] : null; - $version = isset($dependency['version']) ? $dependency['version'] : null; - $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml'; - - $info = $this->_rest->retrieveData($restFile, false, false, $channel); - if (PEAR::isError($info)) { - return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package'] - . '" dependency "' . $channel . '/' . $package . '" has no releases'); - } - - if (!is_array($info) || !isset($info['r'])) { - return false; - } - - $exclude = array(); - $min = $max = $recommended = false; - if ($xsdversion == '1.0') { - switch ($dependency['rel']) { - case 'ge' : - $min = $dependency['version']; - break; - case 'gt' : - $min = $dependency['version']; - $exclude = array($dependency['version']); - break; - case 'eq' : - $recommended = $dependency['version']; - break; - case 'lt' : - $max = $dependency['version']; - $exclude = array($dependency['version']); - break; - case 'le' : - $max = $dependency['version']; - break; - case 'ne' : - $exclude = array($dependency['version']); - break; - } - } else { - $min = isset($dependency['min']) ? $dependency['min'] : false; - $max = isset($dependency['max']) ? $dependency['max'] : false; - $recommended = isset($dependency['recommended']) ? - $dependency['recommended'] : false; - if (isset($dependency['exclude'])) { - if (!isset($dependency['exclude'][0])) { - $exclude = array($dependency['exclude']); - } - } - } - $release = $found = false; - if (!is_array($info['r']) || !isset($info['r'][0])) { - $info['r'] = array($info['r']); - } - foreach ($info['r'] as $release) { - if (!isset($this->_rest->_options['force']) && ($installed && - version_compare($release['v'], $installed, '<'))) { - continue; - } - if (in_array($release['v'], $exclude)) { // skip excluded versions - continue; - } - // allow newer releases to say "I'm OK with the dependent package" - if ($xsdversion == '2.0' && isset($release['co'])) { - if (!is_array($release['co']) || !isset($release['co'][0])) { - $release['co'] = array($release['co']); - } - foreach ($release['co'] as $entry) { - if (isset($entry['x']) && !is_array($entry['x'])) { - $entry['x'] = array($entry['x']); - } elseif (!isset($entry['x'])) { - $entry['x'] = array(); - } - if ($entry['c'] == $deppackage['channel'] && - strtolower($entry['p']) == strtolower($deppackage['package']) && - version_compare($deppackage['version'], $entry['min'], '>=') && - version_compare($deppackage['version'], $entry['max'], '<=') && - !in_array($release['v'], $entry['x'])) { - $recommended = $release['v']; - break; - } - } - } - if ($recommended) { - if ($release['v'] != $recommended) { // if we want a specific - // version, then skip all others - continue; - } else { - if (!in_array($release['s'], $states)) { - // the stability is too low, but we must return the - // recommended version if possible - return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel); - } - } - } - if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions - continue; - } - if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions - continue; - } - if ($installed && version_compare($release['v'], $installed, '<')) { - continue; - } - if (in_array($release['s'], $states)) { // if in the preferred state... - $found = true; // ... then use it - break; - } - } - return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel); - } - - /** - * Take raw data and return the array needed for processing a download URL - * - * @param string $base REST base uri - * @param string $package Package name - * @param array $release an array of format array('v' => version, 's' => state) - * describing the release to download - * @param array $info list of all releases as defined by allreleases.xml - * @param bool|null $found determines whether the release was found or this is the next - * best alternative. If null, then versions were skipped because - * of PHP dependency - * @return array|PEAR_Error - * @access private - */ - function _returnDownloadURL($base, $package, $release, $info, $found, $phpversion = false, $channel = false) - { - if (!$found) { - $release = $info['r'][0]; - } - - $packageLower = strtolower($package); - $pinfo = $this->_rest->retrieveCacheFirst($base . 'p/' . $packageLower . '/' . - 'info.xml', false, false, $channel); - if (PEAR::isError($pinfo)) { - return PEAR::raiseError('Package "' . $package . - '" does not have REST info xml available'); - } - - $releaseinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' . - $release['v'] . '.xml', false, false, $channel); - if (PEAR::isError($releaseinfo)) { - return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] . - '" does not have REST xml available'); - } - - $packagexml = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' . - 'deps.' . $release['v'] . '.txt', false, true, $channel); - if (PEAR::isError($packagexml)) { - return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] . - '" does not have REST dependency information available'); - } - - $packagexml = unserialize($packagexml); - if (!$packagexml) { - $packagexml = array(); - } - - $allinfo = $this->_rest->retrieveData($base . 'r/' . $packageLower . - '/allreleases.xml', false, false, $channel); - if (PEAR::isError($allinfo)) { - return $allinfo; - } - - if (!is_array($allinfo['r']) || !isset($allinfo['r'][0])) { - $allinfo['r'] = array($allinfo['r']); - } - - $compatible = false; - foreach ($allinfo['r'] as $release) { - if ($release['v'] != $releaseinfo['v']) { - continue; - } - - if (!isset($release['co'])) { - break; - } - - $compatible = array(); - if (!is_array($release['co']) || !isset($release['co'][0])) { - $release['co'] = array($release['co']); - } - - foreach ($release['co'] as $entry) { - $comp = array(); - $comp['name'] = $entry['p']; - $comp['channel'] = $entry['c']; - $comp['min'] = $entry['min']; - $comp['max'] = $entry['max']; - if (isset($entry['x']) && !is_array($entry['x'])) { - $comp['exclude'] = $entry['x']; - } - - $compatible[] = $comp; - } - - if (count($compatible) == 1) { - $compatible = $compatible[0]; - } - - break; - } - - $deprecated = false; - if (isset($pinfo['dc']) && isset($pinfo['dp'])) { - if (is_array($pinfo['dp'])) { - $deprecated = array('channel' => (string) $pinfo['dc'], - 'package' => trim($pinfo['dp']['_content'])); - } else { - $deprecated = array('channel' => (string) $pinfo['dc'], - 'package' => trim($pinfo['dp'])); - } - } - - $return = array( - 'version' => $releaseinfo['v'], - 'info' => $packagexml, - 'package' => $releaseinfo['p']['_content'], - 'stability' => $releaseinfo['st'], - 'compatible' => $compatible, - 'deprecated' => $deprecated, - ); - - if ($found) { - $return['url'] = $releaseinfo['g']; - return $return; - } - - $return['php'] = $phpversion; - return $return; - } - - function listPackages($base, $channel = false) - { - $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - - if (!is_array($packagelist) || !isset($packagelist['p'])) { - return array(); - } - - if (!is_array($packagelist['p'])) { - $packagelist['p'] = array($packagelist['p']); - } - - return $packagelist['p']; - } - - /** - * List all categories of a REST server - * - * @param string $base base URL of the server - * @return array of categorynames - */ - function listCategories($base, $channel = false) - { - $categories = array(); - - // c/categories.xml does not exist; - // check for every package its category manually - // This is SLOOOWWWW : /// - $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - - if (!is_array($packagelist) || !isset($packagelist['p'])) { - $ret = array(); - return $ret; - } - - if (!is_array($packagelist['p'])) { - $packagelist['p'] = array($packagelist['p']); - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - foreach ($packagelist['p'] as $package) { - $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel); - if (PEAR::isError($inf)) { - PEAR::popErrorHandling(); - return $inf; - } - $cat = $inf['ca']['_content']; - if (!isset($categories[$cat])) { - $categories[$cat] = $inf['ca']; - } - } - - return array_values($categories); - } - - /** - * List a category of a REST server - * - * @param string $base base URL of the server - * @param string $category name of the category - * @param boolean $info also download full package info - * @return array of packagenames - */ - function listCategory($base, $category, $info = false, $channel = false) - { - // gives '404 Not Found' error when category doesn't exist - $packagelist = $this->_rest->retrieveData($base.'c/'.urlencode($category).'/packages.xml', false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - - if (!is_array($packagelist) || !isset($packagelist['p'])) { - return array(); - } - - if (!is_array($packagelist['p']) || - !isset($packagelist['p'][0])) { // only 1 pkg - $packagelist = array($packagelist['p']); - } else { - $packagelist = $packagelist['p']; - } - - if ($info == true) { - // get individual package info - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - foreach ($packagelist as $i => $packageitem) { - $url = sprintf('%s'.'r/%s/latest.txt', - $base, - strtolower($packageitem['_content'])); - $version = $this->_rest->retrieveData($url, false, false, $channel); - if (PEAR::isError($version)) { - break; // skipit - } - $url = sprintf('%s'.'r/%s/%s.xml', - $base, - strtolower($packageitem['_content']), - $version); - $info = $this->_rest->retrieveData($url, false, false, $channel); - if (PEAR::isError($info)) { - break; // skipit - } - $packagelist[$i]['info'] = $info; - } - PEAR::popErrorHandling(); - } - - return $packagelist; - } - - - function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false) - { - $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - if ($this->_rest->config->get('verbose') > 0) { - $ui = &PEAR_Frontend::singleton(); - $ui->log('Retrieving data...0%', true); - } - $ret = array(); - if (!is_array($packagelist) || !isset($packagelist['p'])) { - return $ret; - } - if (!is_array($packagelist['p'])) { - $packagelist['p'] = array($packagelist['p']); - } - - // only search-packagename = quicksearch ! - if ($searchpackage && (!$searchsummary || empty($searchpackage))) { - $newpackagelist = array(); - foreach ($packagelist['p'] as $package) { - if (!empty($searchpackage) && stristr($package, $searchpackage) !== false) { - $newpackagelist[] = $package; - } - } - $packagelist['p'] = $newpackagelist; - } - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $next = .1; - foreach ($packagelist['p'] as $progress => $package) { - if ($this->_rest->config->get('verbose') > 0) { - if ($progress / count($packagelist['p']) >= $next) { - if ($next == .5) { - $ui->log('50%', false); - } else { - $ui->log('.', false); - } - $next += .1; - } - } - - if ($basic) { // remote-list command - if ($dostable) { - $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . - '/stable.txt', false, false, $channel); - } else { - $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . - '/latest.txt', false, false, $channel); - } - if (PEAR::isError($latest)) { - $latest = false; - } - $info = array('stable' => $latest); - } else { // list-all command - $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel); - if (PEAR::isError($inf)) { - PEAR::popErrorHandling(); - return $inf; - } - if ($searchpackage) { - $found = (!empty($searchpackage) && stristr($package, $searchpackage) !== false); - if (!$found && !(isset($searchsummary) && !empty($searchsummary) - && (stristr($inf['s'], $searchsummary) !== false - || stristr($inf['d'], $searchsummary) !== false))) - { - continue; - }; - } - $releases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . - '/allreleases.xml', false, false, $channel); - if (PEAR::isError($releases)) { - continue; - } - if (!isset($releases['r'][0])) { - $releases['r'] = array($releases['r']); - } - unset($latest); - unset($unstable); - unset($stable); - unset($state); - foreach ($releases['r'] as $release) { - if (!isset($latest)) { - if ($dostable && $release['s'] == 'stable') { - $latest = $release['v']; - $state = 'stable'; - } - if (!$dostable) { - $latest = $release['v']; - $state = $release['s']; - } - } - if (!isset($stable) && $release['s'] == 'stable') { - $stable = $release['v']; - if (!isset($unstable)) { - $unstable = $stable; - } - } - if (!isset($unstable) && $release['s'] != 'stable') { - $latest = $unstable = $release['v']; - $state = $release['s']; - } - if (isset($latest) && !isset($state)) { - $state = $release['s']; - } - if (isset($latest) && isset($stable) && isset($unstable)) { - break; - } - } - $deps = array(); - if (!isset($unstable)) { - $unstable = false; - $state = 'stable'; - if (isset($stable)) { - $latest = $unstable = $stable; - } - } else { - $latest = $unstable; - } - if (!isset($latest)) { - $latest = false; - } - if ($latest) { - $d = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' . - $latest . '.txt', false, false, $channel); - if (!PEAR::isError($d)) { - $d = unserialize($d); - if ($d) { - if (isset($d['required'])) { - if (!class_exists('PEAR_PackageFile_v2')) { - require_once 'PEAR/PackageFile/v2.php'; - } - if (!isset($pf)) { - $pf = new PEAR_PackageFile_v2; - } - $pf->setDeps($d); - $tdeps = $pf->getDeps(); - } else { - $tdeps = $d; - } - foreach ($tdeps as $dep) { - if ($dep['type'] !== 'pkg') { - continue; - } - $deps[] = $dep; - } - } - } - } - if (!isset($stable)) { - $stable = '-n/a-'; - } - if (!$searchpackage) { - $info = array('stable' => $latest, 'summary' => $inf['s'], 'description' => - $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'], - 'unstable' => $unstable, 'state' => $state); - } else { - $info = array('stable' => $stable, 'summary' => $inf['s'], 'description' => - $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'], - 'unstable' => $unstable, 'state' => $state); - } - } - $ret[$package] = $info; - } - PEAR::popErrorHandling(); - return $ret; - } - - function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg) - { - $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - - $ret = array(); - if (!is_array($packagelist) || !isset($packagelist['p'])) { - return $ret; - } - - if (!is_array($packagelist['p'])) { - $packagelist['p'] = array($packagelist['p']); - } - - foreach ($packagelist['p'] as $package) { - if (!isset($installed[strtolower($package)])) { - continue; - } - - $inst_version = $reg->packageInfo($package, 'version', $channel); - $inst_state = $reg->packageInfo($package, 'release_state', $channel); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . - '/allreleases.xml', false, false, $channel); - PEAR::popErrorHandling(); - if (PEAR::isError($info)) { - continue; // no remote releases - } - - if (!isset($info['r'])) { - continue; - } - - $release = $found = false; - if (!is_array($info['r']) || !isset($info['r'][0])) { - $info['r'] = array($info['r']); - } - - // $info['r'] is sorted by version number - usort($info['r'], array($this, '_sortReleasesByVersionNumber')); - foreach ($info['r'] as $release) { - if ($inst_version && version_compare($release['v'], $inst_version, '<=')) { - // not newer than the one installed - break; - } - - // new version > installed version - if (!$pref_state) { - // every state is a good state - $found = true; - break; - } else { - $new_state = $release['s']; - // if new state >= installed state: go - if (in_array($new_state, $this->betterStates($inst_state, true))) { - $found = true; - break; - } else { - // only allow to lower the state of package, - // if new state >= preferred state: go - if (in_array($new_state, $this->betterStates($pref_state, true))) { - $found = true; - break; - } - } - } - } - - if (!$found) { - continue; - } - - $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' . - $release['v'] . '.xml', false, false, $channel); - if (PEAR::isError($relinfo)) { - return $relinfo; - } - - $ret[$package] = array( - 'version' => $release['v'], - 'state' => $release['s'], - 'filesize' => $relinfo['f'], - ); - } - - return $ret; - } - - function packageInfo($base, $package, $channel = false) - { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel); - if (PEAR::isError($pinfo)) { - PEAR::popErrorHandling(); - return PEAR::raiseError('Unknown package: "' . $package . '" in channel "' . $channel . '"' . "\n". 'Debug: ' . - $pinfo->getMessage()); - } - - $releases = array(); - $allreleases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . - '/allreleases.xml', false, false, $channel); - if (!PEAR::isError($allreleases)) { - if (!class_exists('PEAR_PackageFile_v2')) { - require_once 'PEAR/PackageFile/v2.php'; - } - - if (!is_array($allreleases['r']) || !isset($allreleases['r'][0])) { - $allreleases['r'] = array($allreleases['r']); - } - - $pf = new PEAR_PackageFile_v2; - foreach ($allreleases['r'] as $release) { - $ds = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' . - $release['v'] . '.txt', false, false, $channel); - if (PEAR::isError($ds)) { - continue; - } - - if (!isset($latest)) { - $latest = $release['v']; - } - - $pf->setDeps(unserialize($ds)); - $ds = $pf->getDeps(); - $info = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) - . '/' . $release['v'] . '.xml', false, false, $channel); - - if (PEAR::isError($info)) { - continue; - } - - $releases[$release['v']] = array( - 'doneby' => $info['m'], - 'license' => $info['l'], - 'summary' => $info['s'], - 'description' => $info['d'], - 'releasedate' => $info['da'], - 'releasenotes' => $info['n'], - 'state' => $release['s'], - 'deps' => $ds ? $ds : array(), - ); - } - } else { - $latest = ''; - } - - PEAR::popErrorHandling(); - if (isset($pinfo['dc']) && isset($pinfo['dp'])) { - if (is_array($pinfo['dp'])) { - $deprecated = array('channel' => (string) $pinfo['dc'], - 'package' => trim($pinfo['dp']['_content'])); - } else { - $deprecated = array('channel' => (string) $pinfo['dc'], - 'package' => trim($pinfo['dp'])); - } - } else { - $deprecated = false; - } - - if (!isset($latest)) { - $latest = ''; - } - - return array( - 'name' => $pinfo['n'], - 'channel' => $pinfo['c'], - 'category' => $pinfo['ca']['_content'], - 'stable' => $latest, - 'license' => $pinfo['l'], - 'summary' => $pinfo['s'], - 'description' => $pinfo['d'], - 'releases' => $releases, - 'deprecated' => $deprecated, - ); - } - - /** - * Return an array containing all of the states that are more stable than - * or equal to the passed in state - * - * @param string Release state - * @param boolean Determines whether to include $state in the list - * @return false|array False if $state is not a valid release state - */ - function betterStates($state, $include = false) - { - static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); - $i = array_search($state, $states); - if ($i === false) { - return false; - } - - if ($include) { - $i--; - } - - return array_slice($states, $i + 1); - } - - /** - * Sort releases by version number - * - * @access private - */ - function _sortReleasesByVersionNumber($a, $b) - { - if (version_compare($a['v'], $b['v'], '=')) { - return 0; - } - - if (version_compare($a['v'], $b['v'], '>')) { - return -1; - } - - if (version_compare($a['v'], $b['v'], '<')) { - return 1; - } - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/REST/11.php b/3rdparty/PEAR/REST/11.php deleted file mode 100644 index 831cfccdb7..0000000000 --- a/3rdparty/PEAR/REST/11.php +++ /dev/null @@ -1,341 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: 11.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.3 - */ - -/** - * For downloading REST xml/txt files - */ -require_once 'PEAR/REST.php'; - -/** - * Implement REST 1.1 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.3 - */ -class PEAR_REST_11 -{ - /** - * @var PEAR_REST - */ - var $_rest; - - function PEAR_REST_11($config, $options = array()) - { - $this->_rest = &new PEAR_REST($config, $options); - } - - function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false) - { - $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); - if (PEAR::isError($categorylist)) { - return $categorylist; - } - - $ret = array(); - if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) { - $categorylist['c'] = array($categorylist['c']); - } - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - - foreach ($categorylist['c'] as $progress => $category) { - $category = $category['_content']; - $packagesinfo = $this->_rest->retrieveData($base . - 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel); - - if (PEAR::isError($packagesinfo)) { - continue; - } - - if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) { - continue; - } - - if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) { - $packagesinfo['pi'] = array($packagesinfo['pi']); - } - - foreach ($packagesinfo['pi'] as $packageinfo) { - if (empty($packageinfo)) { - continue; - } - - $info = $packageinfo['p']; - $package = $info['n']; - $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false; - unset($latest); - unset($unstable); - unset($stable); - unset($state); - - if ($releases) { - if (!isset($releases['r'][0])) { - $releases['r'] = array($releases['r']); - } - - foreach ($releases['r'] as $release) { - if (!isset($latest)) { - if ($dostable && $release['s'] == 'stable') { - $latest = $release['v']; - $state = 'stable'; - } - if (!$dostable) { - $latest = $release['v']; - $state = $release['s']; - } - } - - if (!isset($stable) && $release['s'] == 'stable') { - $stable = $release['v']; - if (!isset($unstable)) { - $unstable = $stable; - } - } - - if (!isset($unstable) && $release['s'] != 'stable') { - $unstable = $release['v']; - $state = $release['s']; - } - - if (isset($latest) && !isset($state)) { - $state = $release['s']; - } - - if (isset($latest) && isset($stable) && isset($unstable)) { - break; - } - } - } - - if ($basic) { // remote-list command - if (!isset($latest)) { - $latest = false; - } - - if ($dostable) { - // $state is not set if there are no releases - if (isset($state) && $state == 'stable') { - $ret[$package] = array('stable' => $latest); - } else { - $ret[$package] = array('stable' => '-n/a-'); - } - } else { - $ret[$package] = array('stable' => $latest); - } - - continue; - } - - // list-all command - if (!isset($unstable)) { - $unstable = false; - $state = 'stable'; - if (isset($stable)) { - $latest = $unstable = $stable; - } - } else { - $latest = $unstable; - } - - if (!isset($latest)) { - $latest = false; - } - - $deps = array(); - if ($latest && isset($packageinfo['deps'])) { - if (!is_array($packageinfo['deps']) || - !isset($packageinfo['deps'][0]) - ) { - $packageinfo['deps'] = array($packageinfo['deps']); - } - - $d = false; - foreach ($packageinfo['deps'] as $dep) { - if ($dep['v'] == $latest) { - $d = unserialize($dep['d']); - } - } - - if ($d) { - if (isset($d['required'])) { - if (!class_exists('PEAR_PackageFile_v2')) { - require_once 'PEAR/PackageFile/v2.php'; - } - - if (!isset($pf)) { - $pf = new PEAR_PackageFile_v2; - } - - $pf->setDeps($d); - $tdeps = $pf->getDeps(); - } else { - $tdeps = $d; - } - - foreach ($tdeps as $dep) { - if ($dep['type'] !== 'pkg') { - continue; - } - - $deps[] = $dep; - } - } - } - - $info = array( - 'stable' => $latest, - 'summary' => $info['s'], - 'description' => $info['d'], - 'deps' => $deps, - 'category' => $info['ca']['_content'], - 'unstable' => $unstable, - 'state' => $state - ); - $ret[$package] = $info; - } - } - - PEAR::popErrorHandling(); - return $ret; - } - - /** - * List all categories of a REST server - * - * @param string $base base URL of the server - * @return array of categorynames - */ - function listCategories($base, $channel = false) - { - $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); - if (PEAR::isError($categorylist)) { - return $categorylist; - } - - if (!is_array($categorylist) || !isset($categorylist['c'])) { - return array(); - } - - if (isset($categorylist['c']['_content'])) { - // only 1 category - $categorylist['c'] = array($categorylist['c']); - } - - return $categorylist['c']; - } - - /** - * List packages in a category of a REST server - * - * @param string $base base URL of the server - * @param string $category name of the category - * @param boolean $info also download full package info - * @return array of packagenames - */ - function listCategory($base, $category, $info = false, $channel = false) - { - if ($info == false) { - $url = '%s'.'c/%s/packages.xml'; - } else { - $url = '%s'.'c/%s/packagesinfo.xml'; - } - $url = sprintf($url, - $base, - urlencode($category)); - - // gives '404 Not Found' error when category doesn't exist - $packagelist = $this->_rest->retrieveData($url, false, false, $channel); - if (PEAR::isError($packagelist)) { - return $packagelist; - } - if (!is_array($packagelist)) { - return array(); - } - - if ($info == false) { - if (!isset($packagelist['p'])) { - return array(); - } - if (!is_array($packagelist['p']) || - !isset($packagelist['p'][0])) { // only 1 pkg - $packagelist = array($packagelist['p']); - } else { - $packagelist = $packagelist['p']; - } - return $packagelist; - } - - // info == true - if (!isset($packagelist['pi'])) { - return array(); - } - - if (!is_array($packagelist['pi']) || - !isset($packagelist['pi'][0])) { // only 1 pkg - $packagelist_pre = array($packagelist['pi']); - } else { - $packagelist_pre = $packagelist['pi']; - } - - $packagelist = array(); - foreach ($packagelist_pre as $i => $item) { - // compatibility with r/.xml - if (isset($item['a']['r'][0])) { - // multiple releases - $item['p']['v'] = $item['a']['r'][0]['v']; - $item['p']['st'] = $item['a']['r'][0]['s']; - } elseif (isset($item['a'])) { - // first and only release - $item['p']['v'] = $item['a']['r']['v']; - $item['p']['st'] = $item['a']['r']['s']; - } - - $packagelist[$i] = array('attribs' => $item['p']['r'], - '_content' => $item['p']['n'], - 'info' => $item['p']); - } - - return $packagelist; - } - - /** - * Return an array containing all of the states that are more stable than - * or equal to the passed in state - * - * @param string Release state - * @param boolean Determines whether to include $state in the list - * @return false|array False if $state is not a valid release state - */ - function betterStates($state, $include = false) - { - static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); - $i = array_search($state, $states); - if ($i === false) { - return false; - } - if ($include) { - $i--; - } - return array_slice($states, $i + 1); - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/REST/13.php b/3rdparty/PEAR/REST/13.php deleted file mode 100644 index 722ae0de30..0000000000 --- a/3rdparty/PEAR/REST/13.php +++ /dev/null @@ -1,299 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: 13.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a12 - */ - -/** - * For downloading REST xml/txt files - */ -require_once 'PEAR/REST.php'; -require_once 'PEAR/REST/10.php'; - -/** - * Implement REST 1.3 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a12 - */ -class PEAR_REST_13 extends PEAR_REST_10 -{ - /** - * Retrieve information about a remote package to be downloaded from a REST server - * - * This is smart enough to resolve the minimum PHP version dependency prior to download - * @param string $base The uri to prepend to all REST calls - * @param array $packageinfo an array of format: - *
    -     *  array(
    -     *   'package' => 'packagename',
    -     *   'channel' => 'channelname',
    -     *  ['state' => 'alpha' (or valid state),]
    -     *  -or-
    -     *  ['version' => '1.whatever']
    -     * 
    - * @param string $prefstate Current preferred_state config variable value - * @param bool $installed the installed version of this package to compare against - * @return array|false|PEAR_Error see {@link _returnDownloadURL()} - */ - function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false) - { - $states = $this->betterStates($prefstate, true); - if (!$states) { - return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); - } - - $channel = $packageinfo['channel']; - $package = $packageinfo['package']; - $state = isset($packageinfo['state']) ? $packageinfo['state'] : null; - $version = isset($packageinfo['version']) ? $packageinfo['version'] : null; - $restFile = $base . 'r/' . strtolower($package) . '/allreleases2.xml'; - - $info = $this->_rest->retrieveData($restFile, false, false, $channel); - if (PEAR::isError($info)) { - return PEAR::raiseError('No releases available for package "' . - $channel . '/' . $package . '"'); - } - - if (!isset($info['r'])) { - return false; - } - - $release = $found = false; - if (!is_array($info['r']) || !isset($info['r'][0])) { - $info['r'] = array($info['r']); - } - - $skippedphp = false; - foreach ($info['r'] as $release) { - if (!isset($this->_rest->_options['force']) && ($installed && - version_compare($release['v'], $installed, '<'))) { - continue; - } - - if (isset($state)) { - // try our preferred state first - if ($release['s'] == $state) { - if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { - // skip releases that require a PHP version newer than our PHP version - $skippedphp = $release; - continue; - } - $found = true; - break; - } - - // see if there is something newer and more stable - // bug #7221 - if (in_array($release['s'], $this->betterStates($state), true)) { - if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { - // skip releases that require a PHP version newer than our PHP version - $skippedphp = $release; - continue; - } - $found = true; - break; - } - } elseif (isset($version)) { - if ($release['v'] == $version) { - if (!isset($this->_rest->_options['force']) && - !isset($version) && - version_compare($release['m'], phpversion(), '>')) { - // skip releases that require a PHP version newer than our PHP version - $skippedphp = $release; - continue; - } - $found = true; - break; - } - } else { - if (in_array($release['s'], $states)) { - if (version_compare($release['m'], phpversion(), '>')) { - // skip releases that require a PHP version newer than our PHP version - $skippedphp = $release; - continue; - } - $found = true; - break; - } - } - } - - if (!$found && $skippedphp) { - $found = null; - } - - return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); - } - - function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage, - $prefstate = 'stable', $installed = false, $channel = false) - { - $states = $this->betterStates($prefstate, true); - if (!$states) { - return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); - } - - $channel = $dependency['channel']; - $package = $dependency['name']; - $state = isset($dependency['state']) ? $dependency['state'] : null; - $version = isset($dependency['version']) ? $dependency['version'] : null; - $restFile = $base . 'r/' . strtolower($package) .'/allreleases2.xml'; - - $info = $this->_rest->retrieveData($restFile, false, false, $channel); - if (PEAR::isError($info)) { - return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package'] - . '" dependency "' . $channel . '/' . $package . '" has no releases'); - } - - if (!is_array($info) || !isset($info['r'])) { - return false; - } - - $exclude = array(); - $min = $max = $recommended = false; - if ($xsdversion == '1.0') { - $pinfo['package'] = $dependency['name']; - $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this - switch ($dependency['rel']) { - case 'ge' : - $min = $dependency['version']; - break; - case 'gt' : - $min = $dependency['version']; - $exclude = array($dependency['version']); - break; - case 'eq' : - $recommended = $dependency['version']; - break; - case 'lt' : - $max = $dependency['version']; - $exclude = array($dependency['version']); - break; - case 'le' : - $max = $dependency['version']; - break; - case 'ne' : - $exclude = array($dependency['version']); - break; - } - } else { - $pinfo['package'] = $dependency['name']; - $min = isset($dependency['min']) ? $dependency['min'] : false; - $max = isset($dependency['max']) ? $dependency['max'] : false; - $recommended = isset($dependency['recommended']) ? - $dependency['recommended'] : false; - if (isset($dependency['exclude'])) { - if (!isset($dependency['exclude'][0])) { - $exclude = array($dependency['exclude']); - } - } - } - - $skippedphp = $found = $release = false; - if (!is_array($info['r']) || !isset($info['r'][0])) { - $info['r'] = array($info['r']); - } - - foreach ($info['r'] as $release) { - if (!isset($this->_rest->_options['force']) && ($installed && - version_compare($release['v'], $installed, '<'))) { - continue; - } - - if (in_array($release['v'], $exclude)) { // skip excluded versions - continue; - } - - // allow newer releases to say "I'm OK with the dependent package" - if ($xsdversion == '2.0' && isset($release['co'])) { - if (!is_array($release['co']) || !isset($release['co'][0])) { - $release['co'] = array($release['co']); - } - - foreach ($release['co'] as $entry) { - if (isset($entry['x']) && !is_array($entry['x'])) { - $entry['x'] = array($entry['x']); - } elseif (!isset($entry['x'])) { - $entry['x'] = array(); - } - - if ($entry['c'] == $deppackage['channel'] && - strtolower($entry['p']) == strtolower($deppackage['package']) && - version_compare($deppackage['version'], $entry['min'], '>=') && - version_compare($deppackage['version'], $entry['max'], '<=') && - !in_array($release['v'], $entry['x'])) { - if (version_compare($release['m'], phpversion(), '>')) { - // skip dependency releases that require a PHP version - // newer than our PHP version - $skippedphp = $release; - continue; - } - - $recommended = $release['v']; - break; - } - } - } - - if ($recommended) { - if ($release['v'] != $recommended) { // if we want a specific - // version, then skip all others - continue; - } - - if (!in_array($release['s'], $states)) { - // the stability is too low, but we must return the - // recommended version if possible - return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel); - } - } - - if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions - continue; - } - - if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions - continue; - } - - if ($installed && version_compare($release['v'], $installed, '<')) { - continue; - } - - if (in_array($release['s'], $states)) { // if in the preferred state... - if (version_compare($release['m'], phpversion(), '>')) { - // skip dependency releases that require a PHP version - // newer than our PHP version - $skippedphp = $release; - continue; - } - - $found = true; // ... then use it - break; - } - } - - if (!$found && $skippedphp) { - $found = null; - } - - return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Registry.php b/3rdparty/PEAR/Registry.php deleted file mode 100644 index 35e17db495..0000000000 --- a/3rdparty/PEAR/Registry.php +++ /dev/null @@ -1,2395 +0,0 @@ - - * @author Tomas V. V. Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Registry.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * for PEAR_Error - */ -require_once 'PEAR.php'; -require_once 'PEAR/DependencyDB.php'; - -define('PEAR_REGISTRY_ERROR_LOCK', -2); -define('PEAR_REGISTRY_ERROR_FORMAT', -3); -define('PEAR_REGISTRY_ERROR_FILE', -4); -define('PEAR_REGISTRY_ERROR_CONFLICT', -5); -define('PEAR_REGISTRY_ERROR_CHANNEL_FILE', -6); - -/** - * Administration class used to maintain the installed package database. - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V. V. Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Registry extends PEAR -{ - /** - * File containing all channel information. - * @var string - */ - var $channels = ''; - - /** Directory where registry files are stored. - * @var string - */ - var $statedir = ''; - - /** File where the file map is stored - * @var string - */ - var $filemap = ''; - - /** Directory where registry files for channels are stored. - * @var string - */ - var $channelsdir = ''; - - /** Name of file used for locking the registry - * @var string - */ - var $lockfile = ''; - - /** File descriptor used during locking - * @var resource - */ - var $lock_fp = null; - - /** Mode used during locking - * @var int - */ - var $lock_mode = 0; // XXX UNUSED - - /** Cache of package information. Structure: - * array( - * 'package' => array('id' => ... ), - * ... ) - * @var array - */ - var $pkginfo_cache = array(); - - /** Cache of file map. Structure: - * array( '/path/to/file' => 'package', ... ) - * @var array - */ - var $filemap_cache = array(); - - /** - * @var false|PEAR_ChannelFile - */ - var $_pearChannel; - - /** - * @var false|PEAR_ChannelFile - */ - var $_peclChannel; - - /** - * @var false|PEAR_ChannelFile - */ - var $_docChannel; - - /** - * @var PEAR_DependencyDB - */ - var $_dependencyDB; - - /** - * @var PEAR_Config - */ - var $_config; - - /** - * PEAR_Registry constructor. - * - * @param string (optional) PEAR install directory (for .php files) - * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PEAR channel, if - * default values are not desired. Only used the very first time a PEAR - * repository is initialized - * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PECL channel, if - * default values are not desired. Only used the very first time a PEAR - * repository is initialized - * - * @access public - */ - function PEAR_Registry($pear_install_dir = PEAR_INSTALL_DIR, $pear_channel = false, - $pecl_channel = false) - { - parent::PEAR(); - $this->setInstallDir($pear_install_dir); - $this->_pearChannel = $pear_channel; - $this->_peclChannel = $pecl_channel; - $this->_config = false; - } - - function setInstallDir($pear_install_dir = PEAR_INSTALL_DIR) - { - $ds = DIRECTORY_SEPARATOR; - $this->install_dir = $pear_install_dir; - $this->channelsdir = $pear_install_dir.$ds.'.channels'; - $this->statedir = $pear_install_dir.$ds.'.registry'; - $this->filemap = $pear_install_dir.$ds.'.filemap'; - $this->lockfile = $pear_install_dir.$ds.'.lock'; - } - - function hasWriteAccess() - { - if (!file_exists($this->install_dir)) { - $dir = $this->install_dir; - while ($dir && $dir != '.') { - $olddir = $dir; - $dir = dirname($dir); - if ($dir != '.' && file_exists($dir)) { - if (is_writeable($dir)) { - return true; - } - - return false; - } - - if ($dir == $olddir) { // this can happen in safe mode - return @is_writable($dir); - } - } - - return false; - } - - return is_writeable($this->install_dir); - } - - function setConfig(&$config, $resetInstallDir = true) - { - $this->_config = &$config; - if ($resetInstallDir) { - $this->setInstallDir($config->get('php_dir')); - } - } - - function _initializeChannelDirs() - { - static $running = false; - if (!$running) { - $running = true; - $ds = DIRECTORY_SEPARATOR; - if (!is_dir($this->channelsdir) || - !file_exists($this->channelsdir . $ds . 'pear.php.net.reg') || - !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') || - !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') || - !file_exists($this->channelsdir . $ds . '__uri.reg')) { - if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) { - $pear_channel = $this->_pearChannel; - if (!is_a($pear_channel, 'PEAR_ChannelFile') || !$pear_channel->validate()) { - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $pear_channel = new PEAR_ChannelFile; - $pear_channel->setAlias('pear'); - $pear_channel->setServer('pear.php.net'); - $pear_channel->setSummary('PHP Extension and Application Repository'); - $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/'); - //$pear_channel->setBaseURL('REST1.4', 'http://pear.php.net/rest/'); - } else { - $pear_channel->setServer('pear.php.net'); - $pear_channel->setAlias('pear'); - } - - $pear_channel->validate(); - $this->_addChannel($pear_channel); - } - - if (!file_exists($this->channelsdir . $ds . 'pecl.php.net.reg')) { - $pecl_channel = $this->_peclChannel; - if (!is_a($pecl_channel, 'PEAR_ChannelFile') || !$pecl_channel->validate()) { - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $pecl_channel = new PEAR_ChannelFile; - $pecl_channel->setAlias('pecl'); - $pecl_channel->setServer('pecl.php.net'); - $pecl_channel->setSummary('PHP Extension Community Library'); - $pecl_channel->setDefaultPEARProtocols(); - $pecl_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/'); - $pecl_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/'); - $pecl_channel->setValidationPackage('PEAR_Validator_PECL', '1.0'); - } else { - $pecl_channel->setServer('pecl.php.net'); - $pecl_channel->setAlias('pecl'); - } - - $pecl_channel->validate(); - $this->_addChannel($pecl_channel); - } - - if (!file_exists($this->channelsdir . $ds . 'doc.php.net.reg')) { - $doc_channel = $this->_docChannel; - if (!is_a($doc_channel, 'PEAR_ChannelFile') || !$doc_channel->validate()) { - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $doc_channel = new PEAR_ChannelFile; - $doc_channel->setAlias('phpdocs'); - $doc_channel->setServer('doc.php.net'); - $doc_channel->setSummary('PHP Documentation Team'); - $doc_channel->setDefaultPEARProtocols(); - $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/'); - } else { - $doc_channel->setServer('doc.php.net'); - $doc_channel->setAlias('doc'); - } - - $doc_channel->validate(); - $this->_addChannel($doc_channel); - } - - if (!file_exists($this->channelsdir . $ds . '__uri.reg')) { - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $private = new PEAR_ChannelFile; - $private->setName('__uri'); - $private->setDefaultPEARProtocols(); - $private->setBaseURL('REST1.0', '****'); - $private->setSummary('Pseudo-channel for static packages'); - $this->_addChannel($private); - } - $this->_rebuildFileMap(); - } - - $running = false; - } - } - - function _initializeDirs() - { - $ds = DIRECTORY_SEPARATOR; - // XXX Compatibility code should be removed in the future - // rename all registry files if any to lowercase - if (!OS_WINDOWS && file_exists($this->statedir) && is_dir($this->statedir) && - $handle = opendir($this->statedir)) { - $dest = $this->statedir . $ds; - while (false !== ($file = readdir($handle))) { - if (preg_match('/^.*[A-Z].*\.reg\\z/', $file)) { - rename($dest . $file, $dest . strtolower($file)); - } - } - closedir($handle); - } - - $this->_initializeChannelDirs(); - if (!file_exists($this->filemap)) { - $this->_rebuildFileMap(); - } - $this->_initializeDepDB(); - } - - function _initializeDepDB() - { - if (!isset($this->_dependencyDB)) { - static $initializing = false; - if (!$initializing) { - $initializing = true; - if (!$this->_config) { // never used? - $file = OS_WINDOWS ? 'pear.ini' : '.pearrc'; - $this->_config = &new PEAR_Config($this->statedir . DIRECTORY_SEPARATOR . - $file); - $this->_config->setRegistry($this); - $this->_config->set('php_dir', $this->install_dir); - } - - $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config); - if (PEAR::isError($this->_dependencyDB)) { - // attempt to recover by removing the dep db - if (file_exists($this->_config->get('php_dir', null, 'pear.php.net') . - DIRECTORY_SEPARATOR . '.depdb')) { - @unlink($this->_config->get('php_dir', null, 'pear.php.net') . - DIRECTORY_SEPARATOR . '.depdb'); - } - - $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config); - if (PEAR::isError($this->_dependencyDB)) { - echo $this->_dependencyDB->getMessage(); - echo 'Unrecoverable error'; - exit(1); - } - } - - $initializing = false; - } - } - } - - /** - * PEAR_Registry destructor. Makes sure no locks are forgotten. - * - * @access private - */ - function _PEAR_Registry() - { - parent::_PEAR(); - if (is_resource($this->lock_fp)) { - $this->_unlock(); - } - } - - /** - * Make sure the directory where we keep registry files exists. - * - * @return bool TRUE if directory exists, FALSE if it could not be - * created - * - * @access private - */ - function _assertStateDir($channel = false) - { - if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') { - return $this->_assertChannelStateDir($channel); - } - - static $init = false; - if (!file_exists($this->statedir)) { - if (!$this->hasWriteAccess()) { - return false; - } - - require_once 'System.php'; - if (!System::mkdir(array('-p', $this->statedir))) { - return $this->raiseError("could not create directory '{$this->statedir}'"); - } - $init = true; - } elseif (!is_dir($this->statedir)) { - return $this->raiseError('Cannot create directory ' . $this->statedir . ', ' . - 'it already exists and is not a directory'); - } - - $ds = DIRECTORY_SEPARATOR; - if (!file_exists($this->channelsdir)) { - if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg') || - !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') || - !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') || - !file_exists($this->channelsdir . $ds . '__uri.reg')) { - $init = true; - } - } elseif (!is_dir($this->channelsdir)) { - return $this->raiseError('Cannot create directory ' . $this->channelsdir . ', ' . - 'it already exists and is not a directory'); - } - - if ($init) { - static $running = false; - if (!$running) { - $running = true; - $this->_initializeDirs(); - $running = false; - $init = false; - } - } else { - $this->_initializeDepDB(); - } - - return true; - } - - /** - * Make sure the directory where we keep registry files exists for a non-standard channel. - * - * @param string channel name - * @return bool TRUE if directory exists, FALSE if it could not be - * created - * - * @access private - */ - function _assertChannelStateDir($channel) - { - $ds = DIRECTORY_SEPARATOR; - if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') { - if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) { - $this->_initializeChannelDirs(); - } - return $this->_assertStateDir($channel); - } - - $channelDir = $this->_channelDirectoryName($channel); - if (!is_dir($this->channelsdir) || - !file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) { - $this->_initializeChannelDirs(); - } - - if (!file_exists($channelDir)) { - if (!$this->hasWriteAccess()) { - return false; - } - - require_once 'System.php'; - if (!System::mkdir(array('-p', $channelDir))) { - return $this->raiseError("could not create directory '" . $channelDir . - "'"); - } - } elseif (!is_dir($channelDir)) { - return $this->raiseError("could not create directory '" . $channelDir . - "', already exists and is not a directory"); - } - - return true; - } - - /** - * Make sure the directory where we keep registry files for channels exists - * - * @return bool TRUE if directory exists, FALSE if it could not be - * created - * - * @access private - */ - function _assertChannelDir() - { - if (!file_exists($this->channelsdir)) { - if (!$this->hasWriteAccess()) { - return false; - } - - require_once 'System.php'; - if (!System::mkdir(array('-p', $this->channelsdir))) { - return $this->raiseError("could not create directory '{$this->channelsdir}'"); - } - } elseif (!is_dir($this->channelsdir)) { - return $this->raiseError("could not create directory '{$this->channelsdir}" . - "', it already exists and is not a directory"); - } - - if (!file_exists($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) { - if (!$this->hasWriteAccess()) { - return false; - } - - require_once 'System.php'; - if (!System::mkdir(array('-p', $this->channelsdir . DIRECTORY_SEPARATOR . '.alias'))) { - return $this->raiseError("could not create directory '{$this->channelsdir}/.alias'"); - } - } elseif (!is_dir($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) { - return $this->raiseError("could not create directory '{$this->channelsdir}" . - "/.alias', it already exists and is not a directory"); - } - - return true; - } - - /** - * Get the name of the file where data for a given package is stored. - * - * @param string channel name, or false if this is a PEAR package - * @param string package name - * - * @return string registry file name - * - * @access public - */ - function _packageFileName($package, $channel = false) - { - if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') { - return $this->_channelDirectoryName($channel) . DIRECTORY_SEPARATOR . - strtolower($package) . '.reg'; - } - - return $this->statedir . DIRECTORY_SEPARATOR . strtolower($package) . '.reg'; - } - - /** - * Get the name of the file where data for a given channel is stored. - * @param string channel name - * @return string registry file name - */ - function _channelFileName($channel, $noaliases = false) - { - if (!$noaliases) { - if (file_exists($this->_getChannelAliasFileName($channel))) { - $channel = implode('', file($this->_getChannelAliasFileName($channel))); - } - } - return $this->channelsdir . DIRECTORY_SEPARATOR . str_replace('/', '_', - strtolower($channel)) . '.reg'; - } - - /** - * @param string - * @return string - */ - function _getChannelAliasFileName($alias) - { - return $this->channelsdir . DIRECTORY_SEPARATOR . '.alias' . - DIRECTORY_SEPARATOR . str_replace('/', '_', strtolower($alias)) . '.txt'; - } - - /** - * Get the name of a channel from its alias - */ - function _getChannelFromAlias($channel) - { - if (!$this->_channelExists($channel)) { - if ($channel == 'pear.php.net') { - return 'pear.php.net'; - } - - if ($channel == 'pecl.php.net') { - return 'pecl.php.net'; - } - - if ($channel == 'doc.php.net') { - return 'doc.php.net'; - } - - if ($channel == '__uri') { - return '__uri'; - } - - return false; - } - - $channel = strtolower($channel); - if (file_exists($this->_getChannelAliasFileName($channel))) { - // translate an alias to an actual channel - return implode('', file($this->_getChannelAliasFileName($channel))); - } - - return $channel; - } - - /** - * Get the alias of a channel from its alias or its name - */ - function _getAlias($channel) - { - if (!$this->_channelExists($channel)) { - if ($channel == 'pear.php.net') { - return 'pear'; - } - - if ($channel == 'pecl.php.net') { - return 'pecl'; - } - - if ($channel == 'doc.php.net') { - return 'phpdocs'; - } - - return false; - } - - $channel = $this->_getChannel($channel); - if (PEAR::isError($channel)) { - return $channel; - } - - return $channel->getAlias(); - } - - /** - * Get the name of the file where data for a given package is stored. - * - * @param string channel name, or false if this is a PEAR package - * @param string package name - * - * @return string registry file name - * - * @access public - */ - function _channelDirectoryName($channel) - { - if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') { - return $this->statedir; - } - - $ch = $this->_getChannelFromAlias($channel); - if (!$ch) { - $ch = $channel; - } - - return $this->statedir . DIRECTORY_SEPARATOR . strtolower('.channel.' . - str_replace('/', '_', $ch)); - } - - function _openPackageFile($package, $mode, $channel = false) - { - if (!$this->_assertStateDir($channel)) { - return null; - } - - if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) { - return null; - } - - $file = $this->_packageFileName($package, $channel); - if (!file_exists($file) && $mode == 'r' || $mode == 'rb') { - return null; - } - - $fp = @fopen($file, $mode); - if (!$fp) { - return null; - } - - return $fp; - } - - function _closePackageFile($fp) - { - fclose($fp); - } - - function _openChannelFile($channel, $mode) - { - if (!$this->_assertChannelDir()) { - return null; - } - - if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) { - return null; - } - - $file = $this->_channelFileName($channel); - if (!file_exists($file) && $mode == 'r' || $mode == 'rb') { - return null; - } - - $fp = @fopen($file, $mode); - if (!$fp) { - return null; - } - - return $fp; - } - - function _closeChannelFile($fp) - { - fclose($fp); - } - - function _rebuildFileMap() - { - if (!class_exists('PEAR_Installer_Role')) { - require_once 'PEAR/Installer/Role.php'; - } - - $channels = $this->_listAllPackages(); - $files = array(); - foreach ($channels as $channel => $packages) { - foreach ($packages as $package) { - $version = $this->_packageInfo($package, 'version', $channel); - $filelist = $this->_packageInfo($package, 'filelist', $channel); - if (!is_array($filelist)) { - continue; - } - - foreach ($filelist as $name => $attrs) { - if (isset($attrs['attribs'])) { - $attrs = $attrs['attribs']; - } - - // it is possible for conflicting packages in different channels to - // conflict with data files/doc files - if ($name == 'dirtree') { - continue; - } - - if (isset($attrs['role']) && !in_array($attrs['role'], - PEAR_Installer_Role::getInstallableRoles())) { - // these are not installed - continue; - } - - if (isset($attrs['role']) && !in_array($attrs['role'], - PEAR_Installer_Role::getBaseinstallRoles())) { - $attrs['baseinstalldir'] = $package; - } - - if (isset($attrs['baseinstalldir'])) { - $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; - } else { - $file = $name; - } - - $file = preg_replace(',^/+,', '', $file); - if ($channel != 'pear.php.net') { - if (!isset($files[$attrs['role']])) { - $files[$attrs['role']] = array(); - } - $files[$attrs['role']][$file] = array(strtolower($channel), - strtolower($package)); - } else { - if (!isset($files[$attrs['role']])) { - $files[$attrs['role']] = array(); - } - $files[$attrs['role']][$file] = strtolower($package); - } - } - } - } - - - $this->_assertStateDir(); - if (!$this->hasWriteAccess()) { - return false; - } - - $fp = @fopen($this->filemap, 'wb'); - if (!$fp) { - return false; - } - - $this->filemap_cache = $files; - fwrite($fp, serialize($files)); - fclose($fp); - return true; - } - - function _readFileMap() - { - if (!file_exists($this->filemap)) { - return array(); - } - - $fp = @fopen($this->filemap, 'r'); - if (!$fp) { - return $this->raiseError('PEAR_Registry: could not open filemap "' . $this->filemap . '"', PEAR_REGISTRY_ERROR_FILE, null, null, $php_errormsg); - } - - clearstatcache(); - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - $fsize = filesize($this->filemap); - fclose($fp); - $data = file_get_contents($this->filemap); - set_magic_quotes_runtime($rt); - $tmp = unserialize($data); - if (!$tmp && $fsize > 7) { - return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data); - } - - $this->filemap_cache = $tmp; - return true; - } - - /** - * Lock the registry. - * - * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN. - * See flock manual for more information. - * - * @return bool TRUE on success, FALSE if locking failed, or a - * PEAR error if some other error occurs (such as the - * lock file not being writable). - * - * @access private - */ - function _lock($mode = LOCK_EX) - { - if (stristr(php_uname(), 'Windows 9')) { - return true; - } - - if ($mode != LOCK_UN && is_resource($this->lock_fp)) { - // XXX does not check type of lock (LOCK_SH/LOCK_EX) - return true; - } - - if (!$this->_assertStateDir()) { - if ($mode == LOCK_EX) { - return $this->raiseError('Registry directory is not writeable by the current user'); - } - - return true; - } - - $open_mode = 'w'; - // XXX People reported problems with LOCK_SH and 'w' - if ($mode === LOCK_SH || $mode === LOCK_UN) { - if (!file_exists($this->lockfile)) { - touch($this->lockfile); - } - $open_mode = 'r'; - } - - if (!is_resource($this->lock_fp)) { - $this->lock_fp = @fopen($this->lockfile, $open_mode); - } - - if (!is_resource($this->lock_fp)) { - $this->lock_fp = null; - return $this->raiseError("could not create lock file" . - (isset($php_errormsg) ? ": " . $php_errormsg : "")); - } - - if (!(int)flock($this->lock_fp, $mode)) { - switch ($mode) { - case LOCK_SH: $str = 'shared'; break; - case LOCK_EX: $str = 'exclusive'; break; - case LOCK_UN: $str = 'unlock'; break; - default: $str = 'unknown'; break; - } - - //is resource at this point, close it on error. - fclose($this->lock_fp); - $this->lock_fp = null; - return $this->raiseError("could not acquire $str lock ($this->lockfile)", - PEAR_REGISTRY_ERROR_LOCK); - } - - return true; - } - - function _unlock() - { - $ret = $this->_lock(LOCK_UN); - if (is_resource($this->lock_fp)) { - fclose($this->lock_fp); - } - - $this->lock_fp = null; - return $ret; - } - - function _packageExists($package, $channel = false) - { - return file_exists($this->_packageFileName($package, $channel)); - } - - /** - * Determine whether a channel exists in the registry - * - * @param string Channel name - * @param bool if true, then aliases will be ignored - * @return boolean - */ - function _channelExists($channel, $noaliases = false) - { - $a = file_exists($this->_channelFileName($channel, $noaliases)); - if (!$a && $channel == 'pear.php.net') { - return true; - } - - if (!$a && $channel == 'pecl.php.net') { - return true; - } - - if (!$a && $channel == 'doc.php.net') { - return true; - } - - return $a; - } - - /** - * Determine whether a mirror exists within the deafult channel in the registry - * - * @param string Channel name - * @param string Mirror name - * - * @return boolean - */ - function _mirrorExists($channel, $mirror) - { - $data = $this->_channelInfo($channel); - if (!isset($data['servers']['mirror'])) { - return false; - } - - foreach ($data['servers']['mirror'] as $m) { - if ($m['attribs']['host'] == $mirror) { - return true; - } - } - - return false; - } - - /** - * @param PEAR_ChannelFile Channel object - * @param donotuse - * @param string Last-Modified HTTP tag from remote request - * @return boolean|PEAR_Error True on creation, false if it already exists - */ - function _addChannel($channel, $update = false, $lastmodified = false) - { - if (!is_a($channel, 'PEAR_ChannelFile')) { - return false; - } - - if (!$channel->validate()) { - return false; - } - - if (file_exists($this->_channelFileName($channel->getName()))) { - if (!$update) { - return false; - } - - $checker = $this->_getChannel($channel->getName()); - if (PEAR::isError($checker)) { - return $checker; - } - - if ($channel->getAlias() != $checker->getAlias()) { - if (file_exists($this->_getChannelAliasFileName($checker->getAlias()))) { - @unlink($this->_getChannelAliasFileName($checker->getAlias())); - } - } - } else { - if ($update && !in_array($channel->getName(), array('pear.php.net', 'pecl.php.net', 'doc.php.net'))) { - return false; - } - } - - $ret = $this->_assertChannelDir(); - if (PEAR::isError($ret)) { - return $ret; - } - - $ret = $this->_assertChannelStateDir($channel->getName()); - if (PEAR::isError($ret)) { - return $ret; - } - - if ($channel->getAlias() != $channel->getName()) { - if (file_exists($this->_getChannelAliasFileName($channel->getAlias())) && - $this->_getChannelFromAlias($channel->getAlias()) != $channel->getName()) { - $channel->setAlias($channel->getName()); - } - - if (!$this->hasWriteAccess()) { - return false; - } - - $fp = @fopen($this->_getChannelAliasFileName($channel->getAlias()), 'w'); - if (!$fp) { - return false; - } - - fwrite($fp, $channel->getName()); - fclose($fp); - } - - if (!$this->hasWriteAccess()) { - return false; - } - - $fp = @fopen($this->_channelFileName($channel->getName()), 'wb'); - if (!$fp) { - return false; - } - - $info = $channel->toArray(); - if ($lastmodified) { - $info['_lastmodified'] = $lastmodified; - } else { - $info['_lastmodified'] = date('r'); - } - - fwrite($fp, serialize($info)); - fclose($fp); - return true; - } - - /** - * Deletion fails if there are any packages installed from the channel - * @param string|PEAR_ChannelFile channel name - * @return boolean|PEAR_Error True on deletion, false if it doesn't exist - */ - function _deleteChannel($channel) - { - if (!is_string($channel)) { - if (!is_a($channel, 'PEAR_ChannelFile')) { - return false; - } - - if (!$channel->validate()) { - return false; - } - $channel = $channel->getName(); - } - - if ($this->_getChannelFromAlias($channel) == '__uri') { - return false; - } - - if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') { - return false; - } - - if ($this->_getChannelFromAlias($channel) == 'doc.php.net') { - return false; - } - - if (!$this->_channelExists($channel)) { - return false; - } - - if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') { - return false; - } - - $channel = $this->_getChannelFromAlias($channel); - if ($channel == 'pear.php.net') { - return false; - } - - $test = $this->_listChannelPackages($channel); - if (count($test)) { - return false; - } - - $test = @rmdir($this->_channelDirectoryName($channel)); - if (!$test) { - return false; - } - - $file = $this->_getChannelAliasFileName($this->_getAlias($channel)); - if (file_exists($file)) { - $test = @unlink($file); - if (!$test) { - return false; - } - } - - $file = $this->_channelFileName($channel); - $ret = true; - if (file_exists($file)) { - $ret = @unlink($file); - } - - return $ret; - } - - /** - * Determine whether a channel exists in the registry - * @param string Channel Alias - * @return boolean - */ - function _isChannelAlias($alias) - { - return file_exists($this->_getChannelAliasFileName($alias)); - } - - /** - * @param string|null - * @param string|null - * @param string|null - * @return array|null - * @access private - */ - function _packageInfo($package = null, $key = null, $channel = 'pear.php.net') - { - if ($package === null) { - if ($channel === null) { - $channels = $this->_listChannels(); - $ret = array(); - foreach ($channels as $channel) { - $channel = strtolower($channel); - $ret[$channel] = array(); - $packages = $this->_listPackages($channel); - foreach ($packages as $package) { - $ret[$channel][] = $this->_packageInfo($package, null, $channel); - } - } - - return $ret; - } - - $ps = $this->_listPackages($channel); - if (!count($ps)) { - return array(); - } - return array_map(array(&$this, '_packageInfo'), - $ps, array_fill(0, count($ps), null), - array_fill(0, count($ps), $channel)); - } - - $fp = $this->_openPackageFile($package, 'r', $channel); - if ($fp === null) { - return null; - } - - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - clearstatcache(); - $this->_closePackageFile($fp); - $data = file_get_contents($this->_packageFileName($package, $channel)); - set_magic_quotes_runtime($rt); - $data = unserialize($data); - if ($key === null) { - return $data; - } - - // compatibility for package.xml version 2.0 - if (isset($data['old'][$key])) { - return $data['old'][$key]; - } - - if (isset($data[$key])) { - return $data[$key]; - } - - return null; - } - - /** - * @param string Channel name - * @param bool whether to strictly retrieve info of channels, not just aliases - * @return array|null - */ - function _channelInfo($channel, $noaliases = false) - { - if (!$this->_channelExists($channel, $noaliases)) { - return null; - } - - $fp = $this->_openChannelFile($channel, 'r'); - if ($fp === null) { - return null; - } - - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - clearstatcache(); - $this->_closeChannelFile($fp); - $data = file_get_contents($this->_channelFileName($channel)); - set_magic_quotes_runtime($rt); - $data = unserialize($data); - return $data; - } - - function _listChannels() - { - $channellist = array(); - if (!file_exists($this->channelsdir) || !is_dir($this->channelsdir)) { - return array('pear.php.net', 'pecl.php.net', 'doc.php.net', '__uri'); - } - - $dp = opendir($this->channelsdir); - while ($ent = readdir($dp)) { - if ($ent{0} == '.' || substr($ent, -4) != '.reg') { - continue; - } - - if ($ent == '__uri.reg') { - $channellist[] = '__uri'; - continue; - } - - $channellist[] = str_replace('_', '/', substr($ent, 0, -4)); - } - - closedir($dp); - if (!in_array('pear.php.net', $channellist)) { - $channellist[] = 'pear.php.net'; - } - - if (!in_array('pecl.php.net', $channellist)) { - $channellist[] = 'pecl.php.net'; - } - - if (!in_array('doc.php.net', $channellist)) { - $channellist[] = 'doc.php.net'; - } - - - if (!in_array('__uri', $channellist)) { - $channellist[] = '__uri'; - } - - natsort($channellist); - return $channellist; - } - - function _listPackages($channel = false) - { - if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') { - return $this->_listChannelPackages($channel); - } - - if (!file_exists($this->statedir) || !is_dir($this->statedir)) { - return array(); - } - - $pkglist = array(); - $dp = opendir($this->statedir); - if (!$dp) { - return $pkglist; - } - - while ($ent = readdir($dp)) { - if ($ent{0} == '.' || substr($ent, -4) != '.reg') { - continue; - } - - $pkglist[] = substr($ent, 0, -4); - } - closedir($dp); - return $pkglist; - } - - function _listChannelPackages($channel) - { - $pkglist = array(); - if (!file_exists($this->_channelDirectoryName($channel)) || - !is_dir($this->_channelDirectoryName($channel))) { - return array(); - } - - $dp = opendir($this->_channelDirectoryName($channel)); - if (!$dp) { - return $pkglist; - } - - while ($ent = readdir($dp)) { - if ($ent{0} == '.' || substr($ent, -4) != '.reg') { - continue; - } - $pkglist[] = substr($ent, 0, -4); - } - - closedir($dp); - return $pkglist; - } - - function _listAllPackages() - { - $ret = array(); - foreach ($this->_listChannels() as $channel) { - $ret[$channel] = $this->_listPackages($channel); - } - - return $ret; - } - - /** - * Add an installed package to the registry - * @param string package name - * @param array package info (parsed by PEAR_Common::infoFrom*() methods) - * @return bool success of saving - * @access private - */ - function _addPackage($package, $info) - { - if ($this->_packageExists($package)) { - return false; - } - - $fp = $this->_openPackageFile($package, 'wb'); - if ($fp === null) { - return false; - } - - $info['_lastmodified'] = time(); - fwrite($fp, serialize($info)); - $this->_closePackageFile($fp); - if (isset($info['filelist'])) { - $this->_rebuildFileMap(); - } - - return true; - } - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @return bool - * @access private - */ - function _addPackage2($info) - { - if (!is_a($info, 'PEAR_PackageFile_v1') && !is_a($info, 'PEAR_PackageFile_v2')) { - return false; - } - - if (!$info->validate()) { - if (class_exists('PEAR_Common')) { - $ui = PEAR_Frontend::singleton(); - if ($ui) { - foreach ($info->getValidationWarnings() as $err) { - $ui->log($err['message'], true); - } - } - } - return false; - } - - $channel = $info->getChannel(); - $package = $info->getPackage(); - $save = $info; - if ($this->_packageExists($package, $channel)) { - return false; - } - - if (!$this->_channelExists($channel, true)) { - return false; - } - - $info = $info->toArray(true); - if (!$info) { - return false; - } - - $fp = $this->_openPackageFile($package, 'wb', $channel); - if ($fp === null) { - return false; - } - - $info['_lastmodified'] = time(); - fwrite($fp, serialize($info)); - $this->_closePackageFile($fp); - $this->_rebuildFileMap(); - return true; - } - - /** - * @param string Package name - * @param array parsed package.xml 1.0 - * @param bool this parameter is only here for BC. Don't use it. - * @access private - */ - function _updatePackage($package, $info, $merge = true) - { - $oldinfo = $this->_packageInfo($package); - if (empty($oldinfo)) { - return false; - } - - $fp = $this->_openPackageFile($package, 'w'); - if ($fp === null) { - return false; - } - - if (is_object($info)) { - $info = $info->toArray(); - } - $info['_lastmodified'] = time(); - - $newinfo = $info; - if ($merge) { - $info = array_merge($oldinfo, $info); - } else { - $diff = $info; - } - - fwrite($fp, serialize($info)); - $this->_closePackageFile($fp); - if (isset($newinfo['filelist'])) { - $this->_rebuildFileMap(); - } - - return true; - } - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @return bool - * @access private - */ - function _updatePackage2($info) - { - if (!$this->_packageExists($info->getPackage(), $info->getChannel())) { - return false; - } - - $fp = $this->_openPackageFile($info->getPackage(), 'w', $info->getChannel()); - if ($fp === null) { - return false; - } - - $save = $info; - $info = $save->getArray(true); - $info['_lastmodified'] = time(); - fwrite($fp, serialize($info)); - $this->_closePackageFile($fp); - $this->_rebuildFileMap(); - return true; - } - - /** - * @param string Package name - * @param string Channel name - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null - * @access private - */ - function &_getPackage($package, $channel = 'pear.php.net') - { - $info = $this->_packageInfo($package, null, $channel); - if ($info === null) { - return $info; - } - - $a = $this->_config; - if (!$a) { - $this->_config = &new PEAR_Config; - $this->_config->set('php_dir', $this->statedir); - } - - if (!class_exists('PEAR_PackageFile')) { - require_once 'PEAR/PackageFile.php'; - } - - $pkg = &new PEAR_PackageFile($this->_config); - $pf = &$pkg->fromArray($info); - return $pf; - } - - /** - * @param string channel name - * @param bool whether to strictly retrieve channel names - * @return PEAR_ChannelFile|PEAR_Error - * @access private - */ - function &_getChannel($channel, $noaliases = false) - { - $ch = false; - if ($this->_channelExists($channel, $noaliases)) { - $chinfo = $this->_channelInfo($channel, $noaliases); - if ($chinfo) { - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $ch = &PEAR_ChannelFile::fromArrayWithErrors($chinfo); - } - } - - if ($ch) { - if ($ch->validate()) { - return $ch; - } - - foreach ($ch->getErrors(true) as $err) { - $message = $err['message'] . "\n"; - } - - $ch = PEAR::raiseError($message); - return $ch; - } - - if ($this->_getChannelFromAlias($channel) == 'pear.php.net') { - // the registry is not properly set up, so use defaults - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $pear_channel = new PEAR_ChannelFile; - $pear_channel->setServer('pear.php.net'); - $pear_channel->setAlias('pear'); - $pear_channel->setSummary('PHP Extension and Application Repository'); - $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/'); - return $pear_channel; - } - - if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') { - // the registry is not properly set up, so use defaults - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - $pear_channel = new PEAR_ChannelFile; - $pear_channel->setServer('pecl.php.net'); - $pear_channel->setAlias('pecl'); - $pear_channel->setSummary('PHP Extension Community Library'); - $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/'); - $pear_channel->setValidationPackage('PEAR_Validator_PECL', '1.0'); - return $pear_channel; - } - - if ($this->_getChannelFromAlias($channel) == 'doc.php.net') { - // the registry is not properly set up, so use defaults - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $doc_channel = new PEAR_ChannelFile; - $doc_channel->setServer('doc.php.net'); - $doc_channel->setAlias('phpdocs'); - $doc_channel->setSummary('PHP Documentation Team'); - $doc_channel->setDefaultPEARProtocols(); - $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/'); - return $doc_channel; - } - - - if ($this->_getChannelFromAlias($channel) == '__uri') { - // the registry is not properly set up, so use defaults - if (!class_exists('PEAR_ChannelFile')) { - require_once 'PEAR/ChannelFile.php'; - } - - $private = new PEAR_ChannelFile; - $private->setName('__uri'); - $private->setDefaultPEARProtocols(); - $private->setBaseURL('REST1.0', '****'); - $private->setSummary('Pseudo-channel for static packages'); - return $private; - } - - return $ch; - } - - /** - * @param string Package name - * @param string Channel name - * @return bool - */ - function packageExists($package, $channel = 'pear.php.net') - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_packageExists($package, $channel); - $this->_unlock(); - return $ret; - } - - // }}} - - // {{{ channelExists() - - /** - * @param string channel name - * @param bool if true, then aliases will be ignored - * @return bool - */ - function channelExists($channel, $noaliases = false) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_channelExists($channel, $noaliases); - $this->_unlock(); - return $ret; - } - - // }}} - - /** - * @param string channel name mirror is in - * @param string mirror name - * - * @return bool - */ - function mirrorExists($channel, $mirror) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - - $ret = $this->_mirrorExists($channel, $mirror); - $this->_unlock(); - return $ret; - } - - // {{{ isAlias() - - /** - * Determines whether the parameter is an alias of a channel - * @param string - * @return bool - */ - function isAlias($alias) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_isChannelAlias($alias); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ packageInfo() - - /** - * @param string|null - * @param string|null - * @param string - * @return array|null - */ - function packageInfo($package = null, $key = null, $channel = 'pear.php.net') - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_packageInfo($package, $key, $channel); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ channelInfo() - - /** - * Retrieve a raw array of channel data. - * - * Do not use this, instead use {@link getChannel()} for normal - * operations. Array structure is undefined in this method - * @param string channel name - * @param bool whether to strictly retrieve information only on non-aliases - * @return array|null|PEAR_Error - */ - function channelInfo($channel = null, $noaliases = false) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_channelInfo($channel, $noaliases); - $this->_unlock(); - return $ret; - } - - // }}} - - /** - * @param string - */ - function channelName($channel) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_getChannelFromAlias($channel); - $this->_unlock(); - return $ret; - } - - /** - * @param string - */ - function channelAlias($channel) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_getAlias($channel); - $this->_unlock(); - return $ret; - } - // {{{ listPackages() - - function listPackages($channel = false) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_listPackages($channel); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ listAllPackages() - - function listAllPackages() - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_listAllPackages(); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ listChannel() - - function listChannels() - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_listChannels(); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ addPackage() - - /** - * Add an installed package to the registry - * @param string|PEAR_PackageFile_v1|PEAR_PackageFile_v2 package name or object - * that will be passed to {@link addPackage2()} - * @param array package info (parsed by PEAR_Common::infoFrom*() methods) - * @return bool success of saving - */ - function addPackage($package, $info) - { - if (is_object($info)) { - return $this->addPackage2($info); - } - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $ret = $this->_addPackage($package, $info); - $this->_unlock(); - if ($ret) { - if (!class_exists('PEAR_PackageFile_v1')) { - require_once 'PEAR/PackageFile/v1.php'; - } - $pf = new PEAR_PackageFile_v1; - $pf->setConfig($this->_config); - $pf->fromArray($info); - $this->_dependencyDB->uninstallPackage($pf); - $this->_dependencyDB->installPackage($pf); - } - return $ret; - } - - // }}} - // {{{ addPackage2() - - function addPackage2($info) - { - if (!is_object($info)) { - return $this->addPackage($info['package'], $info); - } - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $ret = $this->_addPackage2($info); - $this->_unlock(); - if ($ret) { - $this->_dependencyDB->uninstallPackage($info); - $this->_dependencyDB->installPackage($info); - } - return $ret; - } - - // }}} - // {{{ updateChannel() - - /** - * For future expandibility purposes, separate this - * @param PEAR_ChannelFile - */ - function updateChannel($channel, $lastmodified = null) - { - if ($channel->getName() == '__uri') { - return false; - } - return $this->addChannel($channel, $lastmodified, true); - } - - // }}} - // {{{ deleteChannel() - - /** - * Deletion fails if there are any packages installed from the channel - * @param string|PEAR_ChannelFile channel name - * @return boolean|PEAR_Error True on deletion, false if it doesn't exist - */ - function deleteChannel($channel) - { - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - - $ret = $this->_deleteChannel($channel); - $this->_unlock(); - if ($ret && is_a($this->_config, 'PEAR_Config')) { - $this->_config->setChannels($this->listChannels()); - } - - return $ret; - } - - // }}} - // {{{ addChannel() - - /** - * @param PEAR_ChannelFile Channel object - * @param string Last-Modified header from HTTP for caching - * @return boolean|PEAR_Error True on creation, false if it already exists - */ - function addChannel($channel, $lastmodified = false, $update = false) - { - if (!is_a($channel, 'PEAR_ChannelFile') || !$channel->validate()) { - return false; - } - - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - - $ret = $this->_addChannel($channel, $update, $lastmodified); - $this->_unlock(); - if (!$update && $ret && is_a($this->_config, 'PEAR_Config')) { - $this->_config->setChannels($this->listChannels()); - } - - return $ret; - } - - // }}} - // {{{ deletePackage() - - function deletePackage($package, $channel = 'pear.php.net') - { - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - - $file = $this->_packageFileName($package, $channel); - $ret = file_exists($file) ? @unlink($file) : false; - $this->_rebuildFileMap(); - $this->_unlock(); - $p = array('channel' => $channel, 'package' => $package); - $this->_dependencyDB->uninstallPackage($p); - return $ret; - } - - // }}} - // {{{ updatePackage() - - function updatePackage($package, $info, $merge = true) - { - if (is_object($info)) { - return $this->updatePackage2($info, $merge); - } - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $ret = $this->_updatePackage($package, $info, $merge); - $this->_unlock(); - if ($ret) { - if (!class_exists('PEAR_PackageFile_v1')) { - require_once 'PEAR/PackageFile/v1.php'; - } - $pf = new PEAR_PackageFile_v1; - $pf->setConfig($this->_config); - $pf->fromArray($this->packageInfo($package)); - $this->_dependencyDB->uninstallPackage($pf); - $this->_dependencyDB->installPackage($pf); - } - return $ret; - } - - // }}} - // {{{ updatePackage2() - - function updatePackage2($info) - { - - if (!is_object($info)) { - return $this->updatePackage($info['package'], $info, $merge); - } - - if (!$info->validate(PEAR_VALIDATE_DOWNLOADING)) { - return false; - } - - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - - $ret = $this->_updatePackage2($info); - $this->_unlock(); - if ($ret) { - $this->_dependencyDB->uninstallPackage($info); - $this->_dependencyDB->installPackage($info); - } - - return $ret; - } - - // }}} - // {{{ getChannel() - /** - * @param string channel name - * @param bool whether to strictly return raw channels (no aliases) - * @return PEAR_ChannelFile|PEAR_Error - */ - function &getChannel($channel, $noaliases = false) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = &$this->_getChannel($channel, $noaliases); - $this->_unlock(); - if (!$ret) { - return PEAR::raiseError('Unknown channel: ' . $channel); - } - return $ret; - } - - // }}} - // {{{ getPackage() - /** - * @param string package name - * @param string channel name - * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null - */ - function &getPackage($package, $channel = 'pear.php.net') - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $pf = &$this->_getPackage($package, $channel); - $this->_unlock(); - return $pf; - } - - // }}} - - /** - * Get PEAR_PackageFile_v[1/2] objects representing the contents of - * a dependency group that are installed. - * - * This is used at uninstall-time - * @param array - * @return array|false - */ - function getInstalledGroup($group) - { - $ret = array(); - if (isset($group['package'])) { - if (!isset($group['package'][0])) { - $group['package'] = array($group['package']); - } - foreach ($group['package'] as $package) { - $depchannel = isset($package['channel']) ? $package['channel'] : '__uri'; - $p = &$this->getPackage($package['name'], $depchannel); - if ($p) { - $save = &$p; - $ret[] = &$save; - } - } - } - if (isset($group['subpackage'])) { - if (!isset($group['subpackage'][0])) { - $group['subpackage'] = array($group['subpackage']); - } - foreach ($group['subpackage'] as $package) { - $depchannel = isset($package['channel']) ? $package['channel'] : '__uri'; - $p = &$this->getPackage($package['name'], $depchannel); - if ($p) { - $save = &$p; - $ret[] = &$save; - } - } - } - if (!count($ret)) { - return false; - } - return $ret; - } - - // {{{ getChannelValidator() - /** - * @param string channel name - * @return PEAR_Validate|false - */ - function &getChannelValidator($channel) - { - $chan = $this->getChannel($channel); - if (PEAR::isError($chan)) { - return $chan; - } - $val = $chan->getValidationObject(); - return $val; - } - // }}} - // {{{ getChannels() - /** - * @param string channel name - * @return array an array of PEAR_ChannelFile objects representing every installed channel - */ - function &getChannels() - { - $ret = array(); - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - foreach ($this->_listChannels() as $channel) { - $e = &$this->_getChannel($channel); - if (!$e || PEAR::isError($e)) { - continue; - } - $ret[] = $e; - } - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ checkFileMap() - - /** - * Test whether a file or set of files belongs to a package. - * - * If an array is passed in - * @param string|array file path, absolute or relative to the pear - * install dir - * @param string|array name of PEAR package or array('package' => name, 'channel' => - * channel) of a package that will be ignored - * @param string API version - 1.1 will exclude any files belonging to a package - * @param array private recursion variable - * @return array|false which package and channel the file belongs to, or an empty - * string if the file does not belong to an installed package, - * or belongs to the second parameter's package - */ - function checkFileMap($path, $package = false, $api = '1.0', $attrs = false) - { - if (is_array($path)) { - static $notempty; - if (empty($notempty)) { - if (!class_exists('PEAR_Installer_Role')) { - require_once 'PEAR/Installer/Role.php'; - } - $notempty = create_function('$a','return !empty($a);'); - } - $package = is_array($package) ? array(strtolower($package[0]), strtolower($package[1])) - : strtolower($package); - $pkgs = array(); - foreach ($path as $name => $attrs) { - if (is_array($attrs)) { - if (isset($attrs['install-as'])) { - $name = $attrs['install-as']; - } - if (!in_array($attrs['role'], PEAR_Installer_Role::getInstallableRoles())) { - // these are not installed - continue; - } - if (!in_array($attrs['role'], PEAR_Installer_Role::getBaseinstallRoles())) { - $attrs['baseinstalldir'] = is_array($package) ? $package[1] : $package; - } - if (isset($attrs['baseinstalldir'])) { - $name = $attrs['baseinstalldir'] . DIRECTORY_SEPARATOR . $name; - } - } - $pkgs[$name] = $this->checkFileMap($name, $package, $api, $attrs); - if (PEAR::isError($pkgs[$name])) { - return $pkgs[$name]; - } - } - return array_filter($pkgs, $notempty); - } - if (empty($this->filemap_cache)) { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $err = $this->_readFileMap(); - $this->_unlock(); - if (PEAR::isError($err)) { - return $err; - } - } - if (!$attrs) { - $attrs = array('role' => 'php'); // any old call would be for PHP role only - } - if (isset($this->filemap_cache[$attrs['role']][$path])) { - if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) { - return false; - } - return $this->filemap_cache[$attrs['role']][$path]; - } - $l = strlen($this->install_dir); - if (substr($path, 0, $l) == $this->install_dir) { - $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l)); - } - if (isset($this->filemap_cache[$attrs['role']][$path])) { - if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) { - return false; - } - return $this->filemap_cache[$attrs['role']][$path]; - } - return false; - } - - // }}} - // {{{ flush() - /** - * Force a reload of the filemap - * @since 1.5.0RC3 - */ - function flushFileMap() - { - $this->filemap_cache = null; - clearstatcache(); // ensure that the next read gets the full, current filemap - } - - // }}} - // {{{ apiVersion() - /** - * Get the expected API version. Channels API is version 1.1, as it is backwards - * compatible with 1.0 - * @return string - */ - function apiVersion() - { - return '1.1'; - } - // }}} - - - /** - * Parse a package name, or validate a parsed package name array - * @param string|array pass in an array of format - * array( - * 'package' => 'pname', - * ['channel' => 'channame',] - * ['version' => 'version',] - * ['state' => 'state',] - * ['group' => 'groupname']) - * or a string of format - * [channel://][channame/]pname[-version|-state][/group=groupname] - * @return array|PEAR_Error - */ - function parsePackageName($param, $defaultchannel = 'pear.php.net') - { - $saveparam = $param; - if (is_array($param)) { - // convert to string for error messages - $saveparam = $this->parsedPackageNameToString($param); - // process the array - if (!isset($param['package'])) { - return PEAR::raiseError('parsePackageName(): array $param ' . - 'must contain a valid package name in index "param"', - 'package', null, null, $param); - } - if (!isset($param['uri'])) { - if (!isset($param['channel'])) { - $param['channel'] = $defaultchannel; - } - } else { - $param['channel'] = '__uri'; - } - } else { - $components = @parse_url((string) $param); - if (isset($components['scheme'])) { - if ($components['scheme'] == 'http') { - // uri package - $param = array('uri' => $param, 'channel' => '__uri'); - } elseif($components['scheme'] != 'channel') { - return PEAR::raiseError('parsePackageName(): only channel:// uris may ' . - 'be downloaded, not "' . $param . '"', 'invalid', null, null, $param); - } - } - if (!isset($components['path'])) { - return PEAR::raiseError('parsePackageName(): array $param ' . - 'must contain a valid package name in "' . $param . '"', - 'package', null, null, $param); - } - if (isset($components['host'])) { - // remove the leading "/" - $components['path'] = substr($components['path'], 1); - } - if (!isset($components['scheme'])) { - if (strpos($components['path'], '/') !== false) { - if ($components['path']{0} == '/') { - return PEAR::raiseError('parsePackageName(): this is not ' . - 'a package name, it begins with "/" in "' . $param . '"', - 'invalid', null, null, $param); - } - $parts = explode('/', $components['path']); - $components['host'] = array_shift($parts); - if (count($parts) > 1) { - $components['path'] = array_pop($parts); - $components['host'] .= '/' . implode('/', $parts); - } else { - $components['path'] = implode('/', $parts); - } - } else { - $components['host'] = $defaultchannel; - } - } else { - if (strpos($components['path'], '/')) { - $parts = explode('/', $components['path']); - $components['path'] = array_pop($parts); - $components['host'] .= '/' . implode('/', $parts); - } - } - - if (is_array($param)) { - $param['package'] = $components['path']; - } else { - $param = array( - 'package' => $components['path'] - ); - if (isset($components['host'])) { - $param['channel'] = $components['host']; - } - } - if (isset($components['fragment'])) { - $param['group'] = $components['fragment']; - } - if (isset($components['user'])) { - $param['user'] = $components['user']; - } - if (isset($components['pass'])) { - $param['pass'] = $components['pass']; - } - if (isset($components['query'])) { - parse_str($components['query'], $param['opts']); - } - // check for extension - $pathinfo = pathinfo($param['package']); - if (isset($pathinfo['extension']) && - in_array(strtolower($pathinfo['extension']), array('tgz', 'tar'))) { - $param['extension'] = $pathinfo['extension']; - $param['package'] = substr($pathinfo['basename'], 0, - strlen($pathinfo['basename']) - 4); - } - // check for version - if (strpos($param['package'], '-')) { - $test = explode('-', $param['package']); - if (count($test) != 2) { - return PEAR::raiseError('parsePackageName(): only one version/state ' . - 'delimiter "-" is allowed in "' . $saveparam . '"', - 'version', null, null, $param); - } - list($param['package'], $param['version']) = $test; - } - } - // validation - $info = $this->channelExists($param['channel']); - if (PEAR::isError($info)) { - return $info; - } - if (!$info) { - return PEAR::raiseError('unknown channel "' . $param['channel'] . - '" in "' . $saveparam . '"', 'channel', null, null, $param); - } - $chan = $this->getChannel($param['channel']); - if (PEAR::isError($chan)) { - return $chan; - } - if (!$chan) { - return PEAR::raiseError("Exception: corrupt registry, could not " . - "retrieve channel " . $param['channel'] . " information", - 'registry', null, null, $param); - } - $param['channel'] = $chan->getName(); - $validate = $chan->getValidationObject(); - $vpackage = $chan->getValidationPackage(); - // validate package name - if (!$validate->validPackageName($param['package'], $vpackage['_content'])) { - return PEAR::raiseError('parsePackageName(): invalid package name "' . - $param['package'] . '" in "' . $saveparam . '"', - 'package', null, null, $param); - } - if (isset($param['group'])) { - if (!PEAR_Validate::validGroupName($param['group'])) { - return PEAR::raiseError('parsePackageName(): dependency group "' . $param['group'] . - '" is not a valid group name in "' . $saveparam . '"', 'group', null, null, - $param); - } - } - if (isset($param['state'])) { - if (!in_array(strtolower($param['state']), $validate->getValidStates())) { - return PEAR::raiseError('parsePackageName(): state "' . $param['state'] - . '" is not a valid state in "' . $saveparam . '"', - 'state', null, null, $param); - } - } - if (isset($param['version'])) { - if (isset($param['state'])) { - return PEAR::raiseError('parsePackageName(): cannot contain both ' . - 'a version and a stability (state) in "' . $saveparam . '"', - 'version/state', null, null, $param); - } - // check whether version is actually a state - if (in_array(strtolower($param['version']), $validate->getValidStates())) { - $param['state'] = strtolower($param['version']); - unset($param['version']); - } else { - if (!$validate->validVersion($param['version'])) { - return PEAR::raiseError('parsePackageName(): "' . $param['version'] . - '" is neither a valid version nor a valid state in "' . - $saveparam . '"', 'version/state', null, null, $param); - } - } - } - return $param; - } - - /** - * @param array - * @return string - */ - function parsedPackageNameToString($parsed, $brief = false) - { - if (is_string($parsed)) { - return $parsed; - } - if (is_object($parsed)) { - $p = $parsed; - $parsed = array( - 'package' => $p->getPackage(), - 'channel' => $p->getChannel(), - 'version' => $p->getVersion(), - ); - } - if (isset($parsed['uri'])) { - return $parsed['uri']; - } - if ($brief) { - if ($channel = $this->channelAlias($parsed['channel'])) { - return $channel . '/' . $parsed['package']; - } - } - $upass = ''; - if (isset($parsed['user'])) { - $upass = $parsed['user']; - if (isset($parsed['pass'])) { - $upass .= ':' . $parsed['pass']; - } - $upass = "$upass@"; - } - $ret = 'channel://' . $upass . $parsed['channel'] . '/' . $parsed['package']; - if (isset($parsed['version']) || isset($parsed['state'])) { - $ver = isset($parsed['version']) ? $parsed['version'] : ''; - $ver .= isset($parsed['state']) ? $parsed['state'] : ''; - $ret .= '-' . $ver; - } - if (isset($parsed['extension'])) { - $ret .= '.' . $parsed['extension']; - } - if (isset($parsed['opts'])) { - $ret .= '?'; - foreach ($parsed['opts'] as $name => $value) { - $parsed['opts'][$name] = "$name=$value"; - } - $ret .= implode('&', $parsed['opts']); - } - if (isset($parsed['group'])) { - $ret .= '#' . $parsed['group']; - } - return $ret; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Remote.php b/3rdparty/PEAR/Remote.php deleted file mode 100644 index 7b1e314f90..0000000000 --- a/3rdparty/PEAR/Remote.php +++ /dev/null @@ -1,394 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Remote.php,v 1.50 2004/06/08 18:03:46 cellog Exp $ - -require_once 'PEAR.php'; -require_once 'PEAR/Config.php'; - -/** - * This is a class for doing remote operations against the central - * PEAR database. - * - * @nodep XML_RPC_Value - * @nodep XML_RPC_Message - * @nodep XML_RPC_Client - */ -class PEAR_Remote extends PEAR -{ - // {{{ properties - - var $config = null; - var $cache = null; - - // }}} - - // {{{ PEAR_Remote(config_object) - - function PEAR_Remote(&$config) - { - $this->PEAR(); - $this->config = &$config; - } - - // }}} - - // {{{ getCache() - - - function getCache($args) - { - $id = md5(serialize($args)); - $cachedir = $this->config->get('cache_dir'); - $filename = $cachedir . DIRECTORY_SEPARATOR . 'xmlrpc_cache_' . $id; - if (!file_exists($filename)) { - return null; - }; - - $fp = fopen($filename, 'rb'); - if (!$fp) { - return null; - } - $content = fread($fp, filesize($filename)); - fclose($fp); - $result = array( - 'age' => time() - filemtime($filename), - 'lastChange' => filemtime($filename), - 'content' => unserialize($content), - ); - return $result; - } - - // }}} - - // {{{ saveCache() - - function saveCache($args, $data) - { - $id = md5(serialize($args)); - $cachedir = $this->config->get('cache_dir'); - if (!file_exists($cachedir)) { - System::mkdir(array('-p', $cachedir)); - } - $filename = $cachedir.'/xmlrpc_cache_'.$id; - - $fp = @fopen($filename, "wb"); - if ($fp) { - fwrite($fp, serialize($data)); - fclose($fp); - }; - } - - // }}} - - // {{{ call(method, [args...]) - - function call($method) - { - $_args = $args = func_get_args(); - - $this->cache = $this->getCache($args); - $cachettl = $this->config->get('cache_ttl'); - // If cache is newer than $cachettl seconds, we use the cache! - if ($this->cache !== null && $this->cache['age'] < $cachettl) { - return $this->cache['content']; - }; - - if (extension_loaded("xmlrpc")) { - $result = call_user_func_array(array(&$this, 'call_epi'), $args); - if (!PEAR::isError($result)) { - $this->saveCache($_args, $result); - }; - return $result; - } - if (!@include_once("XML/RPC.php")) { - return $this->raiseError("For this remote PEAR operation you need to install the XML_RPC package"); - } - array_shift($args); - $server_host = $this->config->get('master_server'); - $username = $this->config->get('username'); - $password = $this->config->get('password'); - $eargs = array(); - foreach($args as $arg) $eargs[] = $this->_encode($arg); - $f = new XML_RPC_Message($method, $eargs); - if ($this->cache !== null) { - $maxAge = '?maxAge='.$this->cache['lastChange']; - } else { - $maxAge = ''; - }; - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - if ($proxy = parse_url($this->config->get('http_proxy'))) { - $proxy_host = @$proxy['host']; - $proxy_port = @$proxy['port']; - $proxy_user = @urldecode(@$proxy['user']); - $proxy_pass = @urldecode(@$proxy['pass']); - } - $c = new XML_RPC_Client('/xmlrpc.php'.$maxAge, $server_host, 80, $proxy_host, $proxy_port, $proxy_user, $proxy_pass); - if ($username && $password) { - $c->setCredentials($username, $password); - } - if ($this->config->get('verbose') >= 3) { - $c->setDebug(1); - } - $r = $c->send($f); - if (!$r) { - return $this->raiseError("XML_RPC send failed"); - } - $v = $r->value(); - if ($e = $r->faultCode()) { - if ($e == $GLOBALS['XML_RPC_err']['http_error'] && strstr($r->faultString(), '304 Not Modified') !== false) { - return $this->cache['content']; - } - return $this->raiseError($r->faultString(), $e); - } - - $result = XML_RPC_decode($v); - $this->saveCache($_args, $result); - return $result; - } - - // }}} - - // {{{ call_epi(method, [args...]) - - function call_epi($method) - { - do { - if (extension_loaded("xmlrpc")) { - break; - } - if (OS_WINDOWS) { - $ext = 'dll'; - } elseif (PHP_OS == 'HP-UX') { - $ext = 'sl'; - } elseif (PHP_OS == 'AIX') { - $ext = 'a'; - } else { - $ext = 'so'; - } - $ext = OS_WINDOWS ? 'dll' : 'so'; - @dl("xmlrpc-epi.$ext"); - if (extension_loaded("xmlrpc")) { - break; - } - @dl("xmlrpc.$ext"); - if (extension_loaded("xmlrpc")) { - break; - } - return $this->raiseError("unable to load xmlrpc extension"); - } while (false); - $params = func_get_args(); - array_shift($params); - $method = str_replace("_", ".", $method); - $request = xmlrpc_encode_request($method, $params); - $server_host = $this->config->get("master_server"); - if (empty($server_host)) { - return $this->raiseError("PEAR_Remote::call: no master_server configured"); - } - $server_port = 80; - if ($http_proxy = $this->config->get('http_proxy')) { - $proxy = parse_url($http_proxy); - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - $proxy_host = @$proxy['host']; - $proxy_port = @$proxy['port']; - $proxy_user = @urldecode(@$proxy['user']); - $proxy_pass = @urldecode(@$proxy['pass']); - $fp = @fsockopen($proxy_host, $proxy_port); - $use_proxy = true; - } else { - $use_proxy = false; - $fp = @fsockopen($server_host, $server_port); - } - if (!$fp && $http_proxy) { - return $this->raiseError("PEAR_Remote::call: fsockopen(`$proxy_host', $proxy_port) failed"); - } elseif (!$fp) { - return $this->raiseError("PEAR_Remote::call: fsockopen(`$server_host', $server_port) failed"); - } - $len = strlen($request); - $req_headers = "Host: $server_host:$server_port\r\n" . - "Content-type: text/xml\r\n" . - "Content-length: $len\r\n"; - $username = $this->config->get('username'); - $password = $this->config->get('password'); - if ($username && $password) { - $req_headers .= "Cookie: PEAR_USER=$username; PEAR_PW=$password\r\n"; - $tmp = base64_encode("$username:$password"); - $req_headers .= "Authorization: Basic $tmp\r\n"; - } - if ($this->cache !== null) { - $maxAge = '?maxAge='.$this->cache['lastChange']; - } else { - $maxAge = ''; - }; - - if ($use_proxy && $proxy_host != '' && $proxy_user != '') { - $req_headers .= 'Proxy-Authorization: Basic ' - .base64_encode($proxy_user.':'.$proxy_pass) - ."\r\n"; - } - - if ($this->config->get('verbose') > 3) { - print "XMLRPC REQUEST HEADERS:\n"; - var_dump($req_headers); - print "XMLRPC REQUEST BODY:\n"; - var_dump($request); - } - - if ($use_proxy && $proxy_host != '') { - $post_string = "POST http://".$server_host; - if ($proxy_port > '') { - $post_string .= ':'.$server_port; - } - } else { - $post_string = "POST "; - } - - fwrite($fp, ($post_string."/xmlrpc.php$maxAge HTTP/1.0\r\n$req_headers\r\n$request")); - $response = ''; - $line1 = fgets($fp, 2048); - if (!preg_match('!^HTTP/[0-9\.]+ (\d+) (.*)!', $line1, $matches)) { - return $this->raiseError("PEAR_Remote: invalid HTTP response from XML-RPC server"); - } - switch ($matches[1]) { - case "200": // OK - break; - case "304": // Not Modified - return $this->cache['content']; - case "401": // Unauthorized - if ($username && $password) { - return $this->raiseError("PEAR_Remote: authorization failed", 401); - } else { - return $this->raiseError("PEAR_Remote: authorization required, please log in first", 401); - } - default: - return $this->raiseError("PEAR_Remote: unexpected HTTP response", (int)$matches[1], null, null, "$matches[1] $matches[2]"); - } - while (trim(fgets($fp, 2048)) != ''); // skip rest of headers - while ($chunk = fread($fp, 10240)) { - $response .= $chunk; - } - fclose($fp); - if ($this->config->get('verbose') > 3) { - print "XMLRPC RESPONSE:\n"; - var_dump($response); - } - $ret = xmlrpc_decode($response); - if (is_array($ret) && isset($ret['__PEAR_TYPE__'])) { - if ($ret['__PEAR_TYPE__'] == 'error') { - if (isset($ret['__PEAR_CLASS__'])) { - $class = $ret['__PEAR_CLASS__']; - } else { - $class = "PEAR_Error"; - } - if ($ret['code'] === '') $ret['code'] = null; - if ($ret['message'] === '') $ret['message'] = null; - if ($ret['userinfo'] === '') $ret['userinfo'] = null; - if (strtolower($class) == 'db_error') { - $ret = $this->raiseError(PEAR::errorMessage($ret['code']), - $ret['code'], null, null, - $ret['userinfo']); - } else { - $ret = $this->raiseError($ret['message'], $ret['code'], - null, null, $ret['userinfo']); - } - } - } elseif (is_array($ret) && sizeof($ret) == 1 && isset($ret[0]) - && is_array($ret[0]) && - !empty($ret[0]['faultString']) && - !empty($ret[0]['faultCode'])) { - extract($ret[0]); - $faultString = "XML-RPC Server Fault: " . - str_replace("\n", " ", $faultString); - return $this->raiseError($faultString, $faultCode); - } - return $ret; - } - - // }}} - - // {{{ _encode - - // a slightly extended version of XML_RPC_encode - function _encode($php_val) - { - global $XML_RPC_Boolean, $XML_RPC_Int, $XML_RPC_Double; - global $XML_RPC_String, $XML_RPC_Array, $XML_RPC_Struct; - - $type = gettype($php_val); - $xmlrpcval = new XML_RPC_Value; - - switch($type) { - case "array": - reset($php_val); - $firstkey = key($php_val); - end($php_val); - $lastkey = key($php_val); - if ($firstkey === 0 && is_int($lastkey) && - ($lastkey + 1) == count($php_val)) { - $is_continuous = true; - reset($php_val); - $size = count($php_val); - for ($expect = 0; $expect < $size; $expect++, next($php_val)) { - if (key($php_val) !== $expect) { - $is_continuous = false; - break; - } - } - if ($is_continuous) { - reset($php_val); - $arr = array(); - while (list($k, $v) = each($php_val)) { - $arr[$k] = $this->_encode($v); - } - $xmlrpcval->addArray($arr); - break; - } - } - // fall though if not numerical and continuous - case "object": - $arr = array(); - while (list($k, $v) = each($php_val)) { - $arr[$k] = $this->_encode($v); - } - $xmlrpcval->addStruct($arr); - break; - case "integer": - $xmlrpcval->addScalar($php_val, $XML_RPC_Int); - break; - case "double": - $xmlrpcval->addScalar($php_val, $XML_RPC_Double); - break; - case "string": - case "NULL": - $xmlrpcval->addScalar($php_val, $XML_RPC_String); - break; - case "boolean": - $xmlrpcval->addScalar($php_val, $XML_RPC_Boolean); - break; - case "unknown type": - default: - return null; - } - return $xmlrpcval; - } - - // }}} - -} - -?> diff --git a/3rdparty/PEAR/RunTest.php b/3rdparty/PEAR/RunTest.php deleted file mode 100644 index 5182490697..0000000000 --- a/3rdparty/PEAR/RunTest.php +++ /dev/null @@ -1,968 +0,0 @@ - - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: RunTest.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.3.3 - */ - -/** - * for error handling - */ -require_once 'PEAR.php'; -require_once 'PEAR/Config.php'; - -define('DETAILED', 1); -putenv("PHP_PEAR_RUNTESTS=1"); - -/** - * Simplified version of PHP's test suite - * - * Try it with: - * - * $ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; $o=$t->run("./pear_system.phpt");print_r($o);' - * - * - * @category pear - * @package PEAR - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.3.3 - */ -class PEAR_RunTest -{ - var $_headers = array(); - var $_logger; - var $_options; - var $_php; - var $tests_count; - var $xdebug_loaded; - /** - * Saved value of php executable, used to reset $_php when we - * have a test that uses cgi - * - * @var unknown_type - */ - var $_savephp; - var $ini_overwrites = array( - 'output_handler=', - 'open_basedir=', - 'safe_mode=0', - 'disable_functions=', - 'output_buffering=Off', - 'display_errors=1', - 'log_errors=0', - 'html_errors=0', - 'track_errors=1', - 'report_memleaks=0', - 'report_zend_debug=0', - 'docref_root=', - 'docref_ext=.html', - 'error_prepend_string=', - 'error_append_string=', - 'auto_prepend_file=', - 'auto_append_file=', - 'magic_quotes_runtime=0', - 'xdebug.default_enable=0', - 'allow_url_fopen=1', - ); - - /** - * An object that supports the PEAR_Common->log() signature, or null - * @param PEAR_Common|null - */ - function PEAR_RunTest($logger = null, $options = array()) - { - if (!defined('E_DEPRECATED')) { - define('E_DEPRECATED', 0); - } - if (!defined('E_STRICT')) { - define('E_STRICT', 0); - } - $this->ini_overwrites[] = 'error_reporting=' . (E_ALL & ~(E_DEPRECATED | E_STRICT)); - if (is_null($logger)) { - require_once 'PEAR/Common.php'; - $logger = new PEAR_Common; - } - $this->_logger = $logger; - $this->_options = $options; - - $conf = &PEAR_Config::singleton(); - $this->_php = $conf->get('php_bin'); - } - - /** - * Taken from php-src/run-tests.php - * - * @param string $commandline command name - * @param array $env - * @param string $stdin standard input to pass to the command - * @return unknown - */ - function system_with_timeout($commandline, $env = null, $stdin = null) - { - $data = ''; - if (version_compare(phpversion(), '5.0.0', '<')) { - $proc = proc_open($commandline, array( - 0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'w') - ), $pipes); - } else { - $proc = proc_open($commandline, array( - 0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'w') - ), $pipes, null, $env, array('suppress_errors' => true)); - } - - if (!$proc) { - return false; - } - - if (is_string($stdin)) { - fwrite($pipes[0], $stdin); - } - fclose($pipes[0]); - - while (true) { - /* hide errors from interrupted syscalls */ - $r = $pipes; - $e = $w = null; - $n = @stream_select($r, $w, $e, 60); - - if ($n === 0) { - /* timed out */ - $data .= "\n ** ERROR: process timed out **\n"; - proc_terminate($proc); - return array(1234567890, $data); - } else if ($n > 0) { - $line = fread($pipes[1], 8192); - if (strlen($line) == 0) { - /* EOF */ - break; - } - $data .= $line; - } - } - if (function_exists('proc_get_status')) { - $stat = proc_get_status($proc); - if ($stat['signaled']) { - $data .= "\nTermsig=".$stat['stopsig']; - } - } - $code = proc_close($proc); - if (function_exists('proc_get_status')) { - $code = $stat['exitcode']; - } - return array($code, $data); - } - - /** - * Turns a PHP INI string into an array - * - * Turns -d "include_path=/foo/bar" into this: - * array( - * 'include_path' => array( - * 'operator' => '-d', - * 'value' => '/foo/bar', - * ) - * ) - * Works both with quotes and without - * - * @param string an PHP INI string, -d "include_path=/foo/bar" - * @return array - */ - function iniString2array($ini_string) - { - if (!$ini_string) { - return array(); - } - $split = preg_split('/[\s]|=/', $ini_string, -1, PREG_SPLIT_NO_EMPTY); - $key = $split[1][0] == '"' ? substr($split[1], 1) : $split[1]; - $value = $split[2][strlen($split[2]) - 1] == '"' ? substr($split[2], 0, -1) : $split[2]; - // FIXME review if this is really the struct to go with - $array = array($key => array('operator' => $split[0], 'value' => $value)); - return $array; - } - - function settings2array($settings, $ini_settings) - { - foreach ($settings as $setting) { - if (strpos($setting, '=') !== false) { - $setting = explode('=', $setting, 2); - $name = trim(strtolower($setting[0])); - $value = trim($setting[1]); - $ini_settings[$name] = $value; - } - } - return $ini_settings; - } - - function settings2params($ini_settings) - { - $settings = ''; - foreach ($ini_settings as $name => $value) { - if (is_array($value)) { - $operator = $value['operator']; - $value = $value['value']; - } else { - $operator = '-d'; - } - $value = addslashes($value); - $settings .= " $operator \"$name=$value\""; - } - return $settings; - } - - function _preparePhpBin($php, $file, $ini_settings) - { - $file = escapeshellarg($file); - // This was fixed in php 5.3 and is not needed after that - if (OS_WINDOWS && version_compare(PHP_VERSION, '5.3', '<')) { - $cmd = '"'.escapeshellarg($php).' '.$ini_settings.' -f ' . $file .'"'; - } else { - $cmd = $php . $ini_settings . ' -f ' . $file; - } - - return $cmd; - } - - function runPHPUnit($file, $ini_settings = '') - { - if (!file_exists($file) && file_exists(getcwd() . DIRECTORY_SEPARATOR . $file)) { - $file = realpath(getcwd() . DIRECTORY_SEPARATOR . $file); - } elseif (file_exists($file)) { - $file = realpath($file); - } - - $cmd = $this->_preparePhpBin($this->_php, $file, $ini_settings); - if (isset($this->_logger)) { - $this->_logger->log(2, 'Running command "' . $cmd . '"'); - } - - $savedir = getcwd(); // in case the test moves us around - chdir(dirname($file)); - echo `$cmd`; - chdir($savedir); - return 'PASSED'; // we have no way of knowing this information so assume passing - } - - /** - * Runs an individual test case. - * - * @param string The filename of the test - * @param array|string INI settings to be applied to the test run - * @param integer Number what the current running test is of the - * whole test suite being runned. - * - * @return string|object Returns PASSED, WARNED, FAILED depending on how the - * test came out. - * PEAR Error when the tester it self fails - */ - function run($file, $ini_settings = array(), $test_number = 1) - { - if (isset($this->_savephp)) { - $this->_php = $this->_savephp; - unset($this->_savephp); - } - if (empty($this->_options['cgi'])) { - // try to see if php-cgi is in the path - $res = $this->system_with_timeout('php-cgi -v'); - if (false !== $res && !(is_array($res) && in_array($res[0], array(-1, 127)))) { - $this->_options['cgi'] = 'php-cgi'; - } - } - if (1 < $len = strlen($this->tests_count)) { - $test_number = str_pad($test_number, $len, ' ', STR_PAD_LEFT); - $test_nr = "[$test_number/$this->tests_count] "; - } else { - $test_nr = ''; - } - - $file = realpath($file); - $section_text = $this->_readFile($file); - if (PEAR::isError($section_text)) { - return $section_text; - } - - if (isset($section_text['POST_RAW']) && isset($section_text['UPLOAD'])) { - return PEAR::raiseError("Cannot contain both POST_RAW and UPLOAD in test file: $file"); - } - - $cwd = getcwd(); - - $pass_options = ''; - if (!empty($this->_options['ini'])) { - $pass_options = $this->_options['ini']; - } - - if (is_string($ini_settings)) { - $ini_settings = $this->iniString2array($ini_settings); - } - - $ini_settings = $this->settings2array($this->ini_overwrites, $ini_settings); - if ($section_text['INI']) { - if (strpos($section_text['INI'], '{PWD}') !== false) { - $section_text['INI'] = str_replace('{PWD}', dirname($file), $section_text['INI']); - } - $ini = preg_split( "/[\n\r]+/", $section_text['INI']); - $ini_settings = $this->settings2array($ini, $ini_settings); - } - $ini_settings = $this->settings2params($ini_settings); - $shortname = str_replace($cwd . DIRECTORY_SEPARATOR, '', $file); - - $tested = trim($section_text['TEST']); - $tested.= !isset($this->_options['simple']) ? "[$shortname]" : ' '; - - if (!empty($section_text['POST']) || !empty($section_text['POST_RAW']) || - !empty($section_text['UPLOAD']) || !empty($section_text['GET']) || - !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) { - if (empty($this->_options['cgi'])) { - if (!isset($this->_options['quiet'])) { - $this->_logger->log(0, "SKIP $test_nr$tested (reason: --cgi option needed for this test, type 'pear help run-tests')"); - } - if (isset($this->_options['tapoutput'])) { - return array('ok', ' # skip --cgi option needed for this test, "pear help run-tests" for info'); - } - return 'SKIPPED'; - } - $this->_savephp = $this->_php; - $this->_php = $this->_options['cgi']; - } - - $temp_dir = realpath(dirname($file)); - $main_file_name = basename($file, 'phpt'); - $diff_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'diff'; - $log_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'log'; - $exp_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'exp'; - $output_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'out'; - $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'mem'; - $temp_file = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'php'; - $temp_skipif = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'skip.php'; - $temp_clean = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'clean.php'; - $tmp_post = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.'); - - // unlink old test results - $this->_cleanupOldFiles($file); - - // Check if test should be skipped. - $res = $this->_runSkipIf($section_text, $temp_skipif, $tested, $ini_settings); - if (count($res) != 2) { - return $res; - } - $info = $res['info']; - $warn = $res['warn']; - - // We've satisfied the preconditions - run the test! - if (isset($this->_options['coverage']) && $this->xdebug_loaded) { - $xdebug_file = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name . 'xdebug'; - $text = "\n" . 'function coverage_shutdown() {' . - "\n" . ' $xdebug = var_export(xdebug_get_code_coverage(), true);'; - if (!function_exists('file_put_contents')) { - $text .= "\n" . ' $fh = fopen(\'' . $xdebug_file . '\', "wb");' . - "\n" . ' if ($fh !== false) {' . - "\n" . ' fwrite($fh, $xdebug);' . - "\n" . ' fclose($fh);' . - "\n" . ' }'; - } else { - $text .= "\n" . ' file_put_contents(\'' . $xdebug_file . '\', $xdebug);'; - } - - // Workaround for http://pear.php.net/bugs/bug.php?id=17292 - $lines = explode("\n", $section_text['FILE']); - $numLines = count($lines); - $namespace = ''; - $coverage_shutdown = 'coverage_shutdown'; - - if ( - substr($lines[0], 0, 2) == 'save_text($temp_file, "save_text($temp_file, $section_text['FILE']); - } - - $args = $section_text['ARGS'] ? ' -- '.$section_text['ARGS'] : ''; - $cmd = $this->_preparePhpBin($this->_php, $temp_file, $ini_settings); - $cmd.= "$args 2>&1"; - if (isset($this->_logger)) { - $this->_logger->log(2, 'Running command "' . $cmd . '"'); - } - - // Reset environment from any previous test. - $env = $this->_resetEnv($section_text, $temp_file); - - $section_text = $this->_processUpload($section_text, $file); - if (PEAR::isError($section_text)) { - return $section_text; - } - - if (array_key_exists('POST_RAW', $section_text) && !empty($section_text['POST_RAW'])) { - $post = trim($section_text['POST_RAW']); - $raw_lines = explode("\n", $post); - - $request = ''; - $started = false; - foreach ($raw_lines as $i => $line) { - if (empty($env['CONTENT_TYPE']) && - preg_match('/^Content-Type:(.*)/i', $line, $res)) { - $env['CONTENT_TYPE'] = trim(str_replace("\r", '', $res[1])); - continue; - } - if ($started) { - $request .= "\n"; - } - $started = true; - $request .= $line; - } - - $env['CONTENT_LENGTH'] = strlen($request); - $env['REQUEST_METHOD'] = 'POST'; - - $this->save_text($tmp_post, $request); - $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post"; - } elseif (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) { - $post = trim($section_text['POST']); - $this->save_text($tmp_post, $post); - $content_length = strlen($post); - - $env['REQUEST_METHOD'] = 'POST'; - $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - $env['CONTENT_LENGTH'] = $content_length; - - $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post"; - } else { - $env['REQUEST_METHOD'] = 'GET'; - $env['CONTENT_TYPE'] = ''; - $env['CONTENT_LENGTH'] = ''; - } - - if (OS_WINDOWS && isset($section_text['RETURNS'])) { - ob_start(); - system($cmd, $return_value); - $out = ob_get_contents(); - ob_end_clean(); - $section_text['RETURNS'] = (int) trim($section_text['RETURNS']); - $returnfail = ($return_value != $section_text['RETURNS']); - } else { - $returnfail = false; - $stdin = isset($section_text['STDIN']) ? $section_text['STDIN'] : null; - $out = $this->system_with_timeout($cmd, $env, $stdin); - $return_value = $out[0]; - $out = $out[1]; - } - - $output = preg_replace('/\r\n/', "\n", trim($out)); - - if (isset($tmp_post) && realpath($tmp_post) && file_exists($tmp_post)) { - @unlink(realpath($tmp_post)); - } - chdir($cwd); // in case the test moves us around - - $this->_testCleanup($section_text, $temp_clean); - - /* when using CGI, strip the headers from the output */ - $output = $this->_stripHeadersCGI($output); - - if (isset($section_text['EXPECTHEADERS'])) { - $testheaders = $this->_processHeaders($section_text['EXPECTHEADERS']); - $missing = array_diff_assoc($testheaders, $this->_headers); - $changed = ''; - foreach ($missing as $header => $value) { - if (isset($this->_headers[$header])) { - $changed .= "-$header: $value\n+$header: "; - $changed .= $this->_headers[$header]; - } else { - $changed .= "-$header: $value\n"; - } - } - if ($missing) { - // tack on failed headers to output: - $output .= "\n====EXPECTHEADERS FAILURE====:\n$changed"; - } - } - // Does the output match what is expected? - do { - if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) { - if (isset($section_text['EXPECTF'])) { - $wanted = trim($section_text['EXPECTF']); - } else { - $wanted = trim($section_text['EXPECTREGEX']); - } - $wanted_re = preg_replace('/\r\n/', "\n", $wanted); - if (isset($section_text['EXPECTF'])) { - $wanted_re = preg_quote($wanted_re, '/'); - // Stick to basics - $wanted_re = str_replace("%s", ".+?", $wanted_re); //not greedy - $wanted_re = str_replace("%i", "[+\-]?[0-9]+", $wanted_re); - $wanted_re = str_replace("%d", "[0-9]+", $wanted_re); - $wanted_re = str_replace("%x", "[0-9a-fA-F]+", $wanted_re); - $wanted_re = str_replace("%f", "[+\-]?\.?[0-9]+\.?[0-9]*(E-?[0-9]+)?", $wanted_re); - $wanted_re = str_replace("%c", ".", $wanted_re); - // %f allows two points "-.0.0" but that is the best *simple* expression - } - - /* DEBUG YOUR REGEX HERE - var_dump($wanted_re); - print(str_repeat('=', 80) . "\n"); - var_dump($output); - */ - if (!$returnfail && preg_match("/^$wanted_re\$/s", $output)) { - if (file_exists($temp_file)) { - unlink($temp_file); - } - if (array_key_exists('FAIL', $section_text)) { - break; - } - if (!isset($this->_options['quiet'])) { - $this->_logger->log(0, "PASS $test_nr$tested$info"); - } - if (isset($this->_options['tapoutput'])) { - return array('ok', ' - ' . $tested); - } - return 'PASSED'; - } - } else { - if (isset($section_text['EXPECTFILE'])) { - $f = $temp_dir . '/' . trim($section_text['EXPECTFILE']); - if (!($fp = @fopen($f, 'rb'))) { - return PEAR::raiseError('--EXPECTFILE-- section file ' . - $f . ' not found'); - } - fclose($fp); - $section_text['EXPECT'] = file_get_contents($f); - } - - if (isset($section_text['EXPECT'])) { - $wanted = preg_replace('/\r\n/', "\n", trim($section_text['EXPECT'])); - } else { - $wanted = ''; - } - - // compare and leave on success - if (!$returnfail && 0 == strcmp($output, $wanted)) { - if (file_exists($temp_file)) { - unlink($temp_file); - } - if (array_key_exists('FAIL', $section_text)) { - break; - } - if (!isset($this->_options['quiet'])) { - $this->_logger->log(0, "PASS $test_nr$tested$info"); - } - if (isset($this->_options['tapoutput'])) { - return array('ok', ' - ' . $tested); - } - return 'PASSED'; - } - } - } while (false); - - if (array_key_exists('FAIL', $section_text)) { - // we expect a particular failure - // this is only used for testing PEAR_RunTest - $expectf = isset($section_text['EXPECTF']) ? $wanted_re : null; - $faildiff = $this->generate_diff($wanted, $output, null, $expectf); - $faildiff = preg_replace('/\r/', '', $faildiff); - $wanted = preg_replace('/\r/', '', trim($section_text['FAIL'])); - if ($faildiff == $wanted) { - if (!isset($this->_options['quiet'])) { - $this->_logger->log(0, "PASS $test_nr$tested$info"); - } - if (isset($this->_options['tapoutput'])) { - return array('ok', ' - ' . $tested); - } - return 'PASSED'; - } - unset($section_text['EXPECTF']); - $output = $faildiff; - if (isset($section_text['RETURNS'])) { - return PEAR::raiseError('Cannot have both RETURNS and FAIL in the same test: ' . - $file); - } - } - - // Test failed so we need to report details. - $txt = $warn ? 'WARN ' : 'FAIL '; - $this->_logger->log(0, $txt . $test_nr . $tested . $info); - - // write .exp - $res = $this->_writeLog($exp_filename, $wanted); - if (PEAR::isError($res)) { - return $res; - } - - // write .out - $res = $this->_writeLog($output_filename, $output); - if (PEAR::isError($res)) { - return $res; - } - - // write .diff - $returns = isset($section_text['RETURNS']) ? - array(trim($section_text['RETURNS']), $return_value) : null; - $expectf = isset($section_text['EXPECTF']) ? $wanted_re : null; - $data = $this->generate_diff($wanted, $output, $returns, $expectf); - $res = $this->_writeLog($diff_filename, $data); - if (PEAR::isError($res)) { - return $res; - } - - // write .log - $data = " ----- EXPECTED OUTPUT -$wanted ----- ACTUAL OUTPUT -$output ----- FAILED -"; - - if ($returnfail) { - $data .= " ----- EXPECTED RETURN -$section_text[RETURNS] ----- ACTUAL RETURN -$return_value -"; - } - - $res = $this->_writeLog($log_filename, $data); - if (PEAR::isError($res)) { - return $res; - } - - if (isset($this->_options['tapoutput'])) { - $wanted = explode("\n", $wanted); - $wanted = "# Expected output:\n#\n#" . implode("\n#", $wanted); - $output = explode("\n", $output); - $output = "#\n#\n# Actual output:\n#\n#" . implode("\n#", $output); - return array($wanted . $output . 'not ok', ' - ' . $tested); - } - return $warn ? 'WARNED' : 'FAILED'; - } - - function generate_diff($wanted, $output, $rvalue, $wanted_re) - { - $w = explode("\n", $wanted); - $o = explode("\n", $output); - $wr = explode("\n", $wanted_re); - $w1 = array_diff_assoc($w, $o); - $o1 = array_diff_assoc($o, $w); - $o2 = $w2 = array(); - foreach ($w1 as $idx => $val) { - if (!$wanted_re || !isset($wr[$idx]) || !isset($o1[$idx]) || - !preg_match('/^' . $wr[$idx] . '\\z/', $o1[$idx])) { - $w2[sprintf("%03d<", $idx)] = sprintf("%03d- ", $idx + 1) . $val; - } - } - foreach ($o1 as $idx => $val) { - if (!$wanted_re || !isset($wr[$idx]) || - !preg_match('/^' . $wr[$idx] . '\\z/', $val)) { - $o2[sprintf("%03d>", $idx)] = sprintf("%03d+ ", $idx + 1) . $val; - } - } - $diff = array_merge($w2, $o2); - ksort($diff); - $extra = $rvalue ? "##EXPECTED: $rvalue[0]\r\n##RETURNED: $rvalue[1]" : ''; - return implode("\r\n", $diff) . $extra; - } - - // Write the given text to a temporary file, and return the filename. - function save_text($filename, $text) - { - if (!$fp = fopen($filename, 'w')) { - return PEAR::raiseError("Cannot open file '" . $filename . "' (save_text)"); - } - fwrite($fp, $text); - fclose($fp); - if (1 < DETAILED) echo " -FILE $filename {{{ -$text -}}} -"; - } - - function _cleanupOldFiles($file) - { - $temp_dir = realpath(dirname($file)); - $mainFileName = basename($file, 'phpt'); - $diff_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'diff'; - $log_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'log'; - $exp_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'exp'; - $output_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'out'; - $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'mem'; - $temp_file = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'php'; - $temp_skipif = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'skip.php'; - $temp_clean = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'clean.php'; - $tmp_post = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.'); - - // unlink old test results - @unlink($diff_filename); - @unlink($log_filename); - @unlink($exp_filename); - @unlink($output_filename); - @unlink($memcheck_filename); - @unlink($temp_file); - @unlink($temp_skipif); - @unlink($tmp_post); - @unlink($temp_clean); - } - - function _runSkipIf($section_text, $temp_skipif, $tested, $ini_settings) - { - $info = ''; - $warn = false; - if (array_key_exists('SKIPIF', $section_text) && trim($section_text['SKIPIF'])) { - $this->save_text($temp_skipif, $section_text['SKIPIF']); - $output = $this->system_with_timeout("$this->_php$ini_settings -f \"$temp_skipif\""); - $output = $output[1]; - $loutput = ltrim($output); - unlink($temp_skipif); - if (!strncasecmp('skip', $loutput, 4)) { - $skipreason = "SKIP $tested"; - if (preg_match('/^\s*skip\s*(.+)\s*/i', $output, $m)) { - $skipreason .= '(reason: ' . $m[1] . ')'; - } - if (!isset($this->_options['quiet'])) { - $this->_logger->log(0, $skipreason); - } - if (isset($this->_options['tapoutput'])) { - return array('ok', ' # skip ' . $reason); - } - return 'SKIPPED'; - } - - if (!strncasecmp('info', $loutput, 4) - && preg_match('/^\s*info\s*(.+)\s*/i', $output, $m)) { - $info = " (info: $m[1])"; - } - - if (!strncasecmp('warn', $loutput, 4) - && preg_match('/^\s*warn\s*(.+)\s*/i', $output, $m)) { - $warn = true; /* only if there is a reason */ - $info = " (warn: $m[1])"; - } - } - - return array('warn' => $warn, 'info' => $info); - } - - function _stripHeadersCGI($output) - { - $this->headers = array(); - if (!empty($this->_options['cgi']) && - $this->_php == $this->_options['cgi'] && - preg_match("/^(.*?)(?:\n\n(.*)|\\z)/s", $output, $match)) { - $output = isset($match[2]) ? trim($match[2]) : ''; - $this->_headers = $this->_processHeaders($match[1]); - } - - return $output; - } - - /** - * Return an array that can be used with array_diff() to compare headers - * - * @param string $text - */ - function _processHeaders($text) - { - $headers = array(); - $rh = preg_split("/[\n\r]+/", $text); - foreach ($rh as $line) { - if (strpos($line, ':')!== false) { - $line = explode(':', $line, 2); - $headers[trim($line[0])] = trim($line[1]); - } - } - return $headers; - } - - function _readFile($file) - { - // Load the sections of the test file. - $section_text = array( - 'TEST' => '(unnamed test)', - 'SKIPIF' => '', - 'GET' => '', - 'COOKIE' => '', - 'POST' => '', - 'ARGS' => '', - 'INI' => '', - 'CLEAN' => '', - ); - - if (!is_file($file) || !$fp = fopen($file, "r")) { - return PEAR::raiseError("Cannot open test file: $file"); - } - - $section = ''; - while (!feof($fp)) { - $line = fgets($fp); - - // Match the beginning of a section. - if (preg_match('/^--([_A-Z]+)--/', $line, $r)) { - $section = $r[1]; - $section_text[$section] = ''; - continue; - } elseif (empty($section)) { - fclose($fp); - return PEAR::raiseError("Invalid sections formats in test file: $file"); - } - - // Add to the section text. - $section_text[$section] .= $line; - } - fclose($fp); - - return $section_text; - } - - function _writeLog($logname, $data) - { - if (!$log = fopen($logname, 'w')) { - return PEAR::raiseError("Cannot create test log - $logname"); - } - fwrite($log, $data); - fclose($log); - } - - function _resetEnv($section_text, $temp_file) - { - $env = $_ENV; - $env['REDIRECT_STATUS'] = ''; - $env['QUERY_STRING'] = ''; - $env['PATH_TRANSLATED'] = ''; - $env['SCRIPT_FILENAME'] = ''; - $env['REQUEST_METHOD'] = ''; - $env['CONTENT_TYPE'] = ''; - $env['CONTENT_LENGTH'] = ''; - if (!empty($section_text['ENV'])) { - if (strpos($section_text['ENV'], '{PWD}') !== false) { - $section_text['ENV'] = str_replace('{PWD}', dirname($temp_file), $section_text['ENV']); - } - foreach (explode("\n", trim($section_text['ENV'])) as $e) { - $e = explode('=', trim($e), 2); - if (!empty($e[0]) && isset($e[1])) { - $env[$e[0]] = $e[1]; - } - } - } - if (array_key_exists('GET', $section_text)) { - $env['QUERY_STRING'] = trim($section_text['GET']); - } else { - $env['QUERY_STRING'] = ''; - } - if (array_key_exists('COOKIE', $section_text)) { - $env['HTTP_COOKIE'] = trim($section_text['COOKIE']); - } else { - $env['HTTP_COOKIE'] = ''; - } - $env['REDIRECT_STATUS'] = '1'; - $env['PATH_TRANSLATED'] = $temp_file; - $env['SCRIPT_FILENAME'] = $temp_file; - - return $env; - } - - function _processUpload($section_text, $file) - { - if (array_key_exists('UPLOAD', $section_text) && !empty($section_text['UPLOAD'])) { - $upload_files = trim($section_text['UPLOAD']); - $upload_files = explode("\n", $upload_files); - - $request = "Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737\n" . - "-----------------------------20896060251896012921717172737\n"; - foreach ($upload_files as $fileinfo) { - $fileinfo = explode('=', $fileinfo); - if (count($fileinfo) != 2) { - return PEAR::raiseError("Invalid UPLOAD section in test file: $file"); - } - if (!realpath(dirname($file) . '/' . $fileinfo[1])) { - return PEAR::raiseError("File for upload does not exist: $fileinfo[1] " . - "in test file: $file"); - } - $file_contents = file_get_contents(dirname($file) . '/' . $fileinfo[1]); - $fileinfo[1] = basename($fileinfo[1]); - $request .= "Content-Disposition: form-data; name=\"$fileinfo[0]\"; filename=\"$fileinfo[1]\"\n"; - $request .= "Content-Type: text/plain\n\n"; - $request .= $file_contents . "\n" . - "-----------------------------20896060251896012921717172737\n"; - } - - if (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) { - // encode POST raw - $post = trim($section_text['POST']); - $post = explode('&', $post); - foreach ($post as $i => $post_info) { - $post_info = explode('=', $post_info); - if (count($post_info) != 2) { - return PEAR::raiseError("Invalid POST data in test file: $file"); - } - $post_info[0] = rawurldecode($post_info[0]); - $post_info[1] = rawurldecode($post_info[1]); - $post[$i] = $post_info; - } - foreach ($post as $post_info) { - $request .= "Content-Disposition: form-data; name=\"$post_info[0]\"\n\n"; - $request .= $post_info[1] . "\n" . - "-----------------------------20896060251896012921717172737\n"; - } - unset($section_text['POST']); - } - $section_text['POST_RAW'] = $request; - } - - return $section_text; - } - - function _testCleanup($section_text, $temp_clean) - { - if ($section_text['CLEAN']) { - // perform test cleanup - $this->save_text($temp_clean, $section_text['CLEAN']); - $output = $this->system_with_timeout("$this->_php $temp_clean 2>&1"); - if (strlen($output[1])) { - echo "BORKED --CLEAN-- section! output:\n", $output[1]; - } - if (file_exists($temp_clean)) { - unlink($temp_clean); - } - } - } -} diff --git a/3rdparty/PEAR/Task/Common.php b/3rdparty/PEAR/Task/Common.php deleted file mode 100644 index 5b99c2e434..0000000000 --- a/3rdparty/PEAR/Task/Common.php +++ /dev/null @@ -1,202 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/**#@+ - * Error codes for task validation routines - */ -define('PEAR_TASK_ERROR_NOATTRIBS', 1); -define('PEAR_TASK_ERROR_MISSING_ATTRIB', 2); -define('PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE', 3); -define('PEAR_TASK_ERROR_INVALID', 4); -/**#@-*/ -define('PEAR_TASK_PACKAGE', 1); -define('PEAR_TASK_INSTALL', 2); -define('PEAR_TASK_PACKAGEANDINSTALL', 3); -/** - * A task is an operation that manipulates the contents of a file. - * - * Simple tasks operate on 1 file. Multiple tasks are executed after all files have been - * processed and installed, and are designed to operate on all files containing the task. - * The Post-install script task simply takes advantage of the fact that it will be run - * after installation, replace is a simple task. - * - * Combining tasks is possible, but ordering is significant. - * - * - * - * - * - * - * This will first replace any instance of @data-dir@ in the test.php file - * with the path to the current data directory. Then, it will include the - * test.php file and run the script it contains to configure the package post-installation. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - * @abstract - */ -class PEAR_Task_Common -{ - /** - * Valid types for this version are 'simple' and 'multiple' - * - * - simple tasks operate on the contents of a file and write out changes to disk - * - multiple tasks operate on the contents of many files and write out the - * changes directly to disk - * - * Child task classes must override this property. - * @access protected - */ - var $type = 'simple'; - /** - * Determines which install phase this task is executed under - */ - var $phase = PEAR_TASK_INSTALL; - /** - * @access protected - */ - var $config; - /** - * @access protected - */ - var $registry; - /** - * @access protected - */ - var $logger; - /** - * @access protected - */ - var $installphase; - /** - * @param PEAR_Config - * @param PEAR_Common - */ - function PEAR_Task_Common(&$config, &$logger, $phase) - { - $this->config = &$config; - $this->registry = &$config->getRegistry(); - $this->logger = &$logger; - $this->installphase = $phase; - if ($this->type == 'multiple') { - $GLOBALS['_PEAR_TASK_POSTINSTANCES'][get_class($this)][] = &$this; - } - } - - /** - * Validate the basic contents of a task tag. - * @param PEAR_PackageFile_v2 - * @param array - * @param PEAR_Config - * @param array the entire parsed tag - * @return true|array On error, return an array in format: - * array(PEAR_TASK_ERROR_???[, param1][, param2][, ...]) - * - * For PEAR_TASK_ERROR_MISSING_ATTRIB, pass the attribute name in - * For PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, pass the attribute name and an array - * of legal values in - * @static - * @abstract - */ - function validateXml($pkg, $xml, $config, $fileXml) - { - } - - /** - * Initialize a task instance with the parameters - * @param array raw, parsed xml - * @param array attributes from the tag containing this task - * @param string|null last installed version of this package - * @abstract - */ - function init($xml, $fileAttributes, $lastVersion) - { - } - - /** - * Begin a task processing session. All multiple tasks will be processed after each file - * has been successfully installed, all simple tasks should perform their task here and - * return any errors using the custom throwError() method to allow forward compatibility - * - * This method MUST NOT write out any changes to disk - * @param PEAR_PackageFile_v2 - * @param string file contents - * @param string the eventual final file location (informational only) - * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail - * (use $this->throwError), otherwise return the new contents - * @abstract - */ - function startSession($pkg, $contents, $dest) - { - } - - /** - * This method is used to process each of the tasks for a particular multiple class - * type. Simple tasks need not implement this method. - * @param array an array of tasks - * @access protected - * @static - * @abstract - */ - function run($tasks) - { - } - - /** - * @static - * @final - */ - function hasPostinstallTasks() - { - return isset($GLOBALS['_PEAR_TASK_POSTINSTANCES']); - } - - /** - * @static - * @final - */ - function runPostinstallTasks() - { - foreach ($GLOBALS['_PEAR_TASK_POSTINSTANCES'] as $class => $tasks) { - $err = call_user_func(array($class, 'run'), - $GLOBALS['_PEAR_TASK_POSTINSTANCES'][$class]); - if ($err) { - return PEAR_Task_Common::throwError($err); - } - } - unset($GLOBALS['_PEAR_TASK_POSTINSTANCES']); - } - - /** - * Determines whether a role is a script - * @return bool - */ - function isScript() - { - return $this->type == 'script'; - } - - function throwError($msg, $code = -1) - { - include_once 'PEAR.php'; - return PEAR::raiseError($msg, $code); - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Postinstallscript.php b/3rdparty/PEAR/Task/Postinstallscript.php deleted file mode 100644 index e43ecca4b3..0000000000 --- a/3rdparty/PEAR/Task/Postinstallscript.php +++ /dev/null @@ -1,323 +0,0 @@ - - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Postinstallscript.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Common.php'; -/** - * Implements the postinstallscript file task. - * - * Note that post-install scripts are handled separately from installation, by the - * "pear run-scripts" command - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Task_Postinstallscript extends PEAR_Task_Common -{ - var $type = 'script'; - var $_class; - var $_params; - var $_obj; - /** - * - * @var PEAR_PackageFile_v2 - */ - var $_pkg; - var $_contents; - var $phase = PEAR_TASK_INSTALL; - - /** - * Validate the raw xml at parsing-time. - * - * This also attempts to validate the script to make sure it meets the criteria - * for a post-install script - * @param PEAR_PackageFile_v2 - * @param array The XML contents of the tag - * @param PEAR_Config - * @param array the entire parsed tag - * @static - */ - function validateXml($pkg, $xml, $config, $fileXml) - { - if ($fileXml['role'] != 'php') { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" must be role="php"'); - } - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $file = $pkg->getFileContents($fileXml['name']); - if (PEAR::isError($file)) { - PEAR::popErrorHandling(); - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" is not valid: ' . - $file->getMessage()); - } elseif ($file === null) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" could not be retrieved for processing!'); - } else { - $analysis = $pkg->analyzeSourceCode($file, true); - if (!$analysis) { - PEAR::popErrorHandling(); - $warnings = ''; - foreach ($pkg->getValidationWarnings() as $warn) { - $warnings .= $warn['message'] . "\n"; - } - return array(PEAR_TASK_ERROR_INVALID, 'Analysis of post-install script "' . - $fileXml['name'] . '" failed: ' . $warnings); - } - if (count($analysis['declared_classes']) != 1) { - PEAR::popErrorHandling(); - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" must declare exactly 1 class'); - } - $class = $analysis['declared_classes'][0]; - if ($class != str_replace(array('/', '.php'), array('_', ''), - $fileXml['name']) . '_postinstall') { - PEAR::popErrorHandling(); - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" class "' . $class . '" must be named "' . - str_replace(array('/', '.php'), array('_', ''), - $fileXml['name']) . '_postinstall"'); - } - if (!isset($analysis['declared_methods'][$class])) { - PEAR::popErrorHandling(); - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" must declare methods init() and run()'); - } - $methods = array('init' => 0, 'run' => 1); - foreach ($analysis['declared_methods'][$class] as $method) { - if (isset($methods[$method])) { - unset($methods[$method]); - } - } - if (count($methods)) { - PEAR::popErrorHandling(); - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" must declare methods init() and run()'); - } - } - PEAR::popErrorHandling(); - $definedparams = array(); - $tasksNamespace = $pkg->getTasksNs() . ':'; - if (!isset($xml[$tasksNamespace . 'paramgroup']) && isset($xml['paramgroup'])) { - // in order to support the older betas, which did not expect internal tags - // to also use the namespace - $tasksNamespace = ''; - } - if (isset($xml[$tasksNamespace . 'paramgroup'])) { - $params = $xml[$tasksNamespace . 'paramgroup']; - if (!is_array($params) || !isset($params[0])) { - $params = array($params); - } - foreach ($params as $param) { - if (!isset($param[$tasksNamespace . 'id'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" must have ' . - 'an ' . $tasksNamespace . 'id> tag'); - } - if (isset($param[$tasksNamespace . 'name'])) { - if (!in_array($param[$tasksNamespace . 'name'], $definedparams)) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" ' . $tasksNamespace . - 'paramgroup> id "' . $param[$tasksNamespace . 'id'] . - '" parameter "' . $param[$tasksNamespace . 'name'] . - '" has not been previously defined'); - } - if (!isset($param[$tasksNamespace . 'conditiontype'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" ' . $tasksNamespace . - 'paramgroup> id "' . $param[$tasksNamespace . 'id'] . - '" must have a ' . $tasksNamespace . - 'conditiontype> tag containing either "=", ' . - '"!=", or "preg_match"'); - } - if (!in_array($param[$tasksNamespace . 'conditiontype'], - array('=', '!=', 'preg_match'))) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" ' . $tasksNamespace . - 'paramgroup> id "' . $param[$tasksNamespace . 'id'] . - '" must have a ' . $tasksNamespace . - 'conditiontype> tag containing either "=", ' . - '"!=", or "preg_match"'); - } - if (!isset($param[$tasksNamespace . 'value'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" ' . $tasksNamespace . - 'paramgroup> id "' . $param[$tasksNamespace . 'id'] . - '" must have a ' . $tasksNamespace . - 'value> tag containing expected parameter value'); - } - } - if (isset($param[$tasksNamespace . 'instructions'])) { - if (!is_string($param[$tasksNamespace . 'instructions'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" ' . $tasksNamespace . - 'paramgroup> id "' . $param[$tasksNamespace . 'id'] . - '" ' . $tasksNamespace . 'instructions> must be simple text'); - } - } - if (!isset($param[$tasksNamespace . 'param'])) { - continue; // is no longer required - } - $subparams = $param[$tasksNamespace . 'param']; - if (!is_array($subparams) || !isset($subparams[0])) { - $subparams = array($subparams); - } - foreach ($subparams as $subparam) { - if (!isset($subparam[$tasksNamespace . 'name'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" parameter for ' . - $tasksNamespace . 'paramgroup> id "' . - $param[$tasksNamespace . 'id'] . '" must have ' . - 'a ' . $tasksNamespace . 'name> tag'); - } - if (!preg_match('/[a-zA-Z0-9]+/', - $subparam[$tasksNamespace . 'name'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" parameter "' . - $subparam[$tasksNamespace . 'name'] . - '" for ' . $tasksNamespace . 'paramgroup> id "' . - $param[$tasksNamespace . 'id'] . - '" is not a valid name. Must contain only alphanumeric characters'); - } - if (!isset($subparam[$tasksNamespace . 'prompt'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" parameter "' . - $subparam[$tasksNamespace . 'name'] . - '" for ' . $tasksNamespace . 'paramgroup> id "' . - $param[$tasksNamespace . 'id'] . - '" must have a ' . $tasksNamespace . 'prompt> tag'); - } - if (!isset($subparam[$tasksNamespace . 'type'])) { - return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "' . - $fileXml['name'] . '" parameter "' . - $subparam[$tasksNamespace . 'name'] . - '" for ' . $tasksNamespace . 'paramgroup> id "' . - $param[$tasksNamespace . 'id'] . - '" must have a ' . $tasksNamespace . 'type> tag'); - } - $definedparams[] = $param[$tasksNamespace . 'id'] . '::' . - $subparam[$tasksNamespace . 'name']; - } - } - } - return true; - } - - /** - * Initialize a task instance with the parameters - * @param array raw, parsed xml - * @param array attributes from the tag containing this task - * @param string|null last installed version of this package, if any (useful for upgrades) - */ - function init($xml, $fileattribs, $lastversion) - { - $this->_class = str_replace('/', '_', $fileattribs['name']); - $this->_filename = $fileattribs['name']; - $this->_class = str_replace ('.php', '', $this->_class) . '_postinstall'; - $this->_params = $xml; - $this->_lastversion = $lastversion; - } - - /** - * Strip the tasks: namespace from internal params - * - * @access private - */ - function _stripNamespace($params = null) - { - if ($params === null) { - $params = array(); - if (!is_array($this->_params)) { - return; - } - foreach ($this->_params as $i => $param) { - if (is_array($param)) { - $param = $this->_stripNamespace($param); - } - $params[str_replace($this->_pkg->getTasksNs() . ':', '', $i)] = $param; - } - $this->_params = $params; - } else { - $newparams = array(); - foreach ($params as $i => $param) { - if (is_array($param)) { - $param = $this->_stripNamespace($param); - } - $newparams[str_replace($this->_pkg->getTasksNs() . ':', '', $i)] = $param; - } - return $newparams; - } - } - - /** - * Unlike other tasks, the installed file name is passed in instead of the file contents, - * because this task is handled post-installation - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param string file name - * @return bool|PEAR_Error false to skip this file, PEAR_Error to fail - * (use $this->throwError) - */ - function startSession($pkg, $contents) - { - if ($this->installphase != PEAR_TASK_INSTALL) { - return false; - } - // remove the tasks: namespace if present - $this->_pkg = $pkg; - $this->_stripNamespace(); - $this->logger->log(0, 'Including external post-installation script "' . - $contents . '" - any errors are in this script'); - include_once $contents; - if (class_exists($this->_class)) { - $this->logger->log(0, 'Inclusion succeeded'); - } else { - return $this->throwError('init of post-install script class "' . $this->_class - . '" failed'); - } - $this->_obj = new $this->_class; - $this->logger->log(1, 'running post-install script "' . $this->_class . '->init()"'); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $res = $this->_obj->init($this->config, $pkg, $this->_lastversion); - PEAR::popErrorHandling(); - if ($res) { - $this->logger->log(0, 'init succeeded'); - } else { - return $this->throwError('init of post-install script "' . $this->_class . - '->init()" failed'); - } - $this->_contents = $contents; - return true; - } - - /** - * No longer used - * @see PEAR_PackageFile_v2::runPostinstallScripts() - * @param array an array of tasks - * @param string install or upgrade - * @access protected - * @static - */ - function run() - { - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Postinstallscript/rw.php b/3rdparty/PEAR/Task/Postinstallscript/rw.php deleted file mode 100644 index 8f358bf22b..0000000000 --- a/3rdparty/PEAR/Task/Postinstallscript/rw.php +++ /dev/null @@ -1,169 +0,0 @@ - - read/write version - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: rw.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a10 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Postinstallscript.php'; -/** - * Abstracts the postinstallscript file task xml. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a10 - */ -class PEAR_Task_Postinstallscript_rw extends PEAR_Task_Postinstallscript -{ - /** - * parent package file object - * - * @var PEAR_PackageFile_v2_rw - */ - var $_pkg; - /** - * Enter description here... - * - * @param PEAR_PackageFile_v2_rw $pkg - * @param PEAR_Config $config - * @param PEAR_Frontend $logger - * @param array $fileXml - * @return PEAR_Task_Postinstallscript_rw - */ - function PEAR_Task_Postinstallscript_rw(&$pkg, &$config, &$logger, $fileXml) - { - parent::PEAR_Task_Common($config, $logger, PEAR_TASK_PACKAGE); - $this->_contents = $fileXml; - $this->_pkg = &$pkg; - $this->_params = array(); - } - - function validate() - { - return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents); - } - - function getName() - { - return 'postinstallscript'; - } - - /** - * add a simple to the post-install script - * - * Order is significant, so call this method in the same - * sequence the users should see the paramgroups. The $params - * parameter should either be the result of a call to {@link getParam()} - * or an array of calls to getParam(). - * - * Use {@link addConditionTypeGroup()} to add a containing - * a tag - * @param string $id id as seen by the script - * @param array|false $params array of getParam() calls, or false for no params - * @param string|false $instructions - */ - function addParamGroup($id, $params = false, $instructions = false) - { - if ($params && isset($params[0]) && !isset($params[1])) { - $params = $params[0]; - } - $stuff = - array( - $this->_pkg->getTasksNs() . ':id' => $id, - ); - if ($instructions) { - $stuff[$this->_pkg->getTasksNs() . ':instructions'] = $instructions; - } - if ($params) { - $stuff[$this->_pkg->getTasksNs() . ':param'] = $params; - } - $this->_params[$this->_pkg->getTasksNs() . ':paramgroup'][] = $stuff; - } - - /** - * add a complex to the post-install script with conditions - * - * This inserts a with - * - * Order is significant, so call this method in the same - * sequence the users should see the paramgroups. The $params - * parameter should either be the result of a call to {@link getParam()} - * or an array of calls to getParam(). - * - * Use {@link addParamGroup()} to add a simple - * - * @param string $id id as seen by the script - * @param string $oldgroup id of the section referenced by - * - * @param string $param name of the from the older section referenced - * by - * @param string $value value to match of the parameter - * @param string $conditiontype one of '=', '!=', 'preg_match' - * @param array|false $params array of getParam() calls, or false for no params - * @param string|false $instructions - */ - function addConditionTypeGroup($id, $oldgroup, $param, $value, $conditiontype = '=', - $params = false, $instructions = false) - { - if ($params && isset($params[0]) && !isset($params[1])) { - $params = $params[0]; - } - $stuff = array( - $this->_pkg->getTasksNs() . ':id' => $id, - ); - if ($instructions) { - $stuff[$this->_pkg->getTasksNs() . ':instructions'] = $instructions; - } - $stuff[$this->_pkg->getTasksNs() . ':name'] = $oldgroup . '::' . $param; - $stuff[$this->_pkg->getTasksNs() . ':conditiontype'] = $conditiontype; - $stuff[$this->_pkg->getTasksNs() . ':value'] = $value; - if ($params) { - $stuff[$this->_pkg->getTasksNs() . ':param'] = $params; - } - $this->_params[$this->_pkg->getTasksNs() . ':paramgroup'][] = $stuff; - } - - function getXml() - { - return $this->_params; - } - - /** - * Use to set up a param tag for use in creating a paramgroup - * @static - */ - function getParam($name, $prompt, $type = 'string', $default = null) - { - if ($default !== null) { - return - array( - $this->_pkg->getTasksNs() . ':name' => $name, - $this->_pkg->getTasksNs() . ':prompt' => $prompt, - $this->_pkg->getTasksNs() . ':type' => $type, - $this->_pkg->getTasksNs() . ':default' => $default - ); - } - return - array( - $this->_pkg->getTasksNs() . ':name' => $name, - $this->_pkg->getTasksNs() . ':prompt' => $prompt, - $this->_pkg->getTasksNs() . ':type' => $type, - ); - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Replace.php b/3rdparty/PEAR/Task/Replace.php deleted file mode 100644 index 376df64df6..0000000000 --- a/3rdparty/PEAR/Task/Replace.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Replace.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Common.php'; -/** - * Implements the replace file task. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Task_Replace extends PEAR_Task_Common -{ - var $type = 'simple'; - var $phase = PEAR_TASK_PACKAGEANDINSTALL; - var $_replacements; - - /** - * Validate the raw xml at parsing-time. - * @param PEAR_PackageFile_v2 - * @param array raw, parsed xml - * @param PEAR_Config - * @static - */ - function validateXml($pkg, $xml, $config, $fileXml) - { - if (!isset($xml['attribs'])) { - return array(PEAR_TASK_ERROR_NOATTRIBS); - } - if (!isset($xml['attribs']['type'])) { - return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'type'); - } - if (!isset($xml['attribs']['to'])) { - return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'to'); - } - if (!isset($xml['attribs']['from'])) { - return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'from'); - } - if ($xml['attribs']['type'] == 'pear-config') { - if (!in_array($xml['attribs']['to'], $config->getKeys())) { - return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], - $config->getKeys()); - } - } elseif ($xml['attribs']['type'] == 'php-const') { - if (defined($xml['attribs']['to'])) { - return true; - } else { - return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], - array('valid PHP constant')); - } - } elseif ($xml['attribs']['type'] == 'package-info') { - if (in_array($xml['attribs']['to'], - array('name', 'summary', 'channel', 'notes', 'extends', 'description', - 'release_notes', 'license', 'release-license', 'license-uri', - 'version', 'api-version', 'state', 'api-state', 'release_date', - 'date', 'time'))) { - return true; - } else { - return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], - array('name', 'summary', 'channel', 'notes', 'extends', 'description', - 'release_notes', 'license', 'release-license', 'license-uri', - 'version', 'api-version', 'state', 'api-state', 'release_date', - 'date', 'time')); - } - } else { - return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'type', $xml['attribs']['type'], - array('pear-config', 'package-info', 'php-const')); - } - return true; - } - - /** - * Initialize a task instance with the parameters - * @param array raw, parsed xml - * @param unused - */ - function init($xml, $attribs) - { - $this->_replacements = isset($xml['attribs']) ? array($xml) : $xml; - } - - /** - * Do a package.xml 1.0 replacement, with additional package-info fields available - * - * See validateXml() source for the complete list of allowed fields - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param string file contents - * @param string the eventual final file location (informational only) - * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail - * (use $this->throwError), otherwise return the new contents - */ - function startSession($pkg, $contents, $dest) - { - $subst_from = $subst_to = array(); - foreach ($this->_replacements as $a) { - $a = $a['attribs']; - $to = ''; - if ($a['type'] == 'pear-config') { - if ($this->installphase == PEAR_TASK_PACKAGE) { - return false; - } - if ($a['to'] == 'master_server') { - $chan = $this->registry->getChannel($pkg->getChannel()); - if (!PEAR::isError($chan)) { - $to = $chan->getServer(); - } else { - $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]"); - return false; - } - } else { - if ($this->config->isDefinedLayer('ftp')) { - // try the remote config file first - $to = $this->config->get($a['to'], 'ftp', $pkg->getChannel()); - if (is_null($to)) { - // then default to local - $to = $this->config->get($a['to'], null, $pkg->getChannel()); - } - } else { - $to = $this->config->get($a['to'], null, $pkg->getChannel()); - } - } - if (is_null($to)) { - $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]"); - return false; - } - } elseif ($a['type'] == 'php-const') { - if ($this->installphase == PEAR_TASK_PACKAGE) { - return false; - } - if (defined($a['to'])) { - $to = constant($a['to']); - } else { - $this->logger->log(0, "$dest: invalid php-const replacement: $a[to]"); - return false; - } - } else { - if ($t = $pkg->packageInfo($a['to'])) { - $to = $t; - } else { - $this->logger->log(0, "$dest: invalid package-info replacement: $a[to]"); - return false; - } - } - if (!is_null($to)) { - $subst_from[] = $a['from']; - $subst_to[] = $to; - } - } - $this->logger->log(3, "doing " . sizeof($subst_from) . - " substitution(s) for $dest"); - if (sizeof($subst_from)) { - $contents = str_replace($subst_from, $subst_to, $contents); - } - return $contents; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Replace/rw.php b/3rdparty/PEAR/Task/Replace/rw.php deleted file mode 100644 index 32dad58629..0000000000 --- a/3rdparty/PEAR/Task/Replace/rw.php +++ /dev/null @@ -1,61 +0,0 @@ - - read/write version - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: rw.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a10 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Replace.php'; -/** - * Abstracts the replace task xml. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a10 - */ -class PEAR_Task_Replace_rw extends PEAR_Task_Replace -{ - function PEAR_Task_Replace_rw(&$pkg, &$config, &$logger, $fileXml) - { - parent::PEAR_Task_Common($config, $logger, PEAR_TASK_PACKAGE); - $this->_contents = $fileXml; - $this->_pkg = &$pkg; - $this->_params = array(); - } - - function validate() - { - return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents); - } - - function setInfo($from, $to, $type) - { - $this->_params = array('attribs' => array('from' => $from, 'to' => $to, 'type' => $type)); - } - - function getName() - { - return 'replace'; - } - - function getXml() - { - return $this->_params; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Unixeol.php b/3rdparty/PEAR/Task/Unixeol.php deleted file mode 100644 index 89ca81be34..0000000000 --- a/3rdparty/PEAR/Task/Unixeol.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Unixeol.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Common.php'; -/** - * Implements the unix line endings file task. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Task_Unixeol extends PEAR_Task_Common -{ - var $type = 'simple'; - var $phase = PEAR_TASK_PACKAGE; - var $_replacements; - - /** - * Validate the raw xml at parsing-time. - * @param PEAR_PackageFile_v2 - * @param array raw, parsed xml - * @param PEAR_Config - * @static - */ - function validateXml($pkg, $xml, $config, $fileXml) - { - if ($xml != '') { - return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed'); - } - return true; - } - - /** - * Initialize a task instance with the parameters - * @param array raw, parsed xml - * @param unused - */ - function init($xml, $attribs) - { - } - - /** - * Replace all line endings with line endings customized for the current OS - * - * See validateXml() source for the complete list of allowed fields - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param string file contents - * @param string the eventual final file location (informational only) - * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail - * (use $this->throwError), otherwise return the new contents - */ - function startSession($pkg, $contents, $dest) - { - $this->logger->log(3, "replacing all line endings with \\n in $dest"); - return preg_replace("/\r\n|\n\r|\r|\n/", "\n", $contents); - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Unixeol/rw.php b/3rdparty/PEAR/Task/Unixeol/rw.php deleted file mode 100644 index b2ae5fa5cb..0000000000 --- a/3rdparty/PEAR/Task/Unixeol/rw.php +++ /dev/null @@ -1,56 +0,0 @@ - - read/write version - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: rw.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a10 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Unixeol.php'; -/** - * Abstracts the unixeol task xml. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a10 - */ -class PEAR_Task_Unixeol_rw extends PEAR_Task_Unixeol -{ - function PEAR_Task_Unixeol_rw(&$pkg, &$config, &$logger, $fileXml) - { - parent::PEAR_Task_Common($config, $logger, PEAR_TASK_PACKAGE); - $this->_contents = $fileXml; - $this->_pkg = &$pkg; - $this->_params = array(); - } - - function validate() - { - return true; - } - - function getName() - { - return 'unixeol'; - } - - function getXml() - { - return ''; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Windowseol.php b/3rdparty/PEAR/Task/Windowseol.php deleted file mode 100644 index 8ba4171159..0000000000 --- a/3rdparty/PEAR/Task/Windowseol.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Windowseol.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Common.php'; -/** - * Implements the windows line endsings file task. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Task_Windowseol extends PEAR_Task_Common -{ - var $type = 'simple'; - var $phase = PEAR_TASK_PACKAGE; - var $_replacements; - - /** - * Validate the raw xml at parsing-time. - * @param PEAR_PackageFile_v2 - * @param array raw, parsed xml - * @param PEAR_Config - * @static - */ - function validateXml($pkg, $xml, $config, $fileXml) - { - if ($xml != '') { - return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed'); - } - return true; - } - - /** - * Initialize a task instance with the parameters - * @param array raw, parsed xml - * @param unused - */ - function init($xml, $attribs) - { - } - - /** - * Replace all line endings with windows line endings - * - * See validateXml() source for the complete list of allowed fields - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - * @param string file contents - * @param string the eventual final file location (informational only) - * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail - * (use $this->throwError), otherwise return the new contents - */ - function startSession($pkg, $contents, $dest) - { - $this->logger->log(3, "replacing all line endings with \\r\\n in $dest"); - return preg_replace("/\r\n|\n\r|\r|\n/", "\r\n", $contents); - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Task/Windowseol/rw.php b/3rdparty/PEAR/Task/Windowseol/rw.php deleted file mode 100644 index f0f1149c83..0000000000 --- a/3rdparty/PEAR/Task/Windowseol/rw.php +++ /dev/null @@ -1,56 +0,0 @@ - - read/write version - * - * PHP versions 4 and 5 - * - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: rw.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a10 - */ -/** - * Base class - */ -require_once 'PEAR/Task/Windowseol.php'; -/** - * Abstracts the windowseol task xml. - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a10 - */ -class PEAR_Task_Windowseol_rw extends PEAR_Task_Windowseol -{ - function PEAR_Task_Windowseol_rw(&$pkg, &$config, &$logger, $fileXml) - { - parent::PEAR_Task_Common($config, $logger, PEAR_TASK_PACKAGE); - $this->_contents = $fileXml; - $this->_pkg = &$pkg; - $this->_params = array(); - } - - function validate() - { - return true; - } - - function getName() - { - return 'windowseol'; - } - - function getXml() - { - return ''; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Validate.php b/3rdparty/PEAR/Validate.php deleted file mode 100644 index 176560bc23..0000000000 --- a/3rdparty/PEAR/Validate.php +++ /dev/null @@ -1,629 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Validate.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ -/**#@+ - * Constants for install stage - */ -define('PEAR_VALIDATE_INSTALLING', 1); -define('PEAR_VALIDATE_UNINSTALLING', 2); // this is not bit-mapped like the others -define('PEAR_VALIDATE_NORMAL', 3); -define('PEAR_VALIDATE_DOWNLOADING', 4); // this is not bit-mapped like the others -define('PEAR_VALIDATE_PACKAGING', 7); -/**#@-*/ -require_once 'PEAR/Common.php'; -require_once 'PEAR/Validator/PECL.php'; - -/** - * Validation class for package.xml - channel-level advanced validation - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_Validate -{ - var $packageregex = _PEAR_COMMON_PACKAGE_NAME_PREG; - /** - * @var PEAR_PackageFile_v1|PEAR_PackageFile_v2 - */ - var $_packagexml; - /** - * @var int one of the PEAR_VALIDATE_* constants - */ - var $_state = PEAR_VALIDATE_NORMAL; - /** - * Format: ('error' => array('field' => name, 'reason' => reason), 'warning' => same) - * @var array - * @access private - */ - var $_failures = array('error' => array(), 'warning' => array()); - - /** - * Override this method to handle validation of normal package names - * @param string - * @return bool - * @access protected - */ - function _validPackageName($name) - { - return (bool) preg_match('/^' . $this->packageregex . '\\z/', $name); - } - - /** - * @param string package name to validate - * @param string name of channel-specific validation package - * @final - */ - function validPackageName($name, $validatepackagename = false) - { - if ($validatepackagename) { - if (strtolower($name) == strtolower($validatepackagename)) { - return (bool) preg_match('/^[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*\\z/', $name); - } - } - return $this->_validPackageName($name); - } - - /** - * This validates a bundle name, and bundle names must conform - * to the PEAR naming convention, so the method is final and static. - * @param string - * @final - * @static - */ - function validGroupName($name) - { - return (bool) preg_match('/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/', $name); - } - - /** - * Determine whether $state represents a valid stability level - * @param string - * @return bool - * @static - * @final - */ - function validState($state) - { - return in_array($state, array('snapshot', 'devel', 'alpha', 'beta', 'stable')); - } - - /** - * Get a list of valid stability levels - * @return array - * @static - * @final - */ - function getValidStates() - { - return array('snapshot', 'devel', 'alpha', 'beta', 'stable'); - } - - /** - * Determine whether a version is a properly formatted version number that can be used - * by version_compare - * @param string - * @return bool - * @static - * @final - */ - function validVersion($ver) - { - return (bool) preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver); - } - - /** - * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 - */ - function setPackageFile(&$pf) - { - $this->_packagexml = &$pf; - } - - /** - * @access private - */ - function _addFailure($field, $reason) - { - $this->_failures['errors'][] = array('field' => $field, 'reason' => $reason); - } - - /** - * @access private - */ - function _addWarning($field, $reason) - { - $this->_failures['warnings'][] = array('field' => $field, 'reason' => $reason); - } - - function getFailures() - { - $failures = $this->_failures; - $this->_failures = array('warnings' => array(), 'errors' => array()); - return $failures; - } - - /** - * @param int one of the PEAR_VALIDATE_* constants - */ - function validate($state = null) - { - if (!isset($this->_packagexml)) { - return false; - } - if ($state !== null) { - $this->_state = $state; - } - $this->_failures = array('warnings' => array(), 'errors' => array()); - $this->validatePackageName(); - $this->validateVersion(); - $this->validateMaintainers(); - $this->validateDate(); - $this->validateSummary(); - $this->validateDescription(); - $this->validateLicense(); - $this->validateNotes(); - if ($this->_packagexml->getPackagexmlVersion() == '1.0') { - $this->validateState(); - $this->validateFilelist(); - } elseif ($this->_packagexml->getPackagexmlVersion() == '2.0' || - $this->_packagexml->getPackagexmlVersion() == '2.1') { - $this->validateTime(); - $this->validateStability(); - $this->validateDeps(); - $this->validateMainFilelist(); - $this->validateReleaseFilelist(); - //$this->validateGlobalTasks(); - $this->validateChangelog(); - } - return !((bool) count($this->_failures['errors'])); - } - - /** - * @access protected - */ - function validatePackageName() - { - if ($this->_state == PEAR_VALIDATE_PACKAGING || - $this->_state == PEAR_VALIDATE_NORMAL) { - if (($this->_packagexml->getPackagexmlVersion() == '2.0' || - $this->_packagexml->getPackagexmlVersion() == '2.1') && - $this->_packagexml->getExtends()) { - $version = $this->_packagexml->getVersion() . ''; - $name = $this->_packagexml->getPackage(); - $test = array_shift($a = explode('.', $version)); - if ($test == '0') { - return true; - } - $vlen = strlen($test); - $majver = substr($name, strlen($name) - $vlen); - while ($majver && !is_numeric($majver{0})) { - $majver = substr($majver, 1); - } - if ($majver != $test) { - $this->_addWarning('package', "package $name extends package " . - $this->_packagexml->getExtends() . ' and so the name should ' . - 'have a postfix equal to the major version like "' . - $this->_packagexml->getExtends() . $test . '"'); - return true; - } elseif (substr($name, 0, strlen($name) - $vlen) != - $this->_packagexml->getExtends()) { - $this->_addWarning('package', "package $name extends package " . - $this->_packagexml->getExtends() . ' and so the name must ' . - 'be an extension like "' . $this->_packagexml->getExtends() . - $test . '"'); - return true; - } - } - } - if (!$this->validPackageName($this->_packagexml->getPackage())) { - $this->_addFailure('name', 'package name "' . - $this->_packagexml->getPackage() . '" is invalid'); - return false; - } - } - - /** - * @access protected - */ - function validateVersion() - { - if ($this->_state != PEAR_VALIDATE_PACKAGING) { - if (!$this->validVersion($this->_packagexml->getVersion())) { - $this->_addFailure('version', - 'Invalid version number "' . $this->_packagexml->getVersion() . '"'); - } - return false; - } - $version = $this->_packagexml->getVersion(); - $versioncomponents = explode('.', $version); - if (count($versioncomponents) != 3) { - $this->_addWarning('version', - 'A version number should have 3 decimals (x.y.z)'); - return true; - } - $name = $this->_packagexml->getPackage(); - // version must be based upon state - switch ($this->_packagexml->getState()) { - case 'snapshot' : - return true; - case 'devel' : - if ($versioncomponents[0] . 'a' == '0a') { - return true; - } - if ($versioncomponents[0] == 0) { - $versioncomponents[0] = '0'; - $this->_addWarning('version', - 'version "' . $version . '" should be "' . - implode('.' ,$versioncomponents) . '"'); - } else { - $this->_addWarning('version', - 'packages with devel stability must be < version 1.0.0'); - } - return true; - break; - case 'alpha' : - case 'beta' : - // check for a package that extends a package, - // like Foo and Foo2 - if ($this->_state == PEAR_VALIDATE_PACKAGING) { - if (substr($versioncomponents[2], 1, 2) == 'rc') { - $this->_addFailure('version', 'Release Candidate versions ' . - 'must have capital RC, not lower-case rc'); - return false; - } - } - if (!$this->_packagexml->getExtends()) { - if ($versioncomponents[0] == '1') { - if ($versioncomponents[2]{0} == '0') { - if ($versioncomponents[2] == '0') { - // version 1.*.0000 - $this->_addWarning('version', - 'version 1.' . $versioncomponents[1] . - '.0 probably should not be alpha or beta'); - return true; - } elseif (strlen($versioncomponents[2]) > 1) { - // version 1.*.0RC1 or 1.*.0beta24 etc. - return true; - } else { - // version 1.*.0 - $this->_addWarning('version', - 'version 1.' . $versioncomponents[1] . - '.0 probably should not be alpha or beta'); - return true; - } - } else { - $this->_addWarning('version', - 'bugfix versions (1.3.x where x > 0) probably should ' . - 'not be alpha or beta'); - return true; - } - } elseif ($versioncomponents[0] != '0') { - $this->_addWarning('version', - 'major versions greater than 1 are not allowed for packages ' . - 'without an tag or an identical postfix (foo2 v2.0.0)'); - return true; - } - if ($versioncomponents[0] . 'a' == '0a') { - return true; - } - if ($versioncomponents[0] == 0) { - $versioncomponents[0] = '0'; - $this->_addWarning('version', - 'version "' . $version . '" should be "' . - implode('.' ,$versioncomponents) . '"'); - } - } else { - $vlen = strlen($versioncomponents[0] . ''); - $majver = substr($name, strlen($name) - $vlen); - while ($majver && !is_numeric($majver{0})) { - $majver = substr($majver, 1); - } - if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) { - $this->_addWarning('version', 'first version number "' . - $versioncomponents[0] . '" must match the postfix of ' . - 'package name "' . $name . '" (' . - $majver . ')'); - return true; - } - if ($versioncomponents[0] == $majver) { - if ($versioncomponents[2]{0} == '0') { - if ($versioncomponents[2] == '0') { - // version 2.*.0000 - $this->_addWarning('version', - "version $majver." . $versioncomponents[1] . - '.0 probably should not be alpha or beta'); - return false; - } elseif (strlen($versioncomponents[2]) > 1) { - // version 2.*.0RC1 or 2.*.0beta24 etc. - return true; - } else { - // version 2.*.0 - $this->_addWarning('version', - "version $majver." . $versioncomponents[1] . - '.0 cannot be alpha or beta'); - return true; - } - } else { - $this->_addWarning('version', - "bugfix versions ($majver.x.y where y > 0) should " . - 'not be alpha or beta'); - return true; - } - } elseif ($versioncomponents[0] != '0') { - $this->_addWarning('version', - "only versions 0.x.y and $majver.x.y are allowed for alpha/beta releases"); - return true; - } - if ($versioncomponents[0] . 'a' == '0a') { - return true; - } - if ($versioncomponents[0] == 0) { - $versioncomponents[0] = '0'; - $this->_addWarning('version', - 'version "' . $version . '" should be "' . - implode('.' ,$versioncomponents) . '"'); - } - } - return true; - break; - case 'stable' : - if ($versioncomponents[0] == '0') { - $this->_addWarning('version', 'versions less than 1.0.0 cannot ' . - 'be stable'); - return true; - } - if (!is_numeric($versioncomponents[2])) { - if (preg_match('/\d+(rc|a|alpha|b|beta)\d*/i', - $versioncomponents[2])) { - $this->_addWarning('version', 'version "' . $version . '" or any ' . - 'RC/beta/alpha version cannot be stable'); - return true; - } - } - // check for a package that extends a package, - // like Foo and Foo2 - if ($this->_packagexml->getExtends()) { - $vlen = strlen($versioncomponents[0] . ''); - $majver = substr($name, strlen($name) - $vlen); - while ($majver && !is_numeric($majver{0})) { - $majver = substr($majver, 1); - } - if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) { - $this->_addWarning('version', 'first version number "' . - $versioncomponents[0] . '" must match the postfix of ' . - 'package name "' . $name . '" (' . - $majver . ')'); - return true; - } - } elseif ($versioncomponents[0] > 1) { - $this->_addWarning('version', 'major version x in x.y.z may not be greater than ' . - '1 for any package that does not have an tag'); - } - return true; - break; - default : - return false; - break; - } - } - - /** - * @access protected - */ - function validateMaintainers() - { - // maintainers can only be truly validated server-side for most channels - // but allow this customization for those who wish it - return true; - } - - /** - * @access protected - */ - function validateDate() - { - if ($this->_state == PEAR_VALIDATE_NORMAL || - $this->_state == PEAR_VALIDATE_PACKAGING) { - - if (!preg_match('/(\d\d\d\d)\-(\d\d)\-(\d\d)/', - $this->_packagexml->getDate(), $res) || - count($res) < 4 - || !checkdate($res[2], $res[3], $res[1]) - ) { - $this->_addFailure('date', 'invalid release date "' . - $this->_packagexml->getDate() . '"'); - return false; - } - - if ($this->_state == PEAR_VALIDATE_PACKAGING && - $this->_packagexml->getDate() != date('Y-m-d')) { - $this->_addWarning('date', 'Release Date "' . - $this->_packagexml->getDate() . '" is not today'); - } - } - return true; - } - - /** - * @access protected - */ - function validateTime() - { - if (!$this->_packagexml->getTime()) { - // default of no time value set - return true; - } - - // packager automatically sets time, so only validate if pear validate is called - if ($this->_state = PEAR_VALIDATE_NORMAL) { - if (!preg_match('/\d\d:\d\d:\d\d/', - $this->_packagexml->getTime())) { - $this->_addFailure('time', 'invalid release time "' . - $this->_packagexml->getTime() . '"'); - return false; - } - - $result = preg_match('|\d{2}\:\d{2}\:\d{2}|', $this->_packagexml->getTime(), $matches); - if ($result === false || empty($matches)) { - $this->_addFailure('time', 'invalid release time "' . - $this->_packagexml->getTime() . '"'); - return false; - } - } - - return true; - } - - /** - * @access protected - */ - function validateState() - { - // this is the closest to "final" php4 can get - if (!PEAR_Validate::validState($this->_packagexml->getState())) { - if (strtolower($this->_packagexml->getState() == 'rc')) { - $this->_addFailure('state', 'RC is not a state, it is a version ' . - 'postfix, use ' . $this->_packagexml->getVersion() . 'RC1, state beta'); - } - $this->_addFailure('state', 'invalid release state "' . - $this->_packagexml->getState() . '", must be one of: ' . - implode(', ', PEAR_Validate::getValidStates())); - return false; - } - return true; - } - - /** - * @access protected - */ - function validateStability() - { - $ret = true; - $packagestability = $this->_packagexml->getState(); - $apistability = $this->_packagexml->getState('api'); - if (!PEAR_Validate::validState($packagestability)) { - $this->_addFailure('state', 'invalid release stability "' . - $this->_packagexml->getState() . '", must be one of: ' . - implode(', ', PEAR_Validate::getValidStates())); - $ret = false; - } - $apistates = PEAR_Validate::getValidStates(); - array_shift($apistates); // snapshot is not allowed - if (!in_array($apistability, $apistates)) { - $this->_addFailure('state', 'invalid API stability "' . - $this->_packagexml->getState('api') . '", must be one of: ' . - implode(', ', $apistates)); - $ret = false; - } - return $ret; - } - - /** - * @access protected - */ - function validateSummary() - { - return true; - } - - /** - * @access protected - */ - function validateDescription() - { - return true; - } - - /** - * @access protected - */ - function validateLicense() - { - return true; - } - - /** - * @access protected - */ - function validateNotes() - { - return true; - } - - /** - * for package.xml 2.0 only - channels can't use package.xml 1.0 - * @access protected - */ - function validateDependencies() - { - return true; - } - - /** - * for package.xml 1.0 only - * @access private - */ - function _validateFilelist() - { - return true; // placeholder for now - } - - /** - * for package.xml 2.0 only - * @access protected - */ - function validateMainFilelist() - { - return true; // placeholder for now - } - - /** - * for package.xml 2.0 only - * @access protected - */ - function validateReleaseFilelist() - { - return true; // placeholder for now - } - - /** - * @access protected - */ - function validateChangelog() - { - return true; - } - - /** - * @access protected - */ - function validateFilelist() - { - return true; - } - - /** - * @access protected - */ - function validateDeps() - { - return true; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR/Validator/PECL.php b/3rdparty/PEAR/Validator/PECL.php deleted file mode 100644 index 89b951f7b6..0000000000 --- a/3rdparty/PEAR/Validator/PECL.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 1997-2006 The PHP Group - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: PECL.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a5 - */ -/** - * This is the parent class for all validators - */ -require_once 'PEAR/Validate.php'; -/** - * Channel Validator for the pecl.php.net channel - * @category pear - * @package PEAR - * @author Greg Beaver - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a5 - */ -class PEAR_Validator_PECL extends PEAR_Validate -{ - function validateVersion() - { - if ($this->_state == PEAR_VALIDATE_PACKAGING) { - $version = $this->_packagexml->getVersion(); - $versioncomponents = explode('.', $version); - $last = array_pop($versioncomponents); - if (substr($last, 1, 2) == 'rc') { - $this->_addFailure('version', 'Release Candidate versions must have ' . - 'upper-case RC, not lower-case rc'); - return false; - } - } - return true; - } - - function validatePackageName() - { - $ret = parent::validatePackageName(); - if ($this->_packagexml->getPackageType() == 'extsrc' || - $this->_packagexml->getPackageType() == 'zendextsrc') { - if (strtolower($this->_packagexml->getPackage()) != - strtolower($this->_packagexml->getProvidesExtension())) { - $this->_addWarning('providesextension', 'package name "' . - $this->_packagexml->getPackage() . '" is different from extension name "' . - $this->_packagexml->getProvidesExtension() . '"'); - } - } - return $ret; - } -} -?> \ No newline at end of file diff --git a/3rdparty/PEAR/XMLParser.php b/3rdparty/PEAR/XMLParser.php deleted file mode 100644 index 7f091c16fa..0000000000 --- a/3rdparty/PEAR/XMLParser.php +++ /dev/null @@ -1,253 +0,0 @@ - - * @author Stephan Schmidt (original XML_Unserializer code) - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version CVS: $Id: XMLParser.php 313023 2011-07-06 19:17:11Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 1.4.0a1 - */ - -/** - * Parser for any xml file - * @category pear - * @package PEAR - * @author Greg Beaver - * @author Stephan Schmidt (original XML_Unserializer code) - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version Release: 1.9.4 - * @link http://pear.php.net/package/PEAR - * @since Class available since Release 1.4.0a1 - */ -class PEAR_XMLParser -{ - /** - * unserilialized data - * @var string $_serializedData - */ - var $_unserializedData = null; - - /** - * name of the root tag - * @var string $_root - */ - var $_root = null; - - /** - * stack for all data that is found - * @var array $_dataStack - */ - var $_dataStack = array(); - - /** - * stack for all values that are generated - * @var array $_valStack - */ - var $_valStack = array(); - - /** - * current tag depth - * @var int $_depth - */ - var $_depth = 0; - - /** - * The XML encoding to use - * @var string $encoding - */ - var $encoding = 'ISO-8859-1'; - - /** - * @return array - */ - function getData() - { - return $this->_unserializedData; - } - - /** - * @param string xml content - * @return true|PEAR_Error - */ - function parse($data) - { - if (!extension_loaded('xml')) { - include_once 'PEAR.php'; - return PEAR::raiseError("XML Extension not found", 1); - } - $this->_dataStack = $this->_valStack = array(); - $this->_depth = 0; - - if ( - strpos($data, 'encoding="UTF-8"') - || strpos($data, 'encoding="utf-8"') - || strpos($data, "encoding='UTF-8'") - || strpos($data, "encoding='utf-8'") - ) { - $this->encoding = 'UTF-8'; - } - - if (version_compare(phpversion(), '5.0.0', 'lt') && $this->encoding == 'UTF-8') { - $data = utf8_decode($data); - $this->encoding = 'ISO-8859-1'; - } - - $xp = xml_parser_create($this->encoding); - xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, 0); - xml_set_object($xp, $this); - xml_set_element_handler($xp, 'startHandler', 'endHandler'); - xml_set_character_data_handler($xp, 'cdataHandler'); - if (!xml_parse($xp, $data)) { - $msg = xml_error_string(xml_get_error_code($xp)); - $line = xml_get_current_line_number($xp); - xml_parser_free($xp); - include_once 'PEAR.php'; - return PEAR::raiseError("XML Error: '$msg' on line '$line'", 2); - } - xml_parser_free($xp); - return true; - } - - /** - * Start element handler for XML parser - * - * @access private - * @param object $parser XML parser object - * @param string $element XML element - * @param array $attribs attributes of XML tag - * @return void - */ - function startHandler($parser, $element, $attribs) - { - $this->_depth++; - $this->_dataStack[$this->_depth] = null; - - $val = array( - 'name' => $element, - 'value' => null, - 'type' => 'string', - 'childrenKeys' => array(), - 'aggregKeys' => array() - ); - - if (count($attribs) > 0) { - $val['children'] = array(); - $val['type'] = 'array'; - $val['children']['attribs'] = $attribs; - } - - array_push($this->_valStack, $val); - } - - /** - * post-process data - * - * @param string $data - * @param string $element element name - */ - function postProcess($data, $element) - { - return trim($data); - } - - /** - * End element handler for XML parser - * - * @access private - * @param object XML parser object - * @param string - * @return void - */ - function endHandler($parser, $element) - { - $value = array_pop($this->_valStack); - $data = $this->postProcess($this->_dataStack[$this->_depth], $element); - - // adjust type of the value - switch (strtolower($value['type'])) { - // unserialize an array - case 'array': - if ($data !== '') { - $value['children']['_content'] = $data; - } - - $value['value'] = isset($value['children']) ? $value['children'] : array(); - break; - - /* - * unserialize a null value - */ - case 'null': - $data = null; - break; - - /* - * unserialize any scalar value - */ - default: - settype($data, $value['type']); - $value['value'] = $data; - break; - } - - $parent = array_pop($this->_valStack); - if ($parent === null) { - $this->_unserializedData = &$value['value']; - $this->_root = &$value['name']; - return true; - } - - // parent has to be an array - if (!isset($parent['children']) || !is_array($parent['children'])) { - $parent['children'] = array(); - if ($parent['type'] != 'array') { - $parent['type'] = 'array'; - } - } - - if (!empty($value['name'])) { - // there already has been a tag with this name - if (in_array($value['name'], $parent['childrenKeys'])) { - // no aggregate has been created for this tag - if (!in_array($value['name'], $parent['aggregKeys'])) { - if (isset($parent['children'][$value['name']])) { - $parent['children'][$value['name']] = array($parent['children'][$value['name']]); - } else { - $parent['children'][$value['name']] = array(); - } - array_push($parent['aggregKeys'], $value['name']); - } - array_push($parent['children'][$value['name']], $value['value']); - } else { - $parent['children'][$value['name']] = &$value['value']; - array_push($parent['childrenKeys'], $value['name']); - } - } else { - array_push($parent['children'],$value['value']); - } - array_push($this->_valStack, $parent); - - $this->_depth--; - } - - /** - * Handler for character data - * - * @access private - * @param object XML parser object - * @param string CDATA - * @return void - */ - function cdataHandler($parser, $cdata) - { - $this->_dataStack[$this->_depth] .= $cdata; - } -} \ No newline at end of file diff --git a/3rdparty/PEAR5.php b/3rdparty/PEAR5.php deleted file mode 100644 index 428606780b..0000000000 --- a/3rdparty/PEAR5.php +++ /dev/null @@ -1,33 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param mixed $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - return false; - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by Sabre_CalDAV_CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on either VEVENT or VTODO. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in Sabre_CalDAV_CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * @param mixed $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters) { - - $result = array(); - $objects = $this->getCalendarObjects($calendarId); - - $validator = new Sabre_CalDAV_CalendarQueryValidator(); - - foreach($objects as $object) { - - if ($this->validateFilterForObject($object, $filters)) { - $result[] = $object['uri']; - } - - } - - return $result; - - } - - /** - * This method validates if a filters (as passed to calendarQuery) matches - * the given object. - * - * @param array $object - * @param array $filter - * @return bool - */ - protected function validateFilterForObject(array $object, array $filters) { - - // Unfortunately, setting the 'calendardata' here is optional. If - // it was excluded, we actually need another call to get this as - // well. - if (!isset($object['calendardata'])) { - $object = $this->getCalendarObject($object['calendarid'], $object['uri']); - } - - $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata']; - $vObject = VObject\Reader::read($data); - - $validator = new Sabre_CalDAV_CalendarQueryValidator(); - return $validator->validate($vObject, $filters); - - } - - -} diff --git a/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php b/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php deleted file mode 100644 index 881538ab60..0000000000 --- a/3rdparty/Sabre/CalDAV/Backend/BackendInterface.php +++ /dev/null @@ -1,231 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param mixed $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations); - - /** - * Delete a calendar and all it's objects - * - * @param mixed $calendarId - * @return void - */ - public function deleteCalendar($calendarId); - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calendar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * * size - The size of the calendar objects, in bytes. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * If neither etag or size are specified, the calendardata will be - * used/fetched to determine these numbers. If both are specified the - * amount of times this is needed is reduced by a great degree. - * - * @param mixed $calendarId - * @return array - */ - public function getCalendarObjects($calendarId); - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param mixed $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri); - - /** - * Creates a new calendar object. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Updates an existing calendarobject, based on it's uri. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Deletes an existing calendar object. - * - * @param mixed $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri); - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by Sabre_CalDAV_CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on either VEVENT or VTODO. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in Sabre_CalDAV_CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * @param mixed $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters); - -} diff --git a/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php b/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php deleted file mode 100644 index d5a1409d9b..0000000000 --- a/3rdparty/Sabre/CalDAV/Backend/NotificationSupport.php +++ /dev/null @@ -1,47 +0,0 @@ - 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Creates the backend - * - * @param PDO $pdo - * @param string $calendarTableName - * @param string $calendarObjectTableName - */ - public function __construct(PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') { - - $this->pdo = $pdo; - $this->calendarTableName = $calendarTableName; - $this->calendarObjectTableName = $calendarObjectTableName; - - } - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principaluri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - - $fields = array_values($this->propertyMap); - $fields[] = 'id'; - $fields[] = 'uri'; - $fields[] = 'ctag'; - $fields[] = 'components'; - $fields[] = 'principaluri'; - $fields[] = 'transparent'; - - // Making fields a comma-delimited list - $fields = implode(', ', $fields); - $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC"); - $stmt->execute(array($principalUri)); - - $calendars = array(); - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $components = array(); - if ($row['components']) { - $components = explode(',',$row['components']); - } - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp' => new Sabre_CalDAV_Property_ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), - ); - - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - - } - - return $calendars; - - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - * @return string - */ - public function createCalendar($principalUri, $calendarUri, array $properties) { - - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - 'transparent', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ':transparent' => 0, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { - throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - $transp = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp'; - if (isset($properties[$transp])) { - $values[':transparent'] = $properties[$transp]->getValue()==='transparent'; - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); - $stmt->execute($values); - - return $this->pdo->lastInsertId(); - - } - - /** - * Updates properties for a calendar. - * - * The mutations array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existent property is always successful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($mutations as $propertyName=>$propertyValue) { - - switch($propertyName) { - case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-calendar-transp' : - $fieldName = 'transparent'; - $newValues[$fieldName] = $propertyValue->getValue()==='transparent'; - break; - default : - // Checking the property map - if (!isset($this->propertyMap[$propertyName])) { - // We don't know about this property. - $hasError = true; - $result[403][$propertyName] = null; - unset($mutations[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - } - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($mutations as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - - // Now we're generating the sql query. - $valuesSql = array(); - foreach($newValues as $fieldName=>$value) { - $valuesSql[] = $fieldName . ' = ?'; - } - $valuesSql[] = 'ctag = ctag + 1'; - - $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?"); - $newValues['id'] = $calendarId; - $stmt->execute(array_values($newValues)); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calendar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * * size - The size of the calendar objects, in bytes. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * If neither etag or size are specified, the calendardata will be - * used/fetched to determine these numbers. If both are specified the - * amount of times this is needed is reduced by a great degree. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - - $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $result = array(); - foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { - $result[] = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'lastmodified' => $row['lastmodified'], - 'etag' => '"' . $row['etag'] . '"', - 'calendarid' => $row['calendarid'], - 'size' => (int)$row['size'], - ); - } - - return $result; - - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId, $objectUri)); - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - - if(!$row) return null; - - return array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'lastmodified' => $row['lastmodified'], - 'etag' => '"' . $row['etag'] . '"', - 'calendarid' => $row['calendarid'], - 'size' => (int)$row['size'], - 'calendardata' => $row['calendardata'], - ); - - } - - - /** - * Creates a new calendar object. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - - $extraData = $this->getDenormalizedData($calendarData); - - $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)'); - $stmt->execute(array( - $calendarId, - $objectUri, - $calendarData, - time(), - $extraData['etag'], - $extraData['size'], - $extraData['componentType'], - $extraData['firstOccurence'], - $extraData['lastOccurence'], - )); - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - return '"' . $extraData['etag'] . '"'; - - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData) { - - $extraData = $this->getDenormalizedData($calendarData); - - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - return '"' . $extraData['etag'] . '"'; - - } - - /** - * Parses some information from calendar objects, used for optimized - * calendar-queries. - * - * Returns an array with the following keys: - * * etag - * * size - * * componentType - * * firstOccurence - * * lastOccurence - * - * @param string $calendarData - * @return array - */ - protected function getDenormalizedData($calendarData) { - - $vObject = VObject\Reader::read($calendarData); - $componentType = null; - $component = null; - $firstOccurence = null; - $lastOccurence = null; - foreach($vObject->getComponents() as $component) { - if ($component->name!=='VTIMEZONE') { - $componentType = $component->name; - break; - } - } - if (!$componentType) { - throw new Sabre_DAV_Exception_BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); - } - if ($componentType === 'VEVENT') { - $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); - // Finding the last occurence is a bit harder - if (!isset($component->RRULE)) { - if (isset($component->DTEND)) { - $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); - } elseif (isset($component->DURATION)) { - $endDate = clone $component->DTSTART->getDateTime(); - $endDate->add(VObject\DateTimeParser::parse($component->DURATION->value)); - $lastOccurence = $endDate->getTimeStamp(); - } elseif ($component->DTSTART->getDateType()===VObject\Property\DateTime::DATE) { - $endDate = clone $component->DTSTART->getDateTime(); - $endDate->modify('+1 day'); - $lastOccurence = $endDate->getTimeStamp(); - } else { - $lastOccurence = $firstOccurence; - } - } else { - $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID); - $maxDate = new DateTime(self::MAX_DATE); - if ($it->isInfinite()) { - $lastOccurence = $maxDate->getTimeStamp(); - } else { - $end = $it->getDtEnd(); - while($it->valid() && $end < $maxDate) { - $end = $it->getDtEnd(); - $it->next(); - - } - $lastOccurence = $end->getTimeStamp(); - } - - } - } - - return array( - 'etag' => md5($calendarData), - 'size' => strlen($calendarData), - 'componentType' => $componentType, - 'firstOccurence' => $firstOccurence, - 'lastOccurence' => $lastOccurence, - ); - - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by Sabre_CalDAV_CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on a VEVENT. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in Sabre_CalDAV_CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * This specific implementation (for the PDO) backend optimizes filters on - * specific components, and VEVENT time-ranges. - * - * @param string $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters) { - - $result = array(); - $validator = new Sabre_CalDAV_CalendarQueryValidator(); - - $componentType = null; - $requirePostFilter = true; - $timeRange = null; - - // if no filters were specified, we don't need to filter after a query - if (!$filters['prop-filters'] && !$filters['comp-filters']) { - $requirePostFilter = false; - } - - // Figuring out if there's a component filter - if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { - $componentType = $filters['comp-filters'][0]['name']; - - // Checking if we need post-filters - if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { - $requirePostFilter = false; - } - // There was a time-range filter - if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { - $timeRange = $filters['comp-filters'][0]['time-range']; - - // If start time OR the end time is not specified, we can do a - // 100% accurate mysql query. - if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { - $requirePostFilter = false; - } - } - - } - - if ($requirePostFilter) { - $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; - } else { - $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; - } - - $values = array( - 'calendarid' => $calendarId, - ); - - if ($componentType) { - $query.=" AND componenttype = :componenttype"; - $values['componenttype'] = $componentType; - } - - if ($timeRange && $timeRange['start']) { - $query.=" AND lastoccurence > :startdate"; - $values['startdate'] = $timeRange['start']->getTimeStamp(); - } - if ($timeRange && $timeRange['end']) { - $query.=" AND firstoccurence < :enddate"; - $values['enddate'] = $timeRange['end']->getTimeStamp(); - } - - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - $result = array(); - while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - if ($requirePostFilter) { - if (!$this->validateFilterForObject($row, $filters)) { - continue; - } - } - $result[] = $row['uri']; - - } - - return $result; - - } -} diff --git a/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php b/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php deleted file mode 100644 index f73f0ff3d8..0000000000 --- a/3rdparty/Sabre/CalDAV/Backend/SharingSupport.php +++ /dev/null @@ -1,238 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalBackend = $principalBackend; - $this->calendarInfo = $calendarInfo; - - } - - /** - * Returns the name of the calendar - * - * @return string - */ - public function getName() { - - return $this->calendarInfo['uri']; - - } - - /** - * Updates properties such as the display name and description - * - * @param array $mutations - * @return array - */ - public function updateProperties($mutations) { - - return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); - - } - - /** - * Returns the list of properties - * - * @param array $requestedProperties - * @return array - */ - public function getProperties($requestedProperties) { - - $response = array(); - - foreach($requestedProperties as $prop) switch($prop) { - - case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : - $response[$prop] = new Sabre_CalDAV_Property_SupportedCalendarData(); - break; - case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : - $response[$prop] = new Sabre_CalDAV_Property_SupportedCollationSet(); - break; - default : - if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; - break; - - } - return $response; - - } - - /** - * Returns a calendar object - * - * The contained calendar objects are for example Events or Todo's. - * - * @param string $name - * @return Sabre_CalDAV_ICalendarObject - */ - public function getChild($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_NotFound('Calendar object not found'); - - $obj['acl'] = $this->getACL(); - // Removing the irrelivant - foreach($obj['acl'] as $key=>$acl) { - if ($acl['privilege'] === '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy') { - unset($obj['acl'][$key]); - } - } - - return new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - - } - - /** - * Returns the full list of calendar objects - * - * @return array - */ - public function getChildren() { - - $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); - $children = array(); - foreach($objs as $obj) { - $obj['acl'] = $this->getACL(); - // Removing the irrelivant - foreach($obj['acl'] as $key=>$acl) { - if ($acl['privilege'] === '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy') { - unset($obj['acl'][$key]); - } - } - $children[] = new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - } - return $children; - - } - - /** - * Checks if a child-node exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) - return false; - else - return true; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in calendars. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating collections in calendar objects is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid ICalendar string. - * - * @param string $name - * @param resource $calendarData - * @return string|null - */ - public function createFile($name,$calendarData = null) { - - if (is_resource($calendarData)) { - $calendarData = stream_get_contents($calendarData); - } - return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); - - } - - /** - * Deletes the calendar. - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); - - } - - /** - * Renames the calendar. Note that most calendars use the - * {DAV:}displayname to display a name to display a name. - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Renaming calendars is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->getOwner() . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-read', - 'protected' => true, - ), - array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy', - 'principal' => '{DAV:}authenticated', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - $default = Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet(); - - // We need to inject 'read-free-busy' in the tree, aggregated under - // {DAV:}read. - foreach($default['aggregates'] as &$agg) { - - if ($agg['privilege'] !== '{DAV:}read') continue; - - $agg['aggregates'][] = array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy', - ); - - } - return $default; - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by Sabre_CalDAV_CalendarQueryParser. - * - * @param array $filters - * @return array - */ - public function calendarQuery(array $filters) { - - return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/CalendarObject.php b/3rdparty/Sabre/CalDAV/CalendarObject.php deleted file mode 100644 index 40bd8588c7..0000000000 --- a/3rdparty/Sabre/CalDAV/CalendarObject.php +++ /dev/null @@ -1,279 +0,0 @@ -caldavBackend = $caldavBackend; - - if (!isset($objectData['calendarid'])) { - throw new InvalidArgumentException('The objectData argument must contain a \'calendarid\' property'); - } - if (!isset($objectData['uri'])) { - throw new InvalidArgumentException('The objectData argument must contain an \'uri\' property'); - } - - $this->calendarInfo = $calendarInfo; - $this->objectData = $objectData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->objectData['uri']; - - } - - /** - * Returns the ICalendar-formatted object - * - * @return string - */ - public function get() { - - // Pre-populating the 'calendardata' is optional, if we don't have it - // already we fetch it from the backend. - if (!isset($this->objectData['calendardata'])) { - $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']); - } - return $this->objectData['calendardata']; - - } - - /** - * Updates the ICalendar-formatted object - * - * @param string|resource $calendarData - * @return string - */ - public function put($calendarData) { - - if (is_resource($calendarData)) { - $calendarData = stream_get_contents($calendarData); - } - $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData); - $this->objectData['calendardata'] = $calendarData; - $this->objectData['etag'] = $etag; - - return $etag; - - } - - /** - * Deletes the calendar object - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/calendar; charset=utf-8'; - - } - - /** - * Returns an ETag for this object. - * - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * @return string - */ - public function getETag() { - - if (isset($this->objectData['etag'])) { - return $this->objectData['etag']; - } else { - return '"' . md5($this->get()). '"'; - } - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return $this->objectData['lastmodified']; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - if (array_key_exists('size',$this->objectData)) { - return $this->objectData['size']; - } else { - return strlen($this->get()); - } - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - // An alternative acl may be specified in the object data. - if (isset($this->objectData['acl'])) { - return $this->objectData['acl']; - } - - // The default ACL - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} - diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryParser.php b/3rdparty/Sabre/CalDAV/CalendarQueryParser.php deleted file mode 100644 index b95095f96f..0000000000 --- a/3rdparty/Sabre/CalDAV/CalendarQueryParser.php +++ /dev/null @@ -1,298 +0,0 @@ -dom = $dom; - - $this->xpath = new DOMXPath($dom); - $this->xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $this->xpath->registerNameSpace('dav','DAV:'); - - } - - /** - * Parses the request. - * - * @return void - */ - public function parse() { - - $filterNode = null; - - $filter = $this->xpath->query('/cal:calendar-query/cal:filter'); - if ($filter->length !== 1) { - throw new Sabre_DAV_Exception_BadRequest('Only one filter element is allowed'); - } - - $compFilters = $this->parseCompFilters($filter->item(0)); - if (count($compFilters)!==1) { - throw new Sabre_DAV_Exception_BadRequest('There must be exactly 1 top-level comp-filter.'); - } - - $this->filters = $compFilters[0]; - $this->requestedProperties = array_keys(Sabre_DAV_XMLUtil::parseProperties($this->dom->firstChild)); - - $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand'); - if ($expand->length>0) { - $this->expand = $this->parseExpand($expand->item(0)); - } - - - } - - /** - * Parses all the 'comp-filter' elements from a node - * - * @param DOMElement $parentNode - * @return array - */ - protected function parseCompFilters(DOMElement $parentNode) { - - $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode); - $result = array(); - - for($ii=0; $ii < $compFilterNodes->length; $ii++) { - - $compFilterNode = $compFilterNodes->item($ii); - - $compFilter = array(); - $compFilter['name'] = $compFilterNode->getAttribute('name'); - $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0; - $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode); - $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode); - $compFilter['time-range'] = $this->parseTimeRange($compFilterNode); - - if ($compFilter['time-range'] && !in_array($compFilter['name'],array( - 'VEVENT', - 'VTODO', - 'VJOURNAL', - 'VFREEBUSY', - 'VALARM', - ))) { - throw new Sabre_DAV_Exception_BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component'); - }; - - $result[] = $compFilter; - - } - - return $result; - - } - - /** - * Parses all the prop-filter elements from a node - * - * @param DOMElement $parentNode - * @return array - */ - protected function parsePropFilters(DOMElement $parentNode) { - - $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode); - $result = array(); - - for ($ii=0; $ii < $propFilterNodes->length; $ii++) { - - $propFilterNode = $propFilterNodes->item($ii); - $propFilter = array(); - $propFilter['name'] = $propFilterNode->getAttribute('name'); - $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0; - $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode); - $propFilter['text-match'] = $this->parseTextMatch($propFilterNode); - $propFilter['time-range'] = $this->parseTimeRange($propFilterNode); - - $result[] = $propFilter; - - } - - return $result; - - } - - /** - * Parses the param-filter element - * - * @param DOMElement $parentNode - * @return array - */ - protected function parseParamFilters(DOMElement $parentNode) { - - $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode); - $result = array(); - - for($ii=0;$ii<$paramFilterNodes->length;$ii++) { - - $paramFilterNode = $paramFilterNodes->item($ii); - $paramFilter = array(); - $paramFilter['name'] = $paramFilterNode->getAttribute('name'); - $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0; - $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode); - - $result[] = $paramFilter; - - } - - return $result; - - } - - /** - * Parses the text-match element - * - * @param DOMElement $parentNode - * @return array|null - */ - protected function parseTextMatch(DOMElement $parentNode) { - - $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode); - - if ($textMatchNodes->length === 0) - return null; - - $textMatchNode = $textMatchNodes->item(0); - $negateCondition = $textMatchNode->getAttribute('negate-condition'); - $negateCondition = $negateCondition==='yes'; - $collation = $textMatchNode->getAttribute('collation'); - if (!$collation) $collation = 'i;ascii-casemap'; - - return array( - 'negate-condition' => $negateCondition, - 'collation' => $collation, - 'value' => $textMatchNode->nodeValue - ); - - } - - /** - * Parses the time-range element - * - * @param DOMElement $parentNode - * @return array|null - */ - protected function parseTimeRange(DOMElement $parentNode) { - - $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode); - if ($timeRangeNodes->length === 0) { - return null; - } - - $timeRangeNode = $timeRangeNodes->item(0); - - if ($start = $timeRangeNode->getAttribute('start')) { - $start = VObject\DateTimeParser::parseDateTime($start); - } else { - $start = null; - } - if ($end = $timeRangeNode->getAttribute('end')) { - $end = VObject\DateTimeParser::parseDateTime($end); - } else { - $end = null; - } - - if (!is_null($start) && !is_null($end) && $end <= $start) { - throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the time-range filter'); - } - - return array( - 'start' => $start, - 'end' => $end, - ); - - } - - /** - * Parses the CALDAV:expand element - * - * @param DOMElement $parentNode - * @return void - */ - protected function parseExpand(DOMElement $parentNode) { - - $start = $parentNode->getAttribute('start'); - if(!$start) { - throw new Sabre_DAV_Exception_BadRequest('The "start" attribute is required for the CALDAV:expand element'); - } - $start = VObject\DateTimeParser::parseDateTime($start); - - $end = $parentNode->getAttribute('end'); - if(!$end) { - throw new Sabre_DAV_Exception_BadRequest('The "end" attribute is required for the CALDAV:expand element'); - } - $end = VObject\DateTimeParser::parseDateTime($end); - - if ($end <= $start) { - throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the expand element.'); - } - - return array( - 'start' => $start, - 'end' => $end, - ); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php deleted file mode 100644 index 53e86fc509..0000000000 --- a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php +++ /dev/null @@ -1,372 +0,0 @@ -name !== $filters['name']) { - return false; - } - - return - $this->validateCompFilters($vObject, $filters['comp-filters']) && - $this->validatePropFilters($vObject, $filters['prop-filters']); - - - } - - /** - * This method checks the validity of comp-filters. - * - * A list of comp-filters needs to be specified. Also the parent of the - * component we're checking should be specified, not the component to check - * itself. - * - * @param VObject\Component $parent - * @param array $filters - * @return bool - */ - protected function validateCompFilters(VObject\Component $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent->$filter['name']); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if ($filter['time-range']) { - foreach($parent->$filter['name'] as $subComponent) { - if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { - continue 2; - } - } - return false; - } - - if (!$filter['comp-filters'] && !$filter['prop-filters']) { - continue; - } - - // If there are sub-filters, we need to find at least one component - // for which the subfilters hold true. - foreach($parent->$filter['name'] as $subComponent) { - - if ( - $this->validateCompFilters($subComponent, $filter['comp-filters']) && - $this->validatePropFilters($subComponent, $filter['prop-filters'])) { - // We had a match, so this comp-filter succeeds - continue 2; - } - - } - - // If we got here it means there were sub-comp-filters or - // sub-prop-filters and there was no match. This means this filter - // needs to return false. - return false; - - } - - // If we got here it means we got through all comp-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of prop-filters. - * - * A list of prop-filters needs to be specified. Also the parent of the - * property we're checking should be specified, not the property to check - * itself. - * - * @param VObject\Component $parent - * @param array $filters - * @return bool - */ - protected function validatePropFilters(VObject\Component $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent->$filter['name']); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if ($filter['time-range']) { - foreach($parent->$filter['name'] as $subComponent) { - if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { - continue 2; - } - } - return false; - } - - if (!$filter['param-filters'] && !$filter['text-match']) { - continue; - } - - // If there are sub-filters, we need to find at least one property - // for which the subfilters hold true. - foreach($parent->$filter['name'] as $subComponent) { - - if( - $this->validateParamFilters($subComponent, $filter['param-filters']) && - (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match'])) - ) { - // We had a match, so this prop-filter succeeds - continue 2; - } - - } - - // If we got here it means there were sub-param-filters or - // text-match filters and there was no match. This means the - // filter needs to return false. - return false; - - } - - // If we got here it means we got through all prop-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of param-filters. - * - * A list of param-filters needs to be specified. Also the parent of the - * parameter we're checking should be specified, not the parameter to check - * itself. - * - * @param VObject\Property $parent - * @param array $filters - * @return bool - */ - protected function validateParamFilters(VObject\Property $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent[$filter['name']]); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if (!$filter['text-match']) { - continue; - } - - // If there are sub-filters, we need to find at least one parameter - // for which the subfilters hold true. - foreach($parent[$filter['name']] as $subParam) { - - if($this->validateTextMatch($subParam,$filter['text-match'])) { - // We had a match, so this param-filter succeeds - continue 2; - } - - } - - // If we got here it means there was a text-match filter and there - // were no matches. This means the filter needs to return false. - return false; - - } - - // If we got here it means we got through all param-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of a text-match. - * - * A single text-match should be specified as well as the specific property - * or parameter we need to validate. - * - * @param VObject\Node $parent - * @param array $textMatch - * @return bool - */ - protected function validateTextMatch(VObject\Node $parent, array $textMatch) { - - $value = (string)$parent; - - $isMatching = Sabre_DAV_StringUtil::textMatch($value, $textMatch['value'], $textMatch['collation']); - - return ($textMatch['negate-condition'] xor $isMatching); - - } - - /** - * Validates if a component matches the given time range. - * - * This is all based on the rules specified in rfc4791, which are quite - * complex. - * - * @param VObject\Node $component - * @param DateTime $start - * @param DateTime $end - * @return bool - */ - protected function validateTimeRange(VObject\Node $component, $start, $end) { - - if (is_null($start)) { - $start = new DateTime('1900-01-01'); - } - if (is_null($end)) { - $end = new DateTime('3000-01-01'); - } - - switch($component->name) { - - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - - return $component->isInTimeRange($start, $end); - - case 'VALARM' : - - // If the valarm is wrapped in a recurring event, we need to - // expand the recursions, and validate each. - // - // Our datamodel doesn't easily allow us to do this straight - // in the VALARM component code, so this is a hack, and an - // expensive one too. - if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) { - - // Fire up the iterator! - $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); - while($it->valid()) { - $expandedEvent = $it->getEventObject(); - - // We need to check from these expanded alarms, which - // one is the first to trigger. Based on this, we can - // determine if we can 'give up' expanding events. - $firstAlarm = null; - if ($expandedEvent->VALARM !== null) { - foreach($expandedEvent->VALARM as $expandedAlarm) { - - $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); - if ($expandedAlarm->isInTimeRange($start, $end)) { - return true; - } - - if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { - // This is an alarm with a non-relative trigger - // time, likely created by a buggy client. The - // implication is that every alarm in this - // recurring event trigger at the exact same - // time. It doesn't make sense to traverse - // further. - } else { - // We store the first alarm as a means to - // figure out when we can stop traversing. - if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { - $firstAlarm = $effectiveTrigger; - } - } - } - } - if (is_null($firstAlarm)) { - // No alarm was found. - // - // Or technically: No alarm that will change for - // every instance of the recurrence was found, - // which means we can assume there was no match. - return false; - } - if ($firstAlarm > $end) { - return false; - } - $it->next(); - } - return false; - } else { - return $component->isInTimeRange($start, $end); - } - - case 'VFREEBUSY' : - throw new Sabre_DAV_Exception_NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components'); - - case 'COMPLETED' : - case 'CREATED' : - case 'DTEND' : - case 'DTSTAMP' : - case 'DTSTART' : - case 'DUE' : - case 'LAST-MODIFIED' : - return ($start <= $component->getDateTime() && $end >= $component->getDateTime()); - - - - default : - throw new Sabre_DAV_Exception_BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component'); - - } - - } - -} diff --git a/3rdparty/Sabre/CalDAV/CalendarRootNode.php b/3rdparty/Sabre/CalDAV/CalendarRootNode.php deleted file mode 100644 index eb62eea75a..0000000000 --- a/3rdparty/Sabre/CalDAV/CalendarRootNode.php +++ /dev/null @@ -1,76 +0,0 @@ -caldavBackend = $caldavBackend; - - } - - /** - * Returns the nodename - * - * We're overriding this, because the default will be the 'principalPrefix', - * and we want it to be Sabre_CalDAV_Plugin::CALENDAR_ROOT - * - * @return string - */ - public function getName() { - - return Sabre_CalDAV_Plugin::CALENDAR_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new Sabre_CalDAV_UserCalendars($this->principalBackend, $this->caldavBackend, $principal['uri']); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php b/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php deleted file mode 100644 index 4ac617d22f..0000000000 --- a/3rdparty/Sabre/CalDAV/Exception/InvalidComponentType.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS(Sabre_CalDAV_Plugin::NS_CALDAV,'cal:supported-calendar-component'); - $errorNode->appendChild($np); - - } - -} \ No newline at end of file diff --git a/3rdparty/Sabre/CalDAV/ICSExportPlugin.php b/3rdparty/Sabre/CalDAV/ICSExportPlugin.php deleted file mode 100644 index d3e4e7b720..0000000000 --- a/3rdparty/Sabre/CalDAV/ICSExportPlugin.php +++ /dev/null @@ -1,141 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?',$uri,2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_CalDAV_Calendar)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type','text/calendar'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data', - ),1); - - $this->server->httpResponse->sendBody($this->generateICS($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all calendar objects, and builds one big ics export - * - * @param array $nodes - * @return string - */ - public function generateICS(array $nodes) { - - $calendar = new VObject\Component('vcalendar'); - $calendar->version = '2.0'; - if (Sabre_DAV_Server::$exposeVersion) { - $calendar->prodid = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; - } else { - $calendar->prodid = '-//SabreDAV//SabreDAV//EN'; - } - $calendar->calscale = 'GREGORIAN'; - - $collectedTimezones = array(); - - $timezones = array(); - $objects = array(); - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data'])) { - continue; - } - $nodeData = $node[200]['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data']; - - $nodeComp = VObject\Reader::read($nodeData); - - foreach($nodeComp->children() as $child) { - - switch($child->name) { - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - $objects[] = $child; - break; - - // VTIMEZONE is special, because we need to filter out the duplicates - case 'VTIMEZONE' : - // Naively just checking tzid. - if (in_array((string)$child->TZID, $collectedTimezones)) continue; - - $timezones[] = $child; - $collectedTimezones[] = $child->TZID; - break; - - } - - } - - } - - foreach($timezones as $tz) $calendar->add($tz); - foreach($objects as $obj) $calendar->add($obj); - - return $calendar->serialize(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/ICalendar.php b/3rdparty/Sabre/CalDAV/ICalendar.php deleted file mode 100644 index 40aa9f9579..0000000000 --- a/3rdparty/Sabre/CalDAV/ICalendar.php +++ /dev/null @@ -1,35 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalUri = $principalUri; - - } - - /** - * Returns all notifications for a principal - * - * @return array - */ - public function getChildren() { - - $children = array(); - $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri); - - foreach($notifications as $notification) { - - $children[] = new Sabre_CalDAV_Notifications_Node( - $this->caldavBackend, - $this->principalUri, - $notification - ); - } - - return $children; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - return 'notifications'; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}read', - 'protected' => true, - ), - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}write', - 'protected' => true, - ) - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's as an array argument. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_NotImplemented('Updating ACLs is not implemented here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Notifications/ICollection.php b/3rdparty/Sabre/CalDAV/Notifications/ICollection.php deleted file mode 100644 index eb873af3f9..0000000000 --- a/3rdparty/Sabre/CalDAV/Notifications/ICollection.php +++ /dev/null @@ -1,22 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalUri = $principalUri; - $this->notification = $notification; - - } - - /** - * Returns the path name for this notification - * - * @return id - */ - public function getName() { - - return $this->notification->getId() . '.xml'; - - } - - /** - * Returns the etag for the notification. - * - * The etag must be surrounded by litteral double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->notification->getETag(); - - } - - /** - * This method must return an xml element, using the - * Sabre_CalDAV_Notifications_INotificationType classes. - * - * @return Sabre_DAVNotification_INotificationType - */ - public function getNotificationType() { - - return $this->notification; - - } - - /** - * Deletes this notification - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}read', - 'protected' => true, - ), - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}write', - 'protected' => true, - ) - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's as an array argument. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_NotImplemented('Updating ACLs is not implemented here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php deleted file mode 100644 index a6b36203f3..0000000000 --- a/3rdparty/Sabre/CalDAV/Notifications/Notification/Invite.php +++ /dev/null @@ -1,276 +0,0 @@ -$value) { - if (!property_exists($this, $key)) { - throw new InvalidArgumentException('Unknown option: ' . $key); - } - $this->$key = $value; - } - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { - - $prop = $node->ownerDocument->createElement('cs:invite-notification'); - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { - - $doc = $node->ownerDocument; - - $dt = $doc->createElement('cs:dtstamp'); - $this->dtStamp->setTimezone(new \DateTimezone('GMT')); - $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); - $node->appendChild($dt); - - $prop = $doc->createElement('cs:invite-notification'); - $node->appendChild($prop); - - $uid = $doc->createElement('cs:uid'); - $uid->appendChild( $doc->createTextNode($this->id) ); - $prop->appendChild($uid); - - $href = $doc->createElement('d:href'); - $href->appendChild( $doc->createTextNode( $this->href ) ); - $prop->appendChild($href); - - $nodeName = null; - switch($this->type) { - - case SharingPlugin::STATUS_ACCEPTED : - $nodeName = 'cs:invite-accepted'; - break; - case SharingPlugin::STATUS_DECLINED : - $nodeName = 'cs:invite-declined'; - break; - case SharingPlugin::STATUS_DELETED : - $nodeName = 'cs:invite-deleted'; - break; - case SharingPlugin::STATUS_NORESPONSE : - $nodeName = 'cs:invite-noresponse'; - break; - - } - $prop->appendChild( - $doc->createElement($nodeName) - ); - $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); - $hostUrl = $doc->createElement('cs:hosturl'); - $hostUrl->appendChild($hostHref); - $prop->appendChild($hostUrl); - - $access = $doc->createElement('cs:access'); - if ($this->readOnly) { - $access->appendChild($doc->createElement('cs:read')); - } else { - $access->appendChild($doc->createElement('cs:read-write')); - } - $prop->appendChild($access); - - $organizerHref = $doc->createElement('d:href', $server->getBaseUri() . $this->organizer); - $organizerUrl = $doc->createElement('cs:organizer'); - if ($this->commonName) { - $commonName = $doc->createElement('cs:common-name'); - $commonName->appendChild($doc->createTextNode($this->commonName)); - $organizerUrl->appendChild($commonName); - } - $organizerUrl->appendChild($organizerHref); - $prop->appendChild($organizerUrl); - - if ($this->summary) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($this->summary)); - $prop->appendChild($summary); - } - if ($this->supportedComponents) { - - $xcomp = $doc->createElement('cal:supported-calendar-component-set'); - $this->supportedComponents->serialize($server, $xcomp); - $prop->appendChild($xcomp); - - } - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /** - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php deleted file mode 100644 index e935aa5aa1..0000000000 --- a/3rdparty/Sabre/CalDAV/Notifications/Notification/InviteReply.php +++ /dev/null @@ -1,216 +0,0 @@ -$value) { - if (!property_exists($this, $key)) { - throw new InvalidArgumentException('Unknown option: ' . $key); - } - $this->$key = $value; - } - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { - - $prop = $node->ownerDocument->createElement('cs:invite-reply'); - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { - - $doc = $node->ownerDocument; - - $dt = $doc->createElement('cs:dtstamp'); - $this->dtStamp->setTimezone(new \DateTimezone('GMT')); - $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); - $node->appendChild($dt); - - $prop = $doc->createElement('cs:invite-reply'); - $node->appendChild($prop); - - $uid = $doc->createElement('cs:uid'); - $uid->appendChild($doc->createTextNode($this->id)); - $prop->appendChild($uid); - - $inReplyTo = $doc->createElement('cs:in-reply-to'); - $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) ); - $prop->appendChild($inReplyTo); - - $href = $doc->createElement('d:href'); - $href->appendChild( $doc->createTextNode($this->href) ); - $prop->appendChild($href); - - $nodeName = null; - switch($this->type) { - - case SharingPlugin::STATUS_ACCEPTED : - $nodeName = 'cs:invite-accepted'; - break; - case SharingPlugin::STATUS_DECLINED : - $nodeName = 'cs:invite-declined'; - break; - - } - $prop->appendChild( - $doc->createElement($nodeName) - ); - $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); - $hostUrl = $doc->createElement('cs:hosturl'); - $hostUrl->appendChild($hostHref); - $prop->appendChild($hostUrl); - - if ($this->summary) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($this->summary)); - $prop->appendChild($summary); - } - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /** - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } -} diff --git a/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php b/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php deleted file mode 100644 index f09ed3525f..0000000000 --- a/3rdparty/Sabre/CalDAV/Notifications/Notification/SystemStatus.php +++ /dev/null @@ -1,179 +0,0 @@ -id = $id; - $this->type = $type; - $this->description = $description; - $this->href = $href; - $this->etag = $etag; - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server, \DOMElement $node) { - - switch($this->type) { - case self::TYPE_LOW : - $type = 'low'; - break; - case self::TYPE_MEDIUM : - $type = 'medium'; - break; - default : - case self::TYPE_HIGH : - $type = 'high'; - break; - } - - $prop = $node->ownerDocument->createElement('cs:systemstatus'); - $prop->setAttribute('type', $type); - - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serializeBody(Sabre_DAV_Server $server, \DOMElement $node) { - - switch($this->type) { - case self::TYPE_LOW : - $type = 'low'; - break; - case self::TYPE_MEDIUM : - $type = 'medium'; - break; - default : - case self::TYPE_HIGH : - $type = 'high'; - break; - } - - $prop = $node->ownerDocument->createElement('cs:systemstatus'); - $prop->setAttribute('type', $type); - - if ($this->description) { - $text = $node->ownerDocument->createTextNode($this->description); - $desc = $node->ownerDocument->createElement('cs:description'); - $desc->appendChild($text); - $prop->appendChild($desc); - } - if ($this->href) { - $text = $node->ownerDocument->createTextNode($this->href); - $href = $node->ownerDocument->createElement('d:href'); - $href->appendChild($text); - $prop->appendChild($href); - } - - $node->appendChild($prop); - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /* - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } -} diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php deleted file mode 100644 index f3d11969c8..0000000000 --- a/3rdparty/Sabre/CalDAV/Plugin.php +++ /dev/null @@ -1,1312 +0,0 @@ -imipHandler = $imipHandler; - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - // The MKCALENDAR is only available on unmapped uri's, whose - // parents extend IExtendedCollection - list($parent, $name) = Sabre_DAV_URLUtil::splitPath($uri); - - $node = $this->server->tree->getNodeForPath($parent); - - if ($node instanceof Sabre_DAV_IExtendedCollection) { - try { - $node->getChild($name); - } catch (Sabre_DAV_Exception_NotFound $e) { - return array('MKCALENDAR'); - } - } - return array(); - - } - - /** - * Returns a list of features for the DAV: HTTP header. - * - * @return array - */ - public function getFeatures() { - - return array('calendar-access', 'calendar-proxy'); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'caldav'; - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - - $reports = array(); - if ($node instanceof Sabre_CalDAV_ICalendar || $node instanceof Sabre_CalDAV_ICalendarObject) { - $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget'; - $reports[] = '{' . self::NS_CALDAV . '}calendar-query'; - } - if ($node instanceof Sabre_CalDAV_ICalendar) { - $reports[] = '{' . self::NS_CALDAV . '}free-busy-query'; - } - return $reports; - - } - - /** - * Initializes the plugin - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); - $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); - $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); - $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); - $server->subscribeEvent('beforeMethod', array($this,'beforeMethod')); - - $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; - $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; - - $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre_CalDAV_Property_SupportedCalendarComponentSet'; - $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre_CalDAV_Property_ScheduleCalendarTransp'; - - $server->resourceTypeMapping['Sabre_CalDAV_ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; - $server->resourceTypeMapping['Sabre_CalDAV_Schedule_IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; - $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; - $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; - $server->resourceTypeMapping['Sabre_CalDAV_Notifications_ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; - - array_push($server->protectedProperties, - - '{' . self::NS_CALDAV . '}supported-calendar-component-set', - '{' . self::NS_CALDAV . '}supported-calendar-data', - '{' . self::NS_CALDAV . '}max-resource-size', - '{' . self::NS_CALDAV . '}min-date-time', - '{' . self::NS_CALDAV . '}max-date-time', - '{' . self::NS_CALDAV . '}max-instances', - '{' . self::NS_CALDAV . '}max-attendees-per-instance', - '{' . self::NS_CALDAV . '}calendar-home-set', - '{' . self::NS_CALDAV . '}supported-collation-set', - '{' . self::NS_CALDAV . '}calendar-data', - - // scheduling extension - '{' . self::NS_CALDAV . '}schedule-inbox-URL', - '{' . self::NS_CALDAV . '}schedule-outbox-URL', - '{' . self::NS_CALDAV . '}calendar-user-address-set', - '{' . self::NS_CALDAV . '}calendar-user-type', - - // CalendarServer extensions - '{' . self::NS_CALENDARSERVER . '}getctag', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for', - '{' . self::NS_CALENDARSERVER . '}notification-URL', - '{' . self::NS_CALENDARSERVER . '}notificationtype' - - ); - } - - /** - * This function handles support for the MKCALENDAR method - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - switch ($method) { - case 'MKCALENDAR' : - $this->httpMkCalendar($uri); - // false is returned to stop the propagation of the - // unknownMethod event. - return false; - case 'POST' : - - // Checking if this is a text/calendar content type - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - if (strpos($contentType, 'text/calendar')!==0) { - return; - } - - // Checking if we're talking to an outbox - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - return; - } - if (!$node instanceof Sabre_CalDAV_Schedule_IOutbox) - return; - - $this->outboxRequest($node, $uri); - return false; - - } - - } - - /** - * This functions handles REPORT requests specific to CalDAV - * - * @param string $reportName - * @param DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CALDAV.'}calendar-multiget' : - $this->calendarMultiGetReport($dom); - return false; - case '{'.self::NS_CALDAV.'}calendar-query' : - $this->calendarQueryReport($dom); - return false; - case '{'.self::NS_CALDAV.'}free-busy-query' : - $this->freeBusyQueryReport($dom); - return false; - - } - - - } - - /** - * This function handles the MKCALENDAR HTTP method, which creates - * a new calendar. - * - * @param string $uri - * @return void - */ - public function httpMkCalendar($uri) { - - // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support - // for clients matching iCal in the user agent - //$ua = $this->server->httpRequest->getHeader('User-Agent'); - //if (strpos($ua,'iCal/')!==false) { - // throw new Sabre_DAV_Exception_Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); - //} - - $body = $this->server->httpRequest->getBody(true); - $properties = array(); - - if ($body) { - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - foreach($dom->firstChild->childNodes as $child) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue; - foreach(Sabre_DAV_XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) { - $properties[$k] = $prop; - } - - } - } - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); - - $this->server->createCollection($uri,$resourceType,$properties); - - $this->server->httpResponse->sendStatus(201); - $this->server->httpResponse->setHeader('Content-Length',0); - } - - /** - * beforeGetProperties - * - * This method handler is invoked before any after properties for a - * resource are fetched. This allows us to add in any CalDAV specific - * properties. - * - * @param string $path - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { - - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - // calendar-home-set property - $calHome = '{' . self::NS_CALDAV . '}calendar-home-set'; - if (in_array($calHome,$requestedProperties)) { - $principalId = $node->getName(); - $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/'; - unset($requestedProperties[$calHome]); - $returnedProperties[200][$calHome] = new Sabre_DAV_Property_Href($calendarHomePath); - } - - // schedule-outbox-URL property - $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL'; - if (in_array($scheduleProp,$requestedProperties)) { - $principalId = $node->getName(); - $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox'; - unset($requestedProperties[$scheduleProp]); - $returnedProperties[200][$scheduleProp] = new Sabre_DAV_Property_Href($outboxPath); - } - - // calendar-user-address-set property - $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set'; - if (in_array($calProp,$requestedProperties)) { - - $addresses = $node->getAlternateUriSet(); - $addresses[] = $this->server->getBaseUri() . $node->getPrincipalUrl() . '/'; - unset($requestedProperties[$calProp]); - $returnedProperties[200][$calProp] = new Sabre_DAV_Property_HrefList($addresses, false); - - } - - // These two properties are shortcuts for ical to easily find - // other principals this principal has access to. - $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for'; - $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for'; - if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) { - - $membership = $node->getGroupMembership(); - $readList = array(); - $writeList = array(); - - foreach($membership as $group) { - - $groupNode = $this->server->tree->getNodeForPath($group); - - // If the node is either ap proxy-read or proxy-write - // group, we grab the parent principal and add it to the - // list. - if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyRead) { - list($readList[]) = Sabre_DAV_URLUtil::splitPath($group); - } - if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyWrite) { - list($writeList[]) = Sabre_DAV_URLUtil::splitPath($group); - } - - } - if (in_array($propRead,$requestedProperties)) { - unset($requestedProperties[$propRead]); - $returnedProperties[200][$propRead] = new Sabre_DAV_Property_HrefList($readList); - } - if (in_array($propWrite,$requestedProperties)) { - unset($requestedProperties[$propWrite]); - $returnedProperties[200][$propWrite] = new Sabre_DAV_Property_HrefList($writeList); - } - - } - - // notification-URL property - $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL'; - if (($index = array_search($notificationUrl, $requestedProperties)) !== false) { - $principalId = $node->getName(); - $calendarHomePath = 'calendars/' . $principalId . '/notifications/'; - unset($requestedProperties[$index]); - $returnedProperties[200][$notificationUrl] = new Sabre_DAV_Property_Href($calendarHomePath); - } - - } // instanceof IPrincipal - - if ($node instanceof Sabre_CalDAV_Notifications_INode) { - - $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype'; - if (($index = array_search($propertyName, $requestedProperties)) !== false) { - - $returnedProperties[200][$propertyName] = - $node->getNotificationType(); - - unset($requestedProperties[$index]); - - } - - } // instanceof Notifications_INode - - - if ($node instanceof Sabre_CalDAV_ICalendarObject) { - // The calendar-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $calDataProp = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data'; - if (in_array($calDataProp, $requestedProperties)) { - unset($requestedProperties[$calDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - // Taking out \r to not screw up the xml output - $returnedProperties[200][$calDataProp] = str_replace("\r","", $val); - - } - } - - } - - /** - * This function handles the calendar-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param DOMNode $dom - * @return void - */ - public function calendarMultiGetReport($dom) { - - $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); - - $xpath = new DOMXPath($dom); - $xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $xpath->registerNameSpace('dav','DAV:'); - - $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); - if ($expand->length>0) { - $expandElem = $expand->item(0); - $start = $expandElem->getAttribute('start'); - $end = $expandElem->getAttribute('end'); - if(!$start || !$end) { - throw new Sabre_DAV_Exception_BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element'); - } - $start = VObject\DateTimeParser::parseDateTime($start); - $end = VObject\DateTimeParser::parseDateTime($end); - - if ($end <= $start) { - throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the expand element.'); - } - - $expand = true; - - } else { - - $expand = false; - - } - - foreach($hrefElems as $elem) { - $uri = $this->server->calculateUri($elem->nodeValue); - list($objProps) = $this->server->getPropertiesForPath($uri,$properties); - - if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) { - $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); - $vObject->expand($start, $end); - $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - - $propertyList[]=$objProps; - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); - - } - - /** - * This function handles the calendar-query REPORT - * - * This report is used by clients to request calendar objects based on - * complex conditions. - * - * @param DOMNode $dom - * @return void - */ - public function calendarQueryReport($dom) { - - $parser = new Sabre_CalDAV_CalendarQueryParser($dom); - $parser->parse(); - - $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); - $depth = $this->server->getHTTPDepth(0); - - // The default result is an empty array - $result = array(); - - // The calendarobject was requested directly. In this case we handle - // this locally. - if ($depth == 0 && $node instanceof Sabre_CalDAV_ICalendarObject) { - - $requestedCalendarData = true; - $requestedProperties = $parser->requestedProperties; - - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { - - // We always retrieve calendar-data, as we need it for filtering. - $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; - - // If calendar-data wasn't explicitly requested, we need to remove - // it after processing. - $requestedCalendarData = false; - } - - $properties = $this->server->getPropertiesForPath( - $this->server->getRequestUri(), - $requestedProperties, - 0 - ); - - // This array should have only 1 element, the first calendar - // object. - $properties = current($properties); - - // If there wasn't any calendar-data returned somehow, we ignore - // this. - if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) { - - $validator = new Sabre_CalDAV_CalendarQueryValidator(); - $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - if ($validator->validate($vObject,$parser->filters)) { - - // If the client didn't require the calendar-data property, - // we won't give it back. - if (!$requestedCalendarData) { - unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - } else { - if ($parser->expand) { - $vObject->expand($parser->expand['start'], $parser->expand['end']); - $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - } - - $result = array($properties); - - } - - } - - } - // If we're dealing with a calendar, the calendar itself is responsible - // for the calendar-query. - if ($node instanceof Sabre_CalDAV_ICalendar && $depth = 1) { - - $nodePaths = $node->calendarQuery($parser->filters); - - foreach($nodePaths as $path) { - - list($properties) = - $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties); - - if ($parser->expand) { - // We need to do some post-processing - $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - $vObject->expand($parser->expand['start'], $parser->expand['end']); - $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - - $result[] = $properties; - - } - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * This method is responsible for parsing the request and generating the - * response for the CALDAV:free-busy-query REPORT. - * - * @param DOMNode $dom - * @return void - */ - protected function freeBusyQueryReport(DOMNode $dom) { - - $start = null; - $end = null; - - foreach($dom->firstChild->childNodes as $childNode) { - - $clark = Sabre_DAV_XMLUtil::toClarkNotation($childNode); - if ($clark == '{' . self::NS_CALDAV . '}time-range') { - $start = $childNode->getAttribute('start'); - $end = $childNode->getAttribute('end'); - break; - } - - } - if ($start) { - $start = VObject\DateTimeParser::parseDateTime($start); - } - if ($end) { - $end = VObject\DateTimeParser::parseDateTime($end); - } - - if (!$start && !$end) { - throw new Sabre_DAV_Exception_BadRequest('The freebusy report must have a time-range filter'); - } - $acl = $this->server->getPlugin('acl'); - - if (!$acl) { - throw new Sabre_DAV_Exception('The ACL plugin must be loaded for free-busy queries to work'); - } - $uri = $this->server->getRequestUri(); - $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy'); - - $calendar = $this->server->tree->getNodeForPath($uri); - if (!$calendar instanceof Sabre_CalDAV_ICalendar) { - throw new Sabre_DAV_Exception_NotImplemented('The free-busy-query REPORT is only implemented on calendars'); - } - - // Doing a calendar-query first, to make sure we get the most - // performance. - $urls = $calendar->calendarQuery(array( - 'name' => 'VCALENDAR', - 'comp-filters' => array( - array( - 'name' => 'VEVENT', - 'comp-filters' => array(), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => array( - 'start' => $start, - 'end' => $end, - ), - ), - ), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => null, - )); - - $objects = array_map(function($url) use ($calendar) { - $obj = $calendar->getChild($url)->get(); - return $obj; - }, $urls); - - $generator = new VObject\FreeBusyGenerator(); - $generator->setObjects($objects); - $generator->setTimeRange($start, $end); - $result = $generator->getResult(); - $result = $result->serialize(); - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type', 'text/calendar'); - $this->server->httpResponse->setHeader('Content-Length', strlen($result)); - $this->server->httpResponse->sendBody($result); - - } - - /** - * This method is triggered before a file gets updated with new content. - * - * This plugin uses this method to ensure that CalDAV objects receive - * valid calendar data. - * - * @param string $path - * @param Sabre_DAV_IFile $node - * @param resource $data - * @return void - */ - public function beforeWriteContent($path, Sabre_DAV_IFile $node, &$data) { - - if (!$node instanceof Sabre_CalDAV_ICalendarObject) - return; - - $this->validateICalendar($data, $path); - - } - - /** - * This method is triggered before a new file is created. - * - * This plugin uses this method to ensure that newly created calendar - * objects contain valid calendar data. - * - * @param string $path - * @param resource $data - * @param Sabre_DAV_ICollection $parentNode - * @return void - */ - public function beforeCreateFile($path, &$data, Sabre_DAV_ICollection $parentNode) { - - if (!$parentNode instanceof Sabre_CalDAV_Calendar) - return; - - $this->validateICalendar($data, $path); - - } - - /** - * This event is triggered before any HTTP request is handled. - * - * We use this to intercept GET calls to notification nodes, and return the - * proper response. - * - * @param string $method - * @param string $path - * @return void - */ - public function beforeMethod($method, $path) { - - if ($method!=='GET') return; - - try { - $node = $this->server->tree->getNodeForPath($path); - } catch (Sabre_DAV_Exception_NotFound $e) { - return; - } - - if (!$node instanceof Sabre_CalDAV_Notifications_INode) - return; - - if (!$this->server->checkPreconditions(true)) return false; - - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - - $root = $dom->createElement('cs:notification'); - foreach($this->server->xmlNamespaces as $namespace => $prefix) { - $root->setAttribute('xmlns:' . $prefix, $namespace); - } - - $dom->appendChild($root); - $node->getNotificationType()->serializeBody($this->server, $root); - - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->setHeader('ETag',$node->getETag()); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($dom->saveXML()); - - return false; - - } - - /** - * Checks if the submitted iCalendar data is in fact, valid. - * - * An exception is thrown if it's not. - * - * @param resource|string $data - * @param string $path - * @return void - */ - protected function validateICalendar(&$data, $path) { - - // If it's a stream, we convert it to a string first. - if (is_resource($data)) { - $data = stream_get_contents($data); - } - - // Converting the data to unicode, if needed. - $data = Sabre_DAV_StringUtil::ensureUTF8($data); - - try { - - $vobj = VObject\Reader::read($data); - - } catch (VObject\ParseException $e) { - - throw new Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage()); - - } - - if ($vobj->name !== 'VCALENDAR') { - throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support iCalendar objects.'); - } - - // Get the Supported Components for the target calendar - list($parentPath,$object) = Sabre_Dav_URLUtil::splitPath($path); - $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set')); - $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue(); - - $foundType = null; - $foundUID = null; - foreach($vobj->getComponents() as $component) { - switch($component->name) { - case 'VTIMEZONE' : - continue 2; - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - if (is_null($foundType)) { - $foundType = $component->name; - if (!in_array($foundType, $supportedComponents)) { - throw new Sabre_CalDAV_Exception_InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType); - } - if (!isset($component->UID)) { - throw new Sabre_DAV_Exception_BadRequest('Every ' . $component->name . ' component must have an UID'); - } - $foundUID = (string)$component->UID; - } else { - if ($foundType !== $component->name) { - throw new Sabre_DAV_Exception_BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType); - } - if ($foundUID !== (string)$component->UID) { - throw new Sabre_DAV_Exception_BadRequest('Every ' . $component->name . ' in this object must have identical UIDs'); - } - } - break; - default : - throw new Sabre_DAV_Exception_BadRequest('You are not allowed to create components of type: ' . $component->name . ' here'); - - } - } - if (!$foundType) - throw new Sabre_DAV_Exception_BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL'); - - } - - /** - * This method handles POST requests to the schedule-outbox. - * - * Currently, two types of requests are support: - * * FREEBUSY requests from RFC 6638 - * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04 - * - * The latter is from an expired early draft of the CalDAV scheduling - * extensions, but iCal depends on a feature from that spec, so we - * implement it. - * - * @param Sabre_CalDAV_Schedule_IOutbox $outboxNode - * @param string $outboxUri - * @return void - */ - public function outboxRequest(Sabre_CalDAV_Schedule_IOutbox $outboxNode, $outboxUri) { - - // Parsing the request body - try { - $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true)); - } catch (VObject\ParseException $e) { - throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); - } - - // The incoming iCalendar object must have a METHOD property, and a - // component. The combination of both determines what type of request - // this is. - $componentType = null; - foreach($vObject->getComponents() as $component) { - if ($component->name !== 'VTIMEZONE') { - $componentType = $component->name; - break; - } - } - if (is_null($componentType)) { - throw new Sabre_DAV_Exception_BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); - } - - // Validating the METHOD - $method = strtoupper((string)$vObject->METHOD); - if (!$method) { - throw new Sabre_DAV_Exception_BadRequest('A METHOD property must be specified in iTIP messages'); - } - - // So we support two types of requests: - // - // REQUEST with a VFREEBUSY component - // REQUEST, REPLY, ADD, CANCEL on VEVENT components - - $acl = $this->server->getPlugin('acl'); - - if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') { - - $acl && $acl->checkPrivileges($outboxUri,'{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-query-freebusy'); - $this->handleFreeBusyRequest($outboxNode, $vObject); - - } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) { - - $acl && $acl->checkPrivileges($outboxUri,'{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent'); - $this->handleEventNotification($outboxNode, $vObject); - - } else { - - throw new Sabre_DAV_Exception_NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)'); - - } - - } - - /** - * This method handles the REQUEST, REPLY, ADD and CANCEL methods for - * VEVENT iTip messages. - * - * @return void - */ - protected function handleEventNotification(Sabre_CalDAV_Schedule_IOutbox $outboxNode, VObject\Component $vObject) { - - $originator = $this->server->httpRequest->getHeader('Originator'); - $recipients = $this->server->httpRequest->getHeader('Recipient'); - - if (!$originator) { - throw new Sabre_DAV_Exception_BadRequest('The Originator: header must be specified when making POST requests'); - } - if (!$recipients) { - throw new Sabre_DAV_Exception_BadRequest('The Recipient: header must be specified when making POST requests'); - } - - if (!preg_match('/^mailto:(.*)@(.*)$/i', $originator)) { - throw new Sabre_DAV_Exception_BadRequest('Originator must start with mailto: and must be valid email address'); - } - $originator = substr($originator,7); - - $recipients = explode(',',$recipients); - foreach($recipients as $k=>$recipient) { - - $recipient = trim($recipient); - if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { - throw new Sabre_DAV_Exception_BadRequest('Recipients must start with mailto: and must be valid email address'); - } - $recipient = substr($recipient, 7); - $recipients[$k] = $recipient; - } - - // We need to make sure that 'originator' matches one of the email - // addresses of the selected principal. - $principal = $outboxNode->getOwner(); - $props = $this->server->getProperties($principal,array( - '{' . self::NS_CALDAV . '}calendar-user-address-set', - )); - - $addresses = array(); - if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) { - $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs(); - } - - if (!in_array('mailto:' . $originator, $addresses)) { - throw new Sabre_DAV_Exception_Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); - } - - $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); - - } - - /** - * Sends an iMIP message by email. - * - * This method must return an array with status codes per recipient. - * This should look something like: - * - * array( - * 'user1@example.org' => '2.0;Success' - * ) - * - * Formatting for this status code can be found at: - * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 - * - * A list of valid status codes can be found at: - * https://tools.ietf.org/html/rfc5546#section-3.6 - * - * @param string $originator - * @param array $recipients - * @param Sabre\VObject\Component $vObject - * @return array - */ - protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) { - - if (!$this->imipHandler) { - $resultStatus = '5.2;This server does not support this operation'; - } else { - $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal); - $resultStatus = '2.0;Success'; - } - - $result = array(); - foreach($recipients as $recipient) { - $result[$recipient] = $resultStatus; - } - - return $result; - - } - - /** - * Generates a schedule-response XML body - * - * The recipients array is a key->value list, containing email addresses - * and iTip status codes. See the iMIPMessage method for a description of - * the value. - * - * @param array $recipients - * @return string - */ - public function generateScheduleResponse(array $recipients) { - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $xscheduleResponse = $dom->createElement('cal:schedule-response'); - $dom->appendChild($xscheduleResponse); - - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); - - } - - foreach($recipients as $recipient=>$status) { - $xresponse = $dom->createElement('cal:response'); - - $xrecipient = $dom->createElement('cal:recipient'); - $xrecipient->appendChild($dom->createTextNode($recipient)); - $xresponse->appendChild($xrecipient); - - $xrequestStatus = $dom->createElement('cal:request-status'); - $xrequestStatus->appendChild($dom->createTextNode($status)); - $xresponse->appendChild($xrequestStatus); - - $xscheduleResponse->appendChild($xresponse); - - } - - return $dom->saveXML(); - - } - - /** - * This method is responsible for parsing a free-busy query request and - * returning it's result. - * - * @param Sabre_CalDAV_Schedule_IOutbox $outbox - * @param string $request - * @return string - */ - protected function handleFreeBusyRequest(Sabre_CalDAV_Schedule_IOutbox $outbox, VObject\Component $vObject) { - - $vFreeBusy = $vObject->VFREEBUSY; - $organizer = $vFreeBusy->organizer; - - $organizer = (string)$organizer; - - // Validating if the organizer matches the owner of the inbox. - $owner = $outbox->getOwner(); - - $caldavNS = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}'; - - $uas = $caldavNS . 'calendar-user-address-set'; - $props = $this->server->getProperties($owner,array($uas)); - - if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) { - throw new Sabre_DAV_Exception_Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox'); - } - - if (!isset($vFreeBusy->ATTENDEE)) { - throw new Sabre_DAV_Exception_BadRequest('You must at least specify 1 attendee'); - } - - $attendees = array(); - foreach($vFreeBusy->ATTENDEE as $attendee) { - $attendees[]= (string)$attendee; - } - - - if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) { - throw new Sabre_DAV_Exception_BadRequest('DTSTART and DTEND must both be specified'); - } - - $startRange = $vFreeBusy->DTSTART->getDateTime(); - $endRange = $vFreeBusy->DTEND->getDateTime(); - - $results = array(); - foreach($attendees as $attendee) { - $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject); - } - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $scheduleResponse = $dom->createElement('cal:schedule-response'); - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace); - - } - $dom->appendChild($scheduleResponse); - - foreach($results as $result) { - $response = $dom->createElement('cal:response'); - - $recipient = $dom->createElement('cal:recipient'); - $recipientHref = $dom->createElement('d:href'); - - $recipientHref->appendChild($dom->createTextNode($result['href'])); - $recipient->appendChild($recipientHref); - $response->appendChild($recipient); - - $reqStatus = $dom->createElement('cal:request-status'); - $reqStatus->appendChild($dom->createTextNode($result['request-status'])); - $response->appendChild($reqStatus); - - if (isset($result['calendar-data'])) { - - $calendardata = $dom->createElement('cal:calendar-data'); - $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize()))); - $response->appendChild($calendardata); - - } - $scheduleResponse->appendChild($response); - } - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - /** - * Returns free-busy information for a specific address. The returned - * data is an array containing the following properties: - * - * calendar-data : A VFREEBUSY VObject - * request-status : an iTip status code. - * href: The principal's email address, as requested - * - * The following request status codes may be returned: - * * 2.0;description - * * 3.7;description - * - * @param string $email address - * @param DateTime $start - * @param DateTime $end - * @param Sabre_VObject_Component $request - * @return Sabre_VObject_Component - */ - protected function getFreeBusyForEmail($email, DateTime $start, DateTime $end, VObject\Component $request) { - - $caldavNS = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}'; - - $aclPlugin = $this->server->getPlugin('acl'); - if (substr($email,0,7)==='mailto:') $email = substr($email,7); - - $result = $aclPlugin->principalSearch( - array('{http://sabredav.org/ns}email-address' => $email), - array( - '{DAV:}principal-URL', $caldavNS . 'calendar-home-set', - '{http://sabredav.org/ns}email-address', - ) - ); - - if (!count($result)) { - return array( - 'request-status' => '3.7;Could not find principal', - 'href' => 'mailto:' . $email, - ); - } - - if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) { - return array( - 'request-status' => '3.7;No calendar-home-set property found', - 'href' => 'mailto:' . $email, - ); - } - $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref(); - - // Grabbing the calendar list - $objects = array(); - foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) { - if (!$node instanceof Sabre_CalDAV_ICalendar) { - continue; - } - $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy'); - - // Getting the list of object uris within the time-range - $urls = $node->calendarQuery(array( - 'name' => 'VCALENDAR', - 'comp-filters' => array( - array( - 'name' => 'VEVENT', - 'comp-filters' => array(), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => array( - 'start' => $start, - 'end' => $end, - ), - ), - ), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => null, - )); - - $calObjects = array_map(function($url) use ($node) { - $obj = $node->getChild($url)->get(); - return $obj; - }, $urls); - - $objects = array_merge($objects,$calObjects); - - } - - $vcalendar = VObject\Component::create('VCALENDAR'); - $vcalendar->VERSION = '2.0'; - $vcalendar->METHOD = 'REPLY'; - $vcalendar->CALSCALE = 'GREGORIAN'; - $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; - - $generator = new VObject\FreeBusyGenerator(); - $generator->setObjects($objects); - $generator->setTimeRange($start, $end); - $generator->setBaseObject($vcalendar); - - $result = $generator->getResult(); - - $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; - $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID; - $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER; - - return array( - 'calendar-data' => $result, - 'request-status' => '2.0;Success', - 'href' => 'mailto:' . $email, - ); - } - - /** - * This method is used to generate HTML output for the - * Sabre_DAV_Browser_Plugin. This allows us to generate an interface users - * can use to create new calendars. - * - * @param Sabre_DAV_INode $node - * @param string $output - * @return bool - */ - public function htmlActionsPanel(Sabre_DAV_INode $node, &$output) { - - if (!$node instanceof Sabre_CalDAV_UserCalendars) - return; - - $output.= '
    -

    Create new calendar

    - -
    -
    - -
    - '; - - return false; - - } - - /** - * This method allows us to intercept the 'mkcalendar' sabreAction. This - * action enables the user to create new calendars from the browser plugin. - * - * @param string $uri - * @param string $action - * @param array $postVars - * @return bool - */ - public function browserPostAction($uri, $action, array $postVars) { - - if ($action!=='mkcalendar') - return; - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); - $properties = array(); - if (isset($postVars['{DAV:}displayname'])) { - $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; - } - $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); - return false; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/Collection.php b/3rdparty/Sabre/CalDAV/Principal/Collection.php deleted file mode 100644 index abbefa5567..0000000000 --- a/3rdparty/Sabre/CalDAV/Principal/Collection.php +++ /dev/null @@ -1,31 +0,0 @@ -principalBackend, $principalInfo); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php b/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php deleted file mode 100644 index 4b3f035634..0000000000 --- a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php +++ /dev/null @@ -1,178 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-read'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws Sabre_DAV_Exception_Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php b/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php deleted file mode 100644 index dd0c2e86ed..0000000000 --- a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php +++ /dev/null @@ -1,178 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-write'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws Sabre_DAV_Exception_Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/User.php b/3rdparty/Sabre/CalDAV/Principal/User.php deleted file mode 100644 index 8453b877a7..0000000000 --- a/3rdparty/Sabre/CalDAV/Principal/User.php +++ /dev/null @@ -1,132 +0,0 @@ -principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name); - if (!$principal) { - throw new Sabre_DAV_Exception_NotFound('Node with name ' . $name . ' was not found'); - } - if ($name === 'calendar-proxy-read') - return new Sabre_CalDAV_Principal_ProxyRead($this->principalBackend, $this->principalProperties); - - if ($name === 'calendar-proxy-write') - return new Sabre_CalDAV_Principal_ProxyWrite($this->principalBackend, $this->principalProperties); - - throw new Sabre_DAV_Exception_NotFound('Node with name ' . $name . ' was not found'); - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - $r = array(); - if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) { - $r[] = new Sabre_CalDAV_Principal_ProxyRead($this->principalBackend, $this->principalProperties); - } - if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) { - $r[] = new Sabre_CalDAV_Principal_ProxyWrite($this->principalBackend, $this->principalProperties); - } - - return $r; - - } - - /** - * Returns whether or not the child node exists - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - try { - $this->getChild($name); - return true; - } catch (Sabre_DAV_Exception_NotFound $e) { - return false; - } - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $acl = parent::getACL(); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read', - 'protected' => true, - ); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write', - 'protected' => true, - ); - return $acl; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php b/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php deleted file mode 100644 index efe751732c..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/AllowedSharingModes.php +++ /dev/null @@ -1,72 +0,0 @@ -canBeShared = $canBeShared; - $this->canBePublished = $canBePublished; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - if ($this->canBeShared) { - $xcomp = $doc->createElement('cs:can-be-shared'); - $node->appendChild($xcomp); - } - if ($this->canBePublished) { - $xcomp = $doc->createElement('cs:can-be-published'); - $node->appendChild($xcomp); - } - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/Invite.php b/3rdparty/Sabre/CalDAV/Property/Invite.php deleted file mode 100644 index 4ed94877df..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/Invite.php +++ /dev/null @@ -1,173 +0,0 @@ -users = $users; - - } - - /** - * Returns the list of users, as it was passed to the constructor. - * - * @return array - */ - public function getValue() { - - return $this->users; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->users as $user) { - - $xuser = $doc->createElement('cs:user'); - - $href = $doc->createElement('d:href'); - $href->appendChild($doc->createTextNode($user['href'])); - $xuser->appendChild($href); - - if (isset($user['commonName']) && $user['commonName']) { - $commonName = $doc->createElement('cs:common-name'); - $commonName->appendChild($doc->createTextNode($user['commonName'])); - $xuser->appendChild($commonName); - } - - switch($user['status']) { - - case SharingPlugin::STATUS_ACCEPTED : - $status = $doc->createElement('cs:invite-accepted'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_DECLINED : - $status = $doc->createElement('cs:invite-declined'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_NORESPONSE : - $status = $doc->createElement('cs:invite-noresponse'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_INVALID : - $status = $doc->createElement('cs:invite-invalid'); - $xuser->appendChild($status); - break; - - } - - $xaccess = $doc->createElement('cs:access'); - - if ($user['readOnly']) { - $xaccess->appendChild( - $doc->createElement('cs:read') - ); - } else { - $xaccess->appendChild( - $doc->createElement('cs:read-write') - ); - } - $xuser->appendChild($xaccess); - - if (isset($user['summary']) && $user['summary']) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($user['summary'])); - $xuser->appendChild($summary); - } - - $node->appendChild($xuser); - - } - - } - - /** - * Unserializes the property. - * - * This static method should return a an instance of this object. - * - * @param DOMElement $prop - * @return Sabre_DAV_IProperty - */ - static function unserialize(DOMElement $prop) { - - $xpath = new \DOMXPath($prop->ownerDocument); - $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'DAV:'); - - $users = array(); - - foreach($xpath->query('cs:user', $prop) as $user) { - - $status = null; - if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { - $status = SharingPlugin::STATUS_ACCEPTED; - } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { - $status = SharingPlugin::STATUS_DECLINED; - } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { - $status = SharingPlugin::STATUS_NORESPONSE; - } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { - $status = SharingPlugin::STATUS_INVALID; - } else { - throw new Sabre_DAV_Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); - } - $users[] = array( - 'href' => $xpath->evaluate('string(d:href)', $user), - 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), - 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), - 'summary' => $xpath->evaluate('string(cs:summary)', $user), - 'status' => $status, - ); - - } - - return new self($users); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php b/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php deleted file mode 100644 index 76c1dbaec2..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/ScheduleCalendarTransp.php +++ /dev/null @@ -1,99 +0,0 @@ -value = $value; - - } - - /** - * Returns the current value - * - * @return string - */ - public function getValue() { - - return $this->value; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - switch($this->value) { - case self::TRANSPARENT : - $xval = $doc->createElement('cal:transparent'); - break; - case self::OPAQUE : - $xval = $doc->createElement('cal:opaque'); - break; - } - - $node->appendChild($xval); - - } - - /** - * Unserializes the DOMElement back into a Property class. - * - * @param DOMElement $node - * @return Sabre_CalDAV_Property_ScheduleCalendarTransp - */ - static function unserialize(DOMElement $node) { - - $value = null; - foreach($node->childNodes as $childNode) { - switch(Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { - case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}opaque' : - $value = self::OPAQUE; - break; - case '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}transparent' : - $value = self::TRANSPARENT; - break; - } - } - if (is_null($value)) - return null; - - return new self($value); - - } -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php deleted file mode 100644 index 2ea078d7da..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php +++ /dev/null @@ -1,85 +0,0 @@ -components = $components; - - } - - /** - * Returns the list of supported components - * - * @return array - */ - public function getValue() { - - return $this->components; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->components as $component) { - - $xcomp = $doc->createElement('cal:comp'); - $xcomp->setAttribute('name',$component); - $node->appendChild($xcomp); - - } - - } - - /** - * Unserializes the DOMElement back into a Property class. - * - * @param DOMElement $node - * @return Sabre_CalDAV_Property_SupportedCalendarComponentSet - */ - static function unserialize(DOMElement $node) { - - $components = array(); - foreach($node->childNodes as $childNode) { - if (Sabre_DAV_XMLUtil::toClarkNotation($childNode)==='{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}comp') { - $components[] = $childNode->getAttribute('name'); - } - } - return new self($components); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php deleted file mode 100644 index 1d848dd5cf..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php +++ /dev/null @@ -1,38 +0,0 @@ -ownerDocument; - - $prefix = isset($server->xmlNamespaces[Sabre_CalDAV_Plugin::NS_CALDAV])?$server->xmlNamespaces[Sabre_CalDAV_Plugin::NS_CALDAV]:'cal'; - - $caldata = $doc->createElement($prefix . ':calendar-data'); - $caldata->setAttribute('content-type','text/calendar'); - $caldata->setAttribute('version','2.0'); - - $node->appendChild($caldata); - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php deleted file mode 100644 index 24e84d4c17..0000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php +++ /dev/null @@ -1,44 +0,0 @@ -ownerDocument; - - $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); - if (!$prefix) $prefix = 'cal'; - - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;octet') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') - ); - - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Schedule/IMip.php b/3rdparty/Sabre/CalDAV/Schedule/IMip.php deleted file mode 100644 index 92c3c097c1..0000000000 --- a/3rdparty/Sabre/CalDAV/Schedule/IMip.php +++ /dev/null @@ -1,110 +0,0 @@ -senderEmail = $senderEmail; - - } - - /** - * Sends one or more iTip messages through email. - * - * @param string $originator Originator Email - * @param array $recipients Array of email addresses - * @param Sabre\VObject\Component $vObject - * @param string $principal Principal Url of the originator - * @return void - */ - public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) { - - foreach($recipients as $recipient) { - - $to = $recipient; - $replyTo = $originator; - $subject = 'SabreDAV iTIP message'; - - switch(strtoupper($vObject->METHOD)) { - case 'REPLY' : - $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY; - break; - case 'REQUEST' : - $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY; - break; - case 'CANCEL' : - $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY; - break; - } - - $headers = array(); - $headers[] = 'Reply-To: ' . $replyTo; - $headers[] = 'From: ' . $this->senderEmail; - $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8'; - if (Sabre_DAV_Server::$exposeVersion) { - $headers[] = 'X-Sabre-Version: ' . Sabre_DAV_Version::VERSION . '-' . Sabre_DAV_Version::STABILITY; - } - - $vcalBody = $vObject->serialize(); - - $this->mail($to, $subject, $vcalBody, $headers); - - } - - } - - // @codeCoverageIgnoreStart - // This is deemed untestable in a reasonable manner - - /** - * This function is reponsible for sending the actual email. - * - * @param string $to Recipient email address - * @param string $subject Subject of the email - * @param string $body iCalendar body - * @param array $headers List of headers - * @return void - */ - protected function mail($to, $subject, $body, array $headers) { - - - mail($to, $subject, $body, implode("\r\n", $headers)); - - } - - // @codeCoverageIgnoreEnd - -} diff --git a/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php b/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php deleted file mode 100644 index 46d77514bc..0000000000 --- a/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php +++ /dev/null @@ -1,16 +0,0 @@ -principalUri = $principalUri; - - } - - /** - * Returns the name of the node. - * - * This is used to generate the url. - * - * @return string - */ - public function getName() { - - return 'outbox'; - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - return array(); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-query-freebusy', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('You\'re not allowed to update the ACL'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - $default = Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet(); - $default['aggregates'][] = array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-query-freebusy', - ); - $default['aggregates'][] = array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}schedule-post-vevent', - ); - - return $default; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/ShareableCalendar.php b/3rdparty/Sabre/CalDAV/ShareableCalendar.php deleted file mode 100644 index 0e44885c62..0000000000 --- a/3rdparty/Sabre/CalDAV/ShareableCalendar.php +++ /dev/null @@ -1,72 +0,0 @@ -caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove); - - } - - /** - * Returns the list of people whom this calendar is shared with. - * - * Every element in this array should have the following properties: - * * href - Often a mailto: address - * * commonName - Optional, for example a first + last name - * * status - See the Sabre_CalDAV_SharingPlugin::STATUS_ constants. - * * readOnly - boolean - * * summary - Optional, a description for the share - * - * @return array - */ - public function getShares() { - - return $this->caldavBackend->getShares($this->calendarInfo['id']); - - } - - /** - * Marks this calendar as published. - * - * Publishing a calendar should automatically create a read-only, public, - * subscribable calendar. - * - * @param bool $value - * @return void - */ - public function setPublishStatus($value) { - - $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/SharedCalendar.php b/3rdparty/Sabre/CalDAV/SharedCalendar.php deleted file mode 100644 index 9000697d3e..0000000000 --- a/3rdparty/Sabre/CalDAV/SharedCalendar.php +++ /dev/null @@ -1,98 +0,0 @@ -calendarInfo['{http://calendarserver.org/ns/}shared-url']; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['{http://sabredav.org/ns}owner-principal']; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - // The top-level ACL only contains access information for the true - // owner of the calendar, so we need to add the information for the - // sharee. - $acl = parent::getACL(); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ); - if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) { - $acl[] = array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ); - } - return $acl; - - } - - -} diff --git a/3rdparty/Sabre/CalDAV/SharingPlugin.php b/3rdparty/Sabre/CalDAV/SharingPlugin.php deleted file mode 100644 index 31df8057b2..0000000000 --- a/3rdparty/Sabre/CalDAV/SharingPlugin.php +++ /dev/null @@ -1,475 +0,0 @@ -server = $server; - //$server->resourceTypeMapping['Sabre_CalDAV_IShareableCalendar'] = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner'; - $server->resourceTypeMapping['Sabre_CalDAV_ISharedCalendar'] = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared'; - - array_push( - $this->server->protectedProperties, - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite', - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url' - ); - - $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); - $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); - $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties')); - $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod')); - - } - - /** - * This event is triggered when properties are requested for a certain - * node. - * - * This allows us to inject any properties early. - * - * @param string $path - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { - - if ($node instanceof Sabre_CalDAV_IShareableCalendar) { - if (($index = array_search('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}invite'] = - new Sabre_CalDAV_Property_Invite( - $node->getShares() - ); - - } - - } - if ($node instanceof Sabre_CalDAV_ISharedCalendar) { - if (($index = array_search('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-url'] = - new Sabre_DAV_Property_Href( - $node->getSharedUrl() - ); - - } - - } - - } - - /** - * This method is triggered *after* all properties have been retrieved. - * This allows us to inject the correct resourcetype for calendars that - * have been shared. - * - * @param string $path - * @param array $properties - * @param Sabre_DAV_INode $node - * @return void - */ - public function afterGetProperties($path, &$properties, Sabre_DAV_INode $node) { - - if ($node instanceof Sabre_CalDAV_IShareableCalendar) { - if (isset($properties[200]['{DAV:}resourcetype'])) { - if (count($node->getShares())>0) { - $properties[200]['{DAV:}resourcetype']->add( - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner' - ); - } - } - $propName = '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes'; - if (array_key_exists($propName, $properties[404])) { - unset($properties[404][$propName]); - $properties[200][$propName] = new Sabre_CalDAV_Property_AllowedSharingModes(true,false); - } - - } - - } - - /** - * This method is trigged when a user attempts to update a node's - * properties. - * - * A previous draft of the sharing spec stated that it was possible to use - * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing - * the calendar. - * - * Even though this is no longer in the current spec, we keep this around - * because OS X 10.7 may still make use of this feature. - * - * @param array $mutations - * @param array $result - * @param Sabre_DAV_INode $node - * @return void - */ - public function updateProperties(array &$mutations, array &$result, Sabre_DAV_INode $node) { - - if (!$node instanceof Sabre_CalDAV_IShareableCalendar) - return; - - if (!isset($mutations['{DAV:}resourcetype'])) { - return; - } - - // Only doing something if shared-owner is indeed not in the list. - if($mutations['{DAV:}resourcetype']->is('{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}shared-owner')) return; - - $shares = $node->getShares(); - $remove = array(); - foreach($shares as $share) { - $remove[] = $share['href']; - } - $node->updateShares(array(), $remove); - - // We're marking this update as 200 OK - $result[200]['{DAV:}resourcetype'] = null; - - // Removing it from the mutations list - unset($mutations['{DAV:}resourcetype']); - - } - - /** - * This event is triggered when the server didn't know how to handle a - * certain request. - * - * We intercept this to handle POST requests on calendars. - * - * @param string $method - * @param string $uri - * @return null|bool - */ - public function unknownMethod($method, $uri) { - - if ($method!=='POST') { - return; - } - - // Only handling xml - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false) - return; - - // Making sure the node exists - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - return; - } - - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($this->server->httpRequest->getBody(true)); - - $documentType = Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild); - - switch($documentType) { - - // Dealing with the 'share' document, which modified invitees on a - // calendar. - case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}share' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $mutations = $this->parseShareRequest($dom); - - $node->updateShares($mutations[0], $mutations[1]); - - $this->server->httpResponse->sendStatus(200); - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - // The invite-reply document is sent when the user replies to an - // invitation of a calendar share. - case '{'. Sabre_CalDAV_Plugin::NS_CALENDARSERVER.'}invite-reply' : - - // This only works on the calendar-home-root node. - if (!$node instanceof Sabre_CalDAV_UserCalendars) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $message = $this->parseInviteReplyRequest($dom); - - $url = $node->shareReply( - $message['href'], - $message['status'], - $message['calendarUri'], - $message['inReplyTo'], - $message['summary'] - ); - - $this->server->httpResponse->sendStatus(200); - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - if ($url) { - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - - $root = $dom->createElement('cs:shared-as'); - foreach($this->server->xmlNamespaces as $namespace => $prefix) { - $root->setAttribute('xmlns:' . $prefix, $namespace); - } - - $dom->appendChild($root); - $href = new Sabre_DAV_Property_Href($url); - - $href->serialize($this->server, $root); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - // Breaking the event chain - return false; - - case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}publish-calendar' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $node->setPublishStatus(true); - - // iCloud sends back the 202, so we will too. - $this->server->httpResponse->sendStatus(202); - - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - case '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}unpublish-calendar' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof Sabre_CalDAV_IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $node->setPublishStatus(false); - - $this->server->httpResponse->sendStatus(200); - - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - } - - - } - - /** - * Parses the 'share' POST request. - * - * This method returns an array, containing two arrays. - * The first array is a list of new sharees. Every element is a struct - * containing a: - * * href element. (usually a mailto: address) - * * commonName element (often a first and lastname, but can also be - * false) - * * readOnly (true or false) - * * summary (A description of the share, can also be false) - * - * The second array is a list of sharees that are to be removed. This is - * just a simple array with 'hrefs'. - * - * @param DOMDocument $dom - * @return array - */ - protected function parseShareRequest(DOMDocument $dom) { - - $xpath = new \DOMXPath($dom); - $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'DAV:'); - - - $set = array(); - $elems = $xpath->query('cs:set'); - - for($i=0; $i < $elems->length; $i++) { - - $xset = $elems->item($i); - $set[] = array( - 'href' => $xpath->evaluate('string(d:href)', $xset), - 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), - 'summary' => $xpath->evaluate('string(cs:summary)', $xset), - 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false - ); - - } - - $remove = array(); - $elems = $xpath->query('cs:remove'); - - for($i=0; $i < $elems->length; $i++) { - - $xremove = $elems->item($i); - $remove[] = $xpath->evaluate('string(d:href)', $xremove); - - } - - return array($set, $remove); - - } - - /** - * Parses the 'invite-reply' POST request. - * - * This method returns an array, containing the following properties: - * * href - The sharee who is replying - * * status - One of the self::STATUS_* constants - * * calendarUri - The url of the shared calendar - * * inReplyTo - The unique id of the share invitation. - * * summary - Optional description of the reply. - * - * @param DOMDocument $dom - * @return array - */ - protected function parseInviteReplyRequest(DOMDocument $dom) { - - $xpath = new \DOMXPath($dom); - $xpath->registerNamespace('cs', Sabre_CalDAV_Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'DAV:'); - - $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)'); - if (!$hostHref) { - throw new Sabre_DAV_Exception_BadRequest('The {' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required'); - } - - return array( - 'href' => $xpath->evaluate('string(d:href)'), - 'calendarUri' => $this->server->calculateUri($hostHref), - 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'), - 'summary' => $xpath->evaluate('string(cs:summary)'), - 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED - ); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/UserCalendars.php b/3rdparty/Sabre/CalDAV/UserCalendars.php deleted file mode 100644 index 3194e6677a..0000000000 --- a/3rdparty/Sabre/CalDAV/UserCalendars.php +++ /dev/null @@ -1,348 +0,0 @@ -principalBackend = $principalBackend; - $this->caldavBackend = $caldavBackend; - $this->principalInfo = $principalBackend->getPrincipalByPath($userUri); - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalInfo['uri']); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return Sabre_CalDAV_Calendar - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new Sabre_DAV_Exception_NotFound('Calendar with name \'' . $name . '\' could not be found'); - - } - - /** - * Checks if a calendar exists. - * - * @param string $name - * @todo needs optimizing - * @return bool - */ - public function childExists($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return true; - - } - return false; - - } - - /** - * Returns a list of calendars - * - * @return array - */ - public function getChildren() { - - $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); - $objs = array(); - foreach($calendars as $calendar) { - if ($this->caldavBackend instanceof Sabre_CalDAV_Backend_SharingSupport) { - if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { - $objs[] = new Sabre_CalDAV_SharedCalendar($this->principalBackend, $this->caldavBackend, $calendar); - } else { - $objs[] = new Sabre_CalDAV_ShareableCalendar($this->principalBackend, $this->caldavBackend, $calendar); - } - } else { - $objs[] = new Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); - } - } - $objs[] = new Sabre_CalDAV_Schedule_Outbox($this->principalInfo['uri']); - - // We're adding a notifications node, if it's supported by the backend. - if ($this->caldavBackend instanceof Sabre_CalDAV_Backend_NotificationSupport) { - $objs[] = new Sabre_CalDAV_Notifications_Collection($this->caldavBackend, $this->principalInfo['uri']); - } - return $objs; - - } - - /** - * Creates a new calendar - * - * @param string $name - * @param array $resourceType - * @param array $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - $isCalendar = false; - foreach($resourceType as $rt) { - switch ($rt) { - case '{DAV:}collection' : - case '{http://calendarserver.org/ns/}shared-owner' : - // ignore - break; - case '{urn:ietf:params:xml:ns:caldav}calendar' : - $isCalendar = true; - break; - default : - throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType: ' . $rt); - } - } - if (!$isCalendar) { - throw new Sabre_DAV_Exception_InvalidResourceType('You can only create calendars in this collection'); - } - $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalInfo['uri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - - /** - * This method is called when a user replied to a request to share. - * - * This method should return the url of the newly created calendar if the - * share was accepted. - * - * @param string href The sharee who is replying (often a mailto: address) - * @param int status One of the SharingPlugin::STATUS_* constants - * @param string $calendarUri The url to the calendar thats being shared - * @param string $inReplyTo The unique id this message is a response to - * @param string $summary A description of the reply - * @return null|string - */ - public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { - - if (!$this->caldavBackend instanceof Sabre_CalDAV_Backend_SharingSupport) { - throw new Sabre_DAV_Exception_NotImplemented('Sharing support is not implemented by this backend.'); - } - - return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php deleted file mode 100644 index 0ad14fa086..0000000000 --- a/3rdparty/Sabre/CalDAV/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - - } - - /** - * Returns the name of the addressbook - * - * @return string - */ - public function getName() { - - return $this->addressBookInfo['uri']; - - } - - /** - * Returns a card - * - * @param string $name - * @return Sabre_CardDAV_ICard - */ - public function getChild($name) { - - $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_NotFound('Card not found'); - return new Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - - } - - /** - * Returns the full list of cards - * - * @return array - */ - public function getChildren() { - - $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - } - return $children; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in addressbooks. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating collections in addressbooks is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid VCARD. - * - * This method may return an ETag. - * - * @param string $name - * @param resource $vcardData - * @return string|null - */ - public function createFile($name,$vcardData = null) { - - if (is_resource($vcardData)) { - $vcardData = stream_get_contents($vcardData); - } - // Converting to UTF-8, if needed - $vcardData = Sabre_DAV_StringUtil::ensureUTF8($vcardData); - - return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData); - - } - - /** - * Deletes the entire addressbook. - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']); - - } - - /** - * Renames the addressbook - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Renaming addressbooks is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Updates properties on this node, - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existent property is always successful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - public function updateProperties($mutations) { - - return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations); - - } - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * @param array $properties - * @return array - */ - public function getProperties($properties) { - - $response = array(); - foreach($properties as $propertyName) { - - if (isset($this->addressBookInfo[$propertyName])) { - - $response[$propertyName] = $this->addressBookInfo[$propertyName]; - - } - - } - - return $response; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php deleted file mode 100644 index 46bb8ff18d..0000000000 --- a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php +++ /dev/null @@ -1,219 +0,0 @@ -dom = $dom; - - $this->xpath = new DOMXPath($dom); - $this->xpath->registerNameSpace('card',Sabre_CardDAV_Plugin::NS_CARDDAV); - - } - - /** - * Parses the request. - * - * @return void - */ - public function parse() { - - $filterNode = null; - - $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)'); - if (is_nan($limit)) $limit = null; - - $filter = $this->xpath->query('/card:addressbook-query/card:filter'); - - // According to the CardDAV spec there needs to be exactly 1 filter - // element. However, KDE 4.8.2 contains a bug that will encode 0 filter - // elements, so this is a workaround for that. - // - // See: https://bugs.kde.org/show_bug.cgi?id=300047 - if ($filter->length === 0) { - $test = null; - $filter = null; - } elseif ($filter->length === 1) { - $filter = $filter->item(0); - $test = $this->xpath->evaluate('string(@test)', $filter); - } else { - throw new Sabre_DAV_Exception_BadRequest('Only one filter element is allowed'); - } - - if (!$test) $test = self::TEST_ANYOF; - if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { - throw new Sabre_DAV_Exception_BadRequest('The test attribute must either hold "anyof" or "allof"'); - } - - $propFilters = array(); - - $propFilterNodes = $this->xpath->query('card:prop-filter', $filter); - for($ii=0; $ii < $propFilterNodes->length; $ii++) { - - $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii)); - - - } - - $this->filters = $propFilters; - $this->limit = $limit; - $this->requestedProperties = array_keys(Sabre_DAV_XMLUtil::parseProperties($this->dom->firstChild)); - $this->test = $test; - - } - - /** - * Parses the prop-filter xml element - * - * @param DOMElement $propFilterNode - * @return array - */ - protected function parsePropFilterNode(DOMElement $propFilterNode) { - - $propFilter = array(); - $propFilter['name'] = $propFilterNode->getAttribute('name'); - $propFilter['test'] = $propFilterNode->getAttribute('test'); - if (!$propFilter['test']) $propFilter['test'] = 'anyof'; - - $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0; - - $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode); - - $propFilter['param-filters'] = array(); - - - for($ii=0;$ii<$paramFilterNodes->length;$ii++) { - - $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii)); - - } - $propFilter['text-matches'] = array(); - $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode); - - for($ii=0;$ii<$textMatchNodes->length;$ii++) { - - $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii)); - - } - - return $propFilter; - - } - - /** - * Parses the param-filter element - * - * @param DOMElement $paramFilterNode - * @return array - */ - public function parseParamFilterNode(DOMElement $paramFilterNode) { - - $paramFilter = array(); - $paramFilter['name'] = $paramFilterNode->getAttribute('name'); - $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0; - $paramFilter['text-match'] = null; - - $textMatch = $this->xpath->query('card:text-match', $paramFilterNode); - if ($textMatch->length>0) { - $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0)); - } - - return $paramFilter; - - } - - /** - * Text match - * - * @param DOMElement $textMatchNode - * @return array - */ - public function parseTextMatchNode(DOMElement $textMatchNode) { - - $matchType = $textMatchNode->getAttribute('match-type'); - if (!$matchType) $matchType = 'contains'; - - if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) { - throw new Sabre_DAV_Exception_BadRequest('Unknown match-type: ' . $matchType); - } - - $negateCondition = $textMatchNode->getAttribute('negate-condition'); - $negateCondition = $negateCondition==='yes'; - $collation = $textMatchNode->getAttribute('collation'); - if (!$collation) $collation = 'i;unicode-casemap'; - - return array( - 'negate-condition' => $negateCondition, - 'collation' => $collation, - 'match-type' => $matchType, - 'value' => $textMatchNode->nodeValue - ); - - - } - -} diff --git a/3rdparty/Sabre/CardDAV/AddressBookRoot.php b/3rdparty/Sabre/CardDAV/AddressBookRoot.php deleted file mode 100644 index 9d37b15f08..0000000000 --- a/3rdparty/Sabre/CardDAV/AddressBookRoot.php +++ /dev/null @@ -1,78 +0,0 @@ -carddavBackend = $carddavBackend; - parent::__construct($principalBackend, $principalPrefix); - - } - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - return Sabre_CardDAV_Plugin::ADDRESSBOOK_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new Sabre_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); - - } - -} diff --git a/3rdparty/Sabre/CardDAV/Backend/Abstract.php b/3rdparty/Sabre/CardDAV/Backend/Abstract.php deleted file mode 100644 index e4806b7161..0000000000 --- a/3rdparty/Sabre/CardDAV/Backend/Abstract.php +++ /dev/null @@ -1,166 +0,0 @@ -pdo = $pdo; - $this->addressBooksTableName = $addressBooksTableName; - $this->cardsTableName = $cardsTableName; - - } - - /** - * Returns the list of addressbooks for a specific user. - * - * @param string $principalUri - * @return array - */ - public function getAddressBooksForUser($principalUri) { - - $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?'); - $stmt->execute(array($principalUri)); - - $addressBooks = array(); - - foreach($stmt->fetchAll() as $row) { - - $addressBooks[] = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{DAV:}displayname' => $row['displayname'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], - '{http://calendarserver.org/ns/}getctag' => $row['ctag'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}supported-address-data' => - new Sabre_CardDAV_Property_SupportedAddressData(), - ); - - } - - return $addressBooks; - - } - - - /** - * Updates an addressbook's properties - * - * See Sabre_DAV_IProperties for a description of the mutations array, as - * well as the return value. - * - * @param mixed $addressBookId - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateAddressBook($addressBookId, array $mutations) { - - $updates = array(); - - foreach($mutations as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $updates['displayname'] = $newValue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $updates['description'] = $newValue; - break; - default : - // If any unsupported values were being updated, we must - // let the entire request fail. - return false; - } - - } - - // No values are being updated? - if (!$updates) { - return false; - } - - $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 '; - foreach($updates as $key=>$value) { - $query.=', `' . $key . '` = :' . $key . ' '; - } - $query.=' WHERE id = :addressbookid'; - - $stmt = $this->pdo->prepare($query); - $updates['addressbookid'] = $addressBookId; - - $stmt->execute($updates); - - return true; - - } - - /** - * Creates a new address book - * - * @param string $principalUri - * @param string $url Just the 'basename' of the url. - * @param array $properties - * @return void - */ - public function createAddressBook($principalUri, $url, array $properties) { - - $values = array( - 'displayname' => null, - 'description' => null, - 'principaluri' => $principalUri, - 'uri' => $url, - ); - - foreach($properties as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $values['displayname'] = $newValue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $values['description'] = $newValue; - break; - default : - throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); - } - - } - - $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)'; - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - } - - /** - * Deletes an entire addressbook and all its contents - * - * @param int $addressBookId - * @return void - */ - public function deleteAddressBook($addressBookId) { - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); - $stmt->execute(array($addressBookId)); - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?'); - $stmt->execute(array($addressBookId)); - - } - - /** - * Returns all cards for a specific addressbook id. - * - * This method should return the following properties for each card: - * * carddata - raw vcard data - * * uri - Some unique url - * * lastmodified - A unix timestamp - * - * It's recommended to also return the following properties: - * * etag - A unique etag. This must change every time the card changes. - * * size - The size of the card in bytes. - * - * If these last two properties are provided, less time will be spent - * calculating them. If they are specified, you can also ommit carddata. - * This may speed up certain requests, especially with large cards. - * - * @param mixed $addressbookId - * @return array - */ - public function getCards($addressbookId) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); - $stmt->execute(array($addressbookId)); - - return $stmt->fetchAll(PDO::FETCH_ASSOC); - - - } - - /** - * Returns a specfic card. - * - * The same set of properties must be returned as with getCards. The only - * exception is that 'carddata' is absolutely required. - * - * @param mixed $addressBookId - * @param string $cardUri - * @return array - */ - public function getCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1'); - $stmt->execute(array($addressBookId, $cardUri)); - - $result = $stmt->fetchAll(PDO::FETCH_ASSOC); - - return (count($result)>0?$result[0]:false); - - } - - /** - * Creates a new card. - * - * The addressbook id will be passed as the first argument. This is the - * same id as it is returned from the getAddressbooksForUser method. - * - * The cardUri is a base uri, and doesn't include the full path. The - * cardData argument is the vcard body, and is passed as a string. - * - * It is possible to return an ETag from this method. This ETag is for the - * newly created resource, and must be enclosed with double quotes (that - * is, the string itself must contain the double quotes). - * - * You should only return the ETag if you store the carddata as-is. If a - * subsequent GET request on the same card does not have the same body, - * byte-by-byte and you did return an ETag here, clients tend to get - * confused. - * - * If you don't return an ETag, you can just return null. - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return string|null - */ - public function createCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)'); - - $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return '"' . md5($cardData) . '"'; - - } - - /** - * Updates a card. - * - * The addressbook id will be passed as the first argument. This is the - * same id as it is returned from the getAddressbooksForUser method. - * - * The cardUri is a base uri, and doesn't include the full path. The - * cardData argument is the vcard body, and is passed as a string. - * - * It is possible to return an ETag from this method. This ETag should - * match that of the updated resource, and must be enclosed with double - * quotes (that is: the string itself must contain the actual quotes). - * - * You should only return the ETag if you store the carddata as-is. If a - * subsequent GET request on the same card does not have the same body, - * byte-by-byte and you did return an ETag here, clients tend to get - * confused. - * - * If you don't return an ETag, you can just return null. - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return string|null - */ - public function updateCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?'); - $stmt->execute(array($cardData, time(), $cardUri, $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return '"' . md5($cardData) . '"'; - - } - - /** - * Deletes a card - * - * @param mixed $addressBookId - * @param string $cardUri - * @return bool - */ - public function deleteCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?'); - $stmt->execute(array($addressBookId, $cardUri)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return $stmt->rowCount()===1; - - } -} diff --git a/3rdparty/Sabre/CardDAV/Card.php b/3rdparty/Sabre/CardDAV/Card.php deleted file mode 100644 index 0e35d321eb..0000000000 --- a/3rdparty/Sabre/CardDAV/Card.php +++ /dev/null @@ -1,256 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - $this->cardData = $cardData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->cardData['uri']; - - } - - /** - * Returns the VCard-formatted object - * - * @return string - */ - public function get() { - - // Pre-populating 'carddata' is optional. If we don't yet have it - // already, we fetch it from the backend. - if (!isset($this->cardData['carddata'])) { - $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']); - } - return $this->cardData['carddata']; - - } - - /** - * Updates the VCard-formatted object - * - * @param string $cardData - * @return string|null - */ - public function put($cardData) { - - if (is_resource($cardData)) - $cardData = stream_get_contents($cardData); - - // Converting to UTF-8, if needed - $cardData = Sabre_DAV_StringUtil::ensureUTF8($cardData); - - $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData); - $this->cardData['carddata'] = $cardData; - $this->cardData['etag'] = $etag; - - return $etag; - - } - - /** - * Deletes the card - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/x-vcard; charset=utf-8'; - - } - - /** - * Returns an ETag for this object - * - * @return string - */ - public function getETag() { - - if (isset($this->cardData['etag'])) { - return $this->cardData['etag']; - } else { - $data = $this->get(); - if (is_string($data)) { - return '"' . md5($data) . '"'; - } else { - // We refuse to calculate the md5 if it's a stream. - return null; - } - } - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - if (array_key_exists('size', $this->cardData)) { - return $this->cardData['size']; - } else { - return strlen($this->get()); - } - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} - diff --git a/3rdparty/Sabre/CardDAV/IAddressBook.php b/3rdparty/Sabre/CardDAV/IAddressBook.php deleted file mode 100644 index 2bc275bcf7..0000000000 --- a/3rdparty/Sabre/CardDAV/IAddressBook.php +++ /dev/null @@ -1,18 +0,0 @@ -subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); - $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); - $server->subscribeEvent('updateProperties', array($this, 'updateProperties')); - $server->subscribeEvent('report', array($this,'report')); - $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); - $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); - $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); - $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); - - /* Namespaces */ - $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; - - /* Mapping Interfaces to {DAV:}resourcetype values */ - $server->resourceTypeMapping['Sabre_CardDAV_IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; - $server->resourceTypeMapping['Sabre_CardDAV_IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; - - /* Adding properties that may never be changed */ - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set'; - - $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'Sabre_DAV_Property_Href'; - - $this->server = $server; - - } - - /** - * Returns a list of supported features. - * - * This is used in the DAV: header in the OPTIONS and PROPFIND requests. - * - * @return array - */ - public function getFeatures() { - - return array('addressbook'); - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_CardDAV_IAddressBook || $node instanceof Sabre_CardDAV_ICard) { - return array( - '{' . self::NS_CARDDAV . '}addressbook-multiget', - '{' . self::NS_CARDDAV . '}addressbook-query', - ); - } - return array(); - - } - - - /** - * Adds all CardDAV-specific properties - * - * @param string $path - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, Sabre_DAV_INode $node, array &$requestedProperties, array &$returnedProperties) { - - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - // calendar-home-set property - $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set'; - if (in_array($addHome,$requestedProperties)) { - $principalId = $node->getName(); - $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/'; - unset($requestedProperties[array_search($addHome, $requestedProperties)]); - $returnedProperties[200][$addHome] = new Sabre_DAV_Property_Href($addressbookHomePath); - } - - $directories = '{' . self::NS_CARDDAV . '}directory-gateway'; - if ($this->directories && in_array($directories, $requestedProperties)) { - unset($requestedProperties[array_search($directories, $requestedProperties)]); - $returnedProperties[200][$directories] = new Sabre_DAV_Property_HrefList($this->directories); - } - - } - - if ($node instanceof Sabre_CardDAV_ICard) { - - // The address-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $addressDataProp = '{' . self::NS_CARDDAV . '}address-data'; - if (in_array($addressDataProp, $requestedProperties)) { - unset($requestedProperties[$addressDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - $returnedProperties[200][$addressDataProp] = $val; - - } - } - - if ($node instanceof Sabre_CardDAV_UserAddressBooks) { - - $meCardProp = '{http://calendarserver.org/ns/}me-card'; - if (in_array($meCardProp, $requestedProperties)) { - - $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url')); - if (isset($props['{http://sabredav.org/ns}vcard-url'])) { - - $returnedProperties[200][$meCardProp] = new Sabre_DAV_Property_Href( - $props['{http://sabredav.org/ns}vcard-url'] - ); - $pos = array_search($meCardProp, $requestedProperties); - unset($requestedProperties[$pos]); - - } - - } - - } - - } - - /** - * This event is triggered when a PROPPATCH method is executed - * - * @param array $mutations - * @param array $result - * @param Sabre_DAV_INode $node - * @return bool - */ - public function updateProperties(&$mutations, &$result, $node) { - - if (!$node instanceof Sabre_CardDAV_UserAddressBooks) { - return true; - } - - $meCard = '{http://calendarserver.org/ns/}me-card'; - - // The only property we care about - if (!isset($mutations[$meCard])) - return true; - - $value = $mutations[$meCard]; - unset($mutations[$meCard]); - - if ($value instanceof Sabre_DAV_Property_IHref) { - $value = $value->getHref(); - $value = $this->server->calculateUri($value); - } elseif (!is_null($value)) { - $result[400][$meCard] = null; - return false; - } - - $innerResult = $this->server->updateProperties( - $node->getOwner(), - array( - '{http://sabredav.org/ns}vcard-url' => $value, - ) - ); - - $closureResult = false; - foreach($innerResult as $status => $props) { - if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) { - $result[$status][$meCard] = null; - $closureResult = ($status>=200 && $status<300); - } - - } - - return $result; - - } - - /** - * This functions handles REPORT requests specific to CardDAV - * - * @param string $reportName - * @param DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CARDDAV.'}addressbook-multiget' : - $this->addressbookMultiGetReport($dom); - return false; - case '{'.self::NS_CARDDAV.'}addressbook-query' : - $this->addressBookQueryReport($dom); - return false; - default : - return; - - } - - - } - - /** - * This function handles the addressbook-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param DOMNode $dom - * @return void - */ - public function addressbookMultiGetReport($dom) { - - $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - - $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); - $propertyList = array(); - - foreach($hrefElems as $elem) { - - $uri = $this->server->calculateUri($elem->nodeValue); - list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties); - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); - - } - - /** - * This method is triggered before a file gets updated with new content. - * - * This plugin uses this method to ensure that Card nodes receive valid - * vcard data. - * - * @param string $path - * @param Sabre_DAV_IFile $node - * @param resource $data - * @return void - */ - public function beforeWriteContent($path, Sabre_DAV_IFile $node, &$data) { - - if (!$node instanceof Sabre_CardDAV_ICard) - return; - - $this->validateVCard($data); - - } - - /** - * This method is triggered before a new file is created. - * - * This plugin uses this method to ensure that Card nodes receive valid - * vcard data. - * - * @param string $path - * @param resource $data - * @param Sabre_DAV_ICollection $parentNode - * @return void - */ - public function beforeCreateFile($path, &$data, Sabre_DAV_ICollection $parentNode) { - - if (!$parentNode instanceof Sabre_CardDAV_IAddressBook) - return; - - $this->validateVCard($data); - - } - - /** - * Checks if the submitted iCalendar data is in fact, valid. - * - * An exception is thrown if it's not. - * - * @param resource|string $data - * @return void - */ - protected function validateVCard(&$data) { - - // If it's a stream, we convert it to a string first. - if (is_resource($data)) { - $data = stream_get_contents($data); - } - - // Converting the data to unicode, if needed. - $data = Sabre_DAV_StringUtil::ensureUTF8($data); - - try { - - $vobj = VObject\Reader::read($data); - - } catch (VObject\ParseException $e) { - - throw new Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); - - } - - if ($vobj->name !== 'VCARD') { - throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support vcard objects.'); - } - - if (!isset($vobj->UID)) { - throw new Sabre_DAV_Exception_BadRequest('Every vcard must have an UID.'); - } - - } - - - /** - * This function handles the addressbook-query REPORT - * - * This report is used by the client to filter an addressbook based on a - * complex query. - * - * @param DOMNode $dom - * @return void - */ - protected function addressbookQueryReport($dom) { - - $query = new Sabre_CardDAV_AddressBookQueryParser($dom); - $query->parse(); - - $depth = $this->server->getHTTPDepth(0); - - if ($depth==0) { - $candidateNodes = array( - $this->server->tree->getNodeForPath($this->server->getRequestUri()) - ); - } else { - $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); - } - - $validNodes = array(); - foreach($candidateNodes as $node) { - - if (!$node instanceof Sabre_CardDAV_ICard) - continue; - - $blob = $node->get(); - if (is_resource($blob)) { - $blob = stream_get_contents($blob); - } - - if (!$this->validateFilters($blob, $query->filters, $query->test)) { - continue; - } - - $validNodes[] = $node; - - if ($query->limit && $query->limit <= count($validNodes)) { - // We hit the maximum number of items, we can stop now. - break; - } - - } - - $result = array(); - foreach($validNodes as $validNode) { - - if ($depth==0) { - $href = $this->server->getRequestUri(); - } else { - $href = $this->server->getRequestUri() . '/' . $validNode->getName(); - } - - list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0); - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * Validates if a vcard makes it throught a list of filters. - * - * @param string $vcardData - * @param array $filters - * @param string $test anyof or allof (which means OR or AND) - * @return bool - */ - public function validateFilters($vcardData, array $filters, $test) { - - $vcard = VObject\Reader::read($vcardData); - - if (!$filters) return true; - - foreach($filters as $filter) { - - $isDefined = isset($vcard->{$filter['name']}); - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) { - - // We only need to check for existence - $success = $isDefined; - - } else { - - $vProperties = $vcard->select($filter['name']); - - $results = array(); - if ($filter['param-filters']) { - $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']); - } - if ($filter['text-matches']) { - $texts = array(); - foreach($vProperties as $vProperty) - $texts[] = $vProperty->value; - - $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']); - } - - if (count($results)===1) { - $success = $results[0]; - } else { - if ($filter['test'] === 'anyof') { - $success = $results[0] || $results[1]; - } else { - $success = $results[0] && $results[1]; - } - } - - } // else - - // There are two conditions where we can already determine whether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } // foreach - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a param-filter can be applied to a specific property. - * - * @todo currently we're only validating the first parameter of the passed - * property. Any subsequence parameters with the same name are - * ignored. - * @param array $vProperties - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateParamFilters(array $vProperties, array $filters, $test) { - - foreach($filters as $filter) { - - $isDefined = false; - foreach($vProperties as $vProperty) { - $isDefined = isset($vProperty[$filter['name']]); - if ($isDefined) break; - } - - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - - // If there's no text-match, we can just check for existence - } elseif (!$filter['text-match'] || !$isDefined) { - - $success = $isDefined; - - } else { - - $success = false; - foreach($vProperties as $vProperty) { - // If we got all the way here, we'll need to validate the - // text-match filter. - $success = Sabre_DAV_StringUtil::textMatch($vProperty[$filter['name']]->value, $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']); - if ($success) break; - } - if ($filter['text-match']['negate-condition']) { - $success = !$success; - } - - } // else - - // There are two conditions where we can already determine whether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a text-filter can be applied to a specific property. - * - * @param array $texts - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateTextMatches(array $texts, array $filters, $test) { - - foreach($filters as $filter) { - - $success = false; - foreach($texts as $haystack) { - $success = Sabre_DAV_StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']); - - // Breaking on the first match - if ($success) break; - } - if ($filter['negate-condition']) { - $success = !$success; - } - - if ($success && $test==='anyof') - return true; - - if (!$success && $test=='allof') - return false; - - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * This event is triggered after webdav-properties have been retrieved. - * - * @return bool - */ - public function afterGetProperties($uri, &$properties) { - - // If the request was made using the SOGO connector, we must rewrite - // the content-type property. By default SabreDAV will send back - // text/x-vcard; charset=utf-8, but for SOGO we must strip that last - // part. - if (!isset($properties[200]['{DAV:}getcontenttype'])) - return; - - if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) { - return; - } - - if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) { - $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard'; - } - - } - - /** - * This method is used to generate HTML output for the - * Sabre_DAV_Browser_Plugin. This allows us to generate an interface users - * can use to create new calendars. - * - * @param Sabre_DAV_INode $node - * @param string $output - * @return bool - */ - public function htmlActionsPanel(Sabre_DAV_INode $node, &$output) { - - if (!$node instanceof Sabre_CardDAV_UserAddressBooks) - return; - - $output.= '
    -

    Create new address book

    - -
    -
    - -
    - '; - - return false; - - } - - /** - * This method allows us to intercept the 'mkcalendar' sabreAction. This - * action enables the user to create new calendars from the browser plugin. - * - * @param string $uri - * @param string $action - * @param array $postVars - * @return bool - */ - public function browserPostAction($uri, $action, array $postVars) { - - if ($action!=='mkaddressbook') - return; - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook'); - $properties = array(); - if (isset($postVars['{DAV:}displayname'])) { - $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; - } - $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); - return false; - - } - -} diff --git a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php b/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php deleted file mode 100644 index 36d9306e7a..0000000000 --- a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php +++ /dev/null @@ -1,69 +0,0 @@ - 'text/vcard', 'version' => '3.0'), - array('contentType' => 'text/vcard', 'version' => '4.0'), - ); - } - - $this->supportedData = $supportedData; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - - $prefix = - isset($server->xmlNamespaces[Sabre_CardDAV_Plugin::NS_CARDDAV]) ? - $server->xmlNamespaces[Sabre_CardDAV_Plugin::NS_CARDDAV] : - 'card'; - - foreach($this->supportedData as $supported) { - - $caldata = $doc->createElementNS(Sabre_CardDAV_Plugin::NS_CARDDAV, $prefix . ':address-data-type'); - $caldata->setAttribute('content-type',$supported['contentType']); - $caldata->setAttribute('version',$supported['version']); - $node->appendChild($caldata); - - } - - } - -} diff --git a/3rdparty/Sabre/CardDAV/UserAddressBooks.php b/3rdparty/Sabre/CardDAV/UserAddressBooks.php deleted file mode 100644 index 3f11fb1123..0000000000 --- a/3rdparty/Sabre/CardDAV/UserAddressBooks.php +++ /dev/null @@ -1,257 +0,0 @@ -carddavBackend = $carddavBackend; - $this->principalUri = $principalUri; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalUri); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_MethodNotAllowed(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return Sabre_CardDAV_AddressBook - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new Sabre_DAV_Exception_NotFound('Addressbook with name \'' . $name . '\' could not be found'); - - } - - /** - * Returns a list of addressbooks - * - * @return array - */ - public function getChildren() { - - $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); - $objs = array(); - foreach($addressbooks as $addressbook) { - $objs[] = new Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); - } - return $objs; - - } - - /** - * Creates a new addressbook - * - * @param string $name - * @param array $resourceType - * @param array $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - if (!in_array('{'.Sabre_CardDAV_Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) { - throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType for this collection'); - } - $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalUri, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalUri, - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/3rdparty/Sabre/CardDAV/VCFExportPlugin.php b/3rdparty/Sabre/CardDAV/VCFExportPlugin.php deleted file mode 100644 index 8850fef8af..0000000000 --- a/3rdparty/Sabre/CardDAV/VCFExportPlugin.php +++ /dev/null @@ -1,107 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?',$uri,2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_CardDAV_IAddressBook)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type','text/directory'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data', - ),1); - - $this->server->httpResponse->sendBody($this->generateVCF($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all vcard objects, and builds one big vcf export - * - * @param array $nodes - * @return string - */ - public function generateVCF(array $nodes) { - - $output = ""; - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) { - continue; - } - $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data']; - - // Parsing this node so VObject can clean up the output. - $output .= - VObject\Reader::read($nodeData)->serialize(); - - } - - return $output; - - } - -} diff --git a/3rdparty/Sabre/CardDAV/Version.php b/3rdparty/Sabre/CardDAV/Version.php deleted file mode 100644 index 6b70a2df9b..0000000000 --- a/3rdparty/Sabre/CardDAV/Version.php +++ /dev/null @@ -1,26 +0,0 @@ -currentUser; - } - - - /** - * Authenticates the user based on the current request. - * - * If authentication is successful, true must be returned. - * If authentication fails, an exception must be thrown. - * - * @param Sabre_DAV_Server $server - * @param string $realm - * @throws Sabre_DAV_Exception_NotAuthenticated - * @return bool - */ - public function authenticate(Sabre_DAV_Server $server, $realm) { - - $auth = new Sabre_HTTP_BasicAuth(); - $auth->setHTTPRequest($server->httpRequest); - $auth->setHTTPResponse($server->httpResponse); - $auth->setRealm($realm); - $userpass = $auth->getUserPass(); - if (!$userpass) { - $auth->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('No basic authentication headers were found'); - } - - // Authenticates the user - if (!$this->validateUserPass($userpass[0],$userpass[1])) { - $auth->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('Username or password does not match'); - } - $this->currentUser = $userpass[0]; - return true; - } - - -} - diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php deleted file mode 100644 index 9833928b97..0000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php +++ /dev/null @@ -1,98 +0,0 @@ -setHTTPRequest($server->httpRequest); - $digest->setHTTPResponse($server->httpResponse); - - $digest->setRealm($realm); - $digest->init(); - - $username = $digest->getUsername(); - - // No username was given - if (!$username) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('No digest authentication headers were found'); - } - - $hash = $this->getDigestHash($realm, $username); - // If this was false, the user account didn't exist - if ($hash===false || is_null($hash)) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('The supplied username was not on file'); - } - if (!is_string($hash)) { - throw new Sabre_DAV_Exception('The returned value from getDigestHash must be a string or null'); - } - - // If this was false, the password or part of the hash was incorrect. - if (!$digest->validateA1($hash)) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('Incorrect username'); - } - - $this->currentUser = $username; - return true; - - } - - /** - * Returns the currently logged in username. - * - * @return string|null - */ - public function getCurrentUser() { - - return $this->currentUser; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php b/3rdparty/Sabre/DAV/Auth/Backend/Apache.php deleted file mode 100644 index d4294ea4d8..0000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php +++ /dev/null @@ -1,62 +0,0 @@ -httpRequest->getRawServerValue('REMOTE_USER'); - if (is_null($remoteUser)) { - throw new Sabre_DAV_Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured'); - } - - $this->remoteUser = $remoteUser; - return true; - - } - - /** - * Returns information about the currently logged in user. - * - * If nobody is currently logged in, this method should return null. - * - * @return array|null - */ - public function getCurrentUser() { - - return $this->remoteUser; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Auth/Backend/File.php b/3rdparty/Sabre/DAV/Auth/Backend/File.php deleted file mode 100644 index de308d64a6..0000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/File.php +++ /dev/null @@ -1,75 +0,0 @@ -loadFile($filename); - - } - - /** - * Loads an htdigest-formatted file. This method can be called multiple times if - * more than 1 file is used. - * - * @param string $filename - * @return void - */ - public function loadFile($filename) { - - foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) { - - if (substr_count($line, ":") !== 2) - throw new Sabre_DAV_Exception('Malformed htdigest file. Every line should contain 2 colons'); - - list($username,$realm,$A1) = explode(':',$line); - - if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) - throw new Sabre_DAV_Exception('Malformed htdigest file. Invalid md5 hash'); - - $this->users[$realm . ':' . $username] = $A1; - - } - - } - - /** - * Returns a users' information - * - * @param string $realm - * @param string $username - * @return string - */ - public function getDigestHash($realm, $username) { - - return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php b/3rdparty/Sabre/DAV/Auth/Backend/PDO.php deleted file mode 100644 index eac18a23fb..0000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php +++ /dev/null @@ -1,65 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns the digest hash for a user. - * - * @param string $realm - * @param string $username - * @return string|null - */ - public function getDigestHash($realm,$username) { - - $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?'); - $stmt->execute(array($username)); - $result = $stmt->fetchAll(); - - if (!count($result)) return; - - return $result[0]['digesta1']; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/IBackend.php b/3rdparty/Sabre/DAV/Auth/IBackend.php deleted file mode 100644 index 5be5d1bc93..0000000000 --- a/3rdparty/Sabre/DAV/Auth/IBackend.php +++ /dev/null @@ -1,36 +0,0 @@ -authBackend = $authBackend; - $this->realm = $realm; - - } - - /** - * Initializes the plugin. This function is automatically called by the server - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'auth'; - - } - - /** - * Returns the current users' principal uri. - * - * If nobody is logged in, this will return null. - * - * @return string|null - */ - public function getCurrentUser() { - - $userInfo = $this->authBackend->getCurrentUser(); - if (!$userInfo) return null; - - return $userInfo; - - } - - /** - * This method is called before any HTTP method and forces users to be authenticated - * - * @param string $method - * @param string $uri - * @throws Sabre_DAV_Exception_NotAuthenticated - * @return bool - */ - public function beforeMethod($method, $uri) { - - $this->authBackend->authenticate($this->server,$this->realm); - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/GuessContentType.php b/3rdparty/Sabre/DAV/Browser/GuessContentType.php deleted file mode 100644 index b6c00d461c..0000000000 --- a/3rdparty/Sabre/DAV/Browser/GuessContentType.php +++ /dev/null @@ -1,97 +0,0 @@ - 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - - // groupware - 'ics' => 'text/calendar', - 'vcf' => 'text/x-vcard', - - // text - 'txt' => 'text/plain', - - ); - - /** - * Initializes the plugin - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - // Using a relatively low priority (200) to allow other extensions - // to set the content-type first. - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200); - - } - - /** - * Handler for teh afterGetProperties event - * - * @param string $path - * @param array $properties - * @return void - */ - public function afterGetProperties($path, &$properties) { - - if (array_key_exists('{DAV:}getcontenttype', $properties[404])) { - - list(, $fileName) = Sabre_DAV_URLUtil::splitPath($path); - $contentType = $this->getContentType($fileName); - - if ($contentType) { - $properties[200]['{DAV:}getcontenttype'] = $contentType; - unset($properties[404]['{DAV:}getcontenttype']); - } - - } - - } - - /** - * Simple method to return the contenttype - * - * @param string $fileName - * @return string - */ - protected function getContentType($fileName) { - - // Just grabbing the extension - $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1)); - if (isset($this->extensionMap[$extension])) - return $this->extensionMap[$extension]; - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php b/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php deleted file mode 100644 index 1588488764..0000000000 --- a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php +++ /dev/null @@ -1,55 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - } - - /** - * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method!='GET') return true; - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_DAV_IFile) return; - - $this->server->invokeMethod('PROPFIND',$uri); - return false; - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/Plugin.php b/3rdparty/Sabre/DAV/Browser/Plugin.php deleted file mode 100644 index b6440ab634..0000000000 --- a/3rdparty/Sabre/DAV/Browser/Plugin.php +++ /dev/null @@ -1,489 +0,0 @@ - 'icons/file', - 'Sabre_DAV_ICollection' => 'icons/collection', - 'Sabre_DAVACL_IPrincipal' => 'icons/principal', - 'Sabre_CalDAV_ICalendar' => 'icons/calendar', - 'Sabre_CardDAV_IAddressBook' => 'icons/addressbook', - 'Sabre_CardDAV_ICard' => 'icons/card', - ); - - /** - * The file extension used for all icons - * - * @var string - */ - public $iconExtension = '.png'; - - /** - * reference to server class - * - * @var Sabre_DAV_Server - */ - protected $server; - - /** - * enablePost turns on the 'actions' panel, which allows people to create - * folders and upload files straight from a browser. - * - * @var bool - */ - protected $enablePost = true; - - /** - * By default the browser plugin will generate a favicon and other images. - * To turn this off, set this property to false. - * - * @var bool - */ - protected $enableAssets = true; - - /** - * Creates the object. - * - * By default it will allow file creation and uploads. - * Specify the first argument as false to disable this - * - * @param bool $enablePost - * @param bool $enableAssets - */ - public function __construct($enablePost=true, $enableAssets = true) { - - $this->enablePost = $enablePost; - $this->enableAssets = $enableAssets; - - } - - /** - * Initializes the plugin and subscribes to events - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200); - if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler')); - } - - /** - * This method intercepts GET requests to collections and returns the html - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method !== 'GET') return true; - - // We're not using straight-up $_GET, because we want everything to be - // unit testable. - $getVars = array(); - parse_str($this->server->httpRequest->getQueryString(), $getVars); - - if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) { - $this->serveAsset($getVars['assetName']); - return false; - } - - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - // We're simply stopping when the file isn't found to not interfere - // with other plugins. - return; - } - if ($node instanceof Sabre_DAV_IFile) - return; - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8'); - - $this->server->httpResponse->sendBody( - $this->generateDirectoryIndex($uri) - ); - - return false; - - } - - /** - * Handles POST requests for tree operations. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpPOSTHandler($method, $uri) { - - if ($method!='POST') return; - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - list($contentType) = explode(';', $contentType); - if ($contentType !== 'application/x-www-form-urlencoded' && - $contentType !== 'multipart/form-data') { - return; - } - $postVars = $this->server->httpRequest->getPostVars(); - - if (!isset($postVars['sabreAction'])) - return; - - if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) { - - switch($postVars['sabreAction']) { - - case 'mkcol' : - if (isset($postVars['name']) && trim($postVars['name'])) { - // Using basename() because we won't allow slashes - list(, $folderName) = Sabre_DAV_URLUtil::splitPath(trim($postVars['name'])); - $this->server->createDirectory($uri . '/' . $folderName); - } - break; - case 'put' : - if ($_FILES) $file = current($_FILES); - else break; - - list(, $newName) = Sabre_DAV_URLUtil::splitPath(trim($file['name'])); - if (isset($postVars['name']) && trim($postVars['name'])) - $newName = trim($postVars['name']); - - // Making sure we only have a 'basename' component - list(, $newName) = Sabre_DAV_URLUtil::splitPath($newName); - - if (is_uploaded_file($file['tmp_name'])) { - $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r')); - } - break; - - } - - } - $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri()); - $this->server->httpResponse->sendStatus(302); - return false; - - } - - /** - * Escapes a string for html. - * - * @param string $value - * @return string - */ - public function escapeHTML($value) { - - return htmlspecialchars($value,ENT_QUOTES,'UTF-8'); - - } - - /** - * Generates the html directory index for a given url - * - * @param string $path - * @return string - */ - public function generateDirectoryIndex($path) { - - $version = ''; - if (Sabre_DAV_Server::$exposeVersion) { - $version = Sabre_DAV_Version::VERSION ."-". Sabre_DAV_Version::STABILITY; - } - - $html = " - - Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . " - - "; - - if ($this->enableAssets) { - $html.=''; - } - - $html .= " - -

    Index for " . $this->escapeHTML($path) . "/

    - - - "; - - $files = $this->server->getPropertiesForPath($path,array( - '{DAV:}displayname', - '{DAV:}resourcetype', - '{DAV:}getcontenttype', - '{DAV:}getcontentlength', - '{DAV:}getlastmodified', - ),1); - - $parent = $this->server->tree->getNodeForPath($path); - - - if ($path) { - - list($parentUri) = Sabre_DAV_URLUtil::splitPath($path); - $fullPath = Sabre_DAV_URLUtil::encodePath($this->server->getBaseUri() . $parentUri); - - $icon = $this->enableAssets?'Parent':''; - $html.= " - - - - - - "; - - } - - foreach($files as $file) { - - // This is the current directory, we can skip it - if (rtrim($file['href'],'/')==$path) continue; - - list(, $name) = Sabre_DAV_URLUtil::splitPath($file['href']); - - $type = null; - - - if (isset($file[200]['{DAV:}resourcetype'])) { - $type = $file[200]['{DAV:}resourcetype']->getValue(); - - // resourcetype can have multiple values - if (!is_array($type)) $type = array($type); - - foreach($type as $k=>$v) { - - // Some name mapping is preferred - switch($v) { - case '{DAV:}collection' : - $type[$k] = 'Collection'; - break; - case '{DAV:}principal' : - $type[$k] = 'Principal'; - break; - case '{urn:ietf:params:xml:ns:carddav}addressbook' : - $type[$k] = 'Addressbook'; - break; - case '{urn:ietf:params:xml:ns:caldav}calendar' : - $type[$k] = 'Calendar'; - break; - case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' : - $type[$k] = 'Schedule Inbox'; - break; - case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' : - $type[$k] = 'Schedule Outbox'; - break; - case '{http://calendarserver.org/ns/}calendar-proxy-read' : - $type[$k] = 'Proxy-Read'; - break; - case '{http://calendarserver.org/ns/}calendar-proxy-write' : - $type[$k] = 'Proxy-Write'; - break; - } - - } - $type = implode(', ', $type); - } - - // If no resourcetype was found, we attempt to use - // the contenttype property - if (!$type && isset($file[200]['{DAV:}getcontenttype'])) { - $type = $file[200]['{DAV:}getcontenttype']; - } - if (!$type) $type = 'Unknown'; - - $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:''; - $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(DateTime::ATOM):''; - - $fullPath = Sabre_DAV_URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/')); - - $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name; - - $displayName = $this->escapeHTML($displayName); - $type = $this->escapeHTML($type); - - $icon = ''; - - if ($this->enableAssets) { - $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name); - foreach(array_reverse($this->iconMap) as $class=>$iconName) { - - if ($node instanceof $class) { - $icon = ''; - break; - } - - - } - - } - - $html.= " - - - - - - "; - - } - - $html.= ""; - - $output = ''; - - if ($this->enablePost) { - $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output)); - } - - $html.=$output; - - $html.= "
    NameTypeSizeLast modified

    $icon..[parent]
    $icon{$displayName}{$type}{$size}{$lastmodified}

    -
    Generated by SabreDAV " . $version . " (c)2007-2012 http://code.google.com/p/sabredav/
    - - "; - - return $html; - - } - - /** - * This method is used to generate the 'actions panel' output for - * collections. - * - * This specifically generates the interfaces for creating new files, and - * creating new directories. - * - * @param Sabre_DAV_INode $node - * @param mixed $output - * @return void - */ - public function htmlActionsPanel(Sabre_DAV_INode $node, &$output) { - - if (!$node instanceof Sabre_DAV_ICollection) - return; - - // We also know fairly certain that if an object is a non-extended - // SimpleCollection, we won't need to show the panel either. - if (get_class($node)==='Sabre_DAV_SimpleCollection') - return; - - $output.= '
    -

    Create new folder

    - - Name:
    - -
    -
    -

    Upload file

    - - Name (optional):
    - File:
    - -
    - '; - - } - - /** - * This method takes a path/name of an asset and turns it into url - * suiteable for http access. - * - * @param string $assetName - * @return string - */ - protected function getAssetUrl($assetName) { - - return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName); - - } - - /** - * This method returns a local pathname to an asset. - * - * @param string $assetName - * @return string - */ - protected function getLocalAssetPath($assetName) { - - // Making sure people aren't trying to escape from the base path. - $assetSplit = explode('/', $assetName); - if (in_array('..',$assetSplit)) { - throw new Sabre_DAV_Exception('Incorrect asset path'); - } - $path = __DIR__ . '/assets/' . $assetName; - return $path; - - } - - /** - * This method reads an asset from disk and generates a full http response. - * - * @param string $assetName - * @return void - */ - protected function serveAsset($assetName) { - - $assetPath = $this->getLocalAssetPath($assetName); - if (!file_exists($assetPath)) { - throw new Sabre_DAV_Exception_NotFound('Could not find an asset with this name'); - } - // Rudimentary mime type detection - switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) { - - case 'ico' : - $mime = 'image/vnd.microsoft.icon'; - break; - - case 'png' : - $mime = 'image/png'; - break; - - default: - $mime = 'application/octet-stream'; - break; - - } - - $this->server->httpResponse->setHeader('Content-Type', $mime); - $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath)); - $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody(fopen($assetPath,'r')); - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/assets/favicon.ico b/3rdparty/Sabre/DAV/Browser/assets/favicon.ico deleted file mode 100644 index 2b2c10a22cc7a57c4dc5d7156f184448f2bee92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc&&O-NKx6uz%14NNBzA}E}JHil3^6a|4&P_&6!RGSD}1rgCAC@`9dTC_@vqNoT8 z0%;dQR0K_{iUM;bf#3*%o1h^C2N7@IH_nmc?Va~t5U6~f`_BE&`Of`&_n~tUev3uN zziw!)bL*XR-2hy!51_yCgT8fb3s`VC=e=KcI5&)PGGQlpSAh?}1mK&Pg8c>z0Y`y$ zAT_6qJ%yV?|0!S$5WO@z3+`QD17OyXL4PyiM}RavtA7Tu7p)pn^p7Ks@m6m7)A}X$ z4Y+@;NrHYq_;V@RoZ|;69MPx!46Ftg*Tc~711C+J`JMuUfYwNBzXPB9sZm3WK9272 z&x|>@f_EO{b3cubqjOyc~J3I$d_lHIpN}q z!{kjX{c{12XF=~Z$w$kazXHB!b53>u!rx}_$e&dD`xNgv+MR&p2yN1xb0>&9t@28Z zV&5u#j_D=P9mI#){2s8@eGGj(?>gooo<%RT14>`VSZ&_l6GlGnan=^bemD56rRN{? zSAqZD$i;oS9SF6#f5I`#^C&hW@13s_lc3LUl(PWmHcop2{vr^kO`kP(*4!m=3Hn3e#Oc!a2;iDn+FbXzcOHEQ zbXZ)u93cj1WA=KS+M>jZ=oYyXq}1?ZdsjsX0A zkJXCvi~cfO@2ffd7r^;>=SsL-3U%l5HRoEZ#0r%`7%&% ziLTXJqU*JeXt3H5`AS#h(dpfl+`Ox|)*~QS%h&VO!d#)!>r3U5_YsDi2fY6Sd&vw% diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png b/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png deleted file mode 100644 index c9acc84172dad59708b6b298b310b8d29eeeb671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 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 VG`ly3;d~;1Y%Cr2-!R7}{u}gUbfEwM diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/card.png b/3rdparty/Sabre/DAV/Browser/assets/icons/card.png deleted file mode 100644 index 2ce954866d853edb737a7e281de221f7846846f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5695 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 BY2g3> diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png b/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png deleted file mode 100644 index 156fa64fd50f15d9e838326d42d68feba2c23c3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3474 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 cn$validSetting = $settings[$validSetting]; - } - } - - if (isset($settings['authType'])) { - $this->authType = $settings['authType']; - } else { - $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; - } - - $this->propertyMap['{DAV:}resourcetype'] = 'Sabre_DAV_Property_ResourceType'; - - } - - /** - * Add trusted root certificates to the webdav client. - * - * The parameter certificates should be a absulute path to a file - * which contains all trusted certificates - * - * @param string $certificates - */ - public function addTrustedCertificates($certificates) { - $this->trustedCertificates = $certificates; - } - - /** - * Does a PROPFIND request - * - * The list of requested properties must be specified as an array, in clark - * notation. - * - * The returned array will contain a list of filenames as keys, and - * properties as values. - * - * The properties array will contain the list of properties. Only properties - * that are actually returned from the server (without error) will be - * returned, anything else is discarded. - * - * Depth should be either 0 or 1. A depth of 1 will cause a request to be - * made to the server to also return all child resources. - * - * @param string $url - * @param array $properties - * @param int $depth - * @return array - */ - public function propFind($url, array $properties, $depth = 0) { - - $body = '' . "\n"; - $body.= '' . "\n"; - $body.= ' ' . "\n"; - - foreach($properties as $property) { - - list( - $namespace, - $elementName - ) = Sabre_DAV_XMLUtil::parseClarkNotation($property); - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - } - - $body.= ' ' . "\n"; - $body.= ''; - - $response = $this->request('PROPFIND', $url, $body, array( - 'Depth' => $depth, - 'Content-Type' => 'application/xml' - )); - - $result = $this->parseMultiStatus($response['body']); - - // If depth was 0, we only return the top item - if ($depth===0) { - reset($result); - $result = current($result); - return isset($result[200])?$result[200]:array(); - } - - $newResult = array(); - foreach($result as $href => $statusList) { - - $newResult[$href] = isset($statusList[200])?$statusList[200]:array(); - - } - - return $newResult; - - } - - /** - * Updates a list of properties on the server - * - * The list of properties must have clark-notation properties for the keys, - * and the actual (string) value for the value. If the value is null, an - * attempt is made to delete the property. - * - * @todo Must be building the request using the DOM, and does not yet - * support complex properties. - * @param string $url - * @param array $properties - * @return void - */ - public function propPatch($url, array $properties) { - - $body = '' . "\n"; - $body.= '' . "\n"; - - foreach($properties as $propName => $propValue) { - - list( - $namespace, - $elementName - ) = Sabre_DAV_XMLUtil::parseClarkNotation($propName); - - if ($propValue === null) { - - $body.="\n"; - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - $body.="\n"; - - } else { - - $body.="\n"; - if ($namespace === 'DAV:') { - $body.=' '; - } else { - $body.=" "; - } - // Shitty.. i know - $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8'); - if ($namespace === 'DAV:') { - $body.='' . "\n"; - } else { - $body.="\n"; - } - $body.="\n"; - - } - - } - - $body.= ''; - - $this->request('PROPPATCH', $url, $body, array( - 'Content-Type' => 'application/xml' - )); - - } - - /** - * Performs an HTTP options request - * - * This method returns all the features from the 'DAV:' header as an array. - * If there was no DAV header, or no contents this method will return an - * empty array. - * - * @return array - */ - public function options() { - - $result = $this->request('OPTIONS'); - if (!isset($result['headers']['dav'])) { - return array(); - } - - $features = explode(',', $result['headers']['dav']); - foreach($features as &$v) { - $v = trim($v); - } - return $features; - - } - - /** - * Performs an actual HTTP request, and returns the result. - * - * If the specified url is relative, it will be expanded based on the base - * url. - * - * The returned array contains 3 keys: - * * body - the response body - * * httpCode - a HTTP code (200, 404, etc) - * * headers - a list of response http headers. The header names have - * been lowercased. - * - * @param string $method - * @param string $url - * @param string $body - * @param array $headers - * @return array - */ - public function request($method, $url = '', $body = null, $headers = array()) { - - $url = $this->getAbsoluteUrl($url); - - $curlSettings = array( - CURLOPT_RETURNTRANSFER => true, - // Return headers as part of the response - CURLOPT_HEADER => true, - CURLOPT_POSTFIELDS => $body, - // Automatically follow redirects - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_MAXREDIRS => 5, - ); - - if($this->trustedCertificates) { - $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates; - } - - switch ($method) { - case 'HEAD' : - - // do not read body with HEAD requests (this is neccessary because cURL does not ignore the body with HEAD - // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP - // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with - // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the - // response body - $curlSettings[CURLOPT_NOBODY] = true; - $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD'; - break; - - default: - $curlSettings[CURLOPT_CUSTOMREQUEST] = $method; - break; - - } - - // Adding HTTP headers - $nHeaders = array(); - foreach($headers as $key=>$value) { - - $nHeaders[] = $key . ': ' . $value; - - } - $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders; - - if ($this->proxy) { - $curlSettings[CURLOPT_PROXY] = $this->proxy; - } - - if ($this->userName && $this->authType) { - $curlType = 0; - if ($this->authType & self::AUTH_BASIC) { - $curlType |= CURLAUTH_BASIC; - } - if ($this->authType & self::AUTH_DIGEST) { - $curlType |= CURLAUTH_DIGEST; - } - $curlSettings[CURLOPT_HTTPAUTH] = $curlType; - $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; - } - - list( - $response, - $curlInfo, - $curlErrNo, - $curlError - ) = $this->curlRequest($url, $curlSettings); - - $headerBlob = substr($response, 0, $curlInfo['header_size']); - $response = substr($response, $curlInfo['header_size']); - - // In the case of 100 Continue, or redirects we'll have multiple lists - // of headers for each separate HTTP response. We can easily split this - // because they are separated by \r\n\r\n - $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); - - // We only care about the last set of headers - $headerBlob = $headerBlob[count($headerBlob)-1]; - - // Splitting headers - $headerBlob = explode("\r\n", $headerBlob); - - $headers = array(); - foreach($headerBlob as $header) { - $parts = explode(':', $header, 2); - if (count($parts)==2) { - $headers[strtolower(trim($parts[0]))] = trim($parts[1]); - } - } - - $response = array( - 'body' => $response, - 'statusCode' => $curlInfo['http_code'], - 'headers' => $headers - ); - - if ($curlErrNo) { - throw new Sabre_DAV_Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')'); - } - - if ($response['statusCode']>=400) { - switch ($response['statusCode']) { - case 400 : - throw new Sabre_DAV_Exception_BadRequest('Bad request'); - case 401 : - throw new Sabre_DAV_Exception_NotAuthenticated('Not authenticated'); - case 402 : - throw new Sabre_DAV_Exception_PaymentRequired('Payment required'); - case 403 : - throw new Sabre_DAV_Exception_Forbidden('Forbidden'); - case 404: - throw new Sabre_DAV_Exception_NotFound('Resource not found.'); - case 405 : - throw new Sabre_DAV_Exception_MethodNotAllowed('Method not allowed'); - case 409 : - throw new Sabre_DAV_Exception_Conflict('Conflict'); - case 412 : - throw new Sabre_DAV_Exception_PreconditionFailed('Precondition failed'); - case 416 : - throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('Requested Range Not Satisfiable'); - case 500 : - throw new Sabre_DAV_Exception('Internal server error'); - case 501 : - throw new Sabre_DAV_Exception_NotImplemented('Not Implemented'); - case 507 : - throw new Sabre_DAV_Exception_InsufficientStorage('Insufficient storage'); - default: - throw new Sabre_DAV_Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); - } - } - - return $response; - - } - - /** - * Wrapper for all curl functions. - * - * The only reason this was split out in a separate method, is so it - * becomes easier to unittest. - * - * @param string $url - * @param array $settings - * @return array - */ - // @codeCoverageIgnoreStart - protected function curlRequest($url, $settings) { - - $curl = curl_init($url); - curl_setopt_array($curl, $settings); - - return array( - curl_exec($curl), - curl_getinfo($curl), - curl_errno($curl), - curl_error($curl) - ); - - } - // @codeCoverageIgnoreEnd - - /** - * Returns the full url based on the given url (which may be relative). All - * urls are expanded based on the base url as given by the server. - * - * @param string $url - * @return string - */ - protected function getAbsoluteUrl($url) { - - // If the url starts with http:// or https://, the url is already absolute. - if (preg_match('/^http(s?):\/\//', $url)) { - return $url; - } - - // If the url starts with a slash, we must calculate the url based off - // the root of the base url. - if (strpos($url,'/') === 0) { - $parts = parse_url($this->baseUri); - return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; - } - - // Otherwise... - return $this->baseUri . $url; - - } - - /** - * Parses a WebDAV multistatus response body - * - * This method returns an array with the following structure - * - * array( - * 'url/to/resource' => array( - * '200' => array( - * '{DAV:}property1' => 'value1', - * '{DAV:}property2' => 'value2', - * ), - * '404' => array( - * '{DAV:}property1' => null, - * '{DAV:}property2' => null, - * ), - * ) - * 'url/to/resource2' => array( - * .. etc .. - * ) - * ) - * - * - * @param string $body xml body - * @return array - */ - public function parseMultiStatus($body) { - - $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); - if ($responseXML===false) { - throw new InvalidArgumentException('The passed data is not valid XML'); - } - - $responseXML->registerXPathNamespace('d', 'DAV:'); - - $propResult = array(); - - foreach($responseXML->xpath('d:response') as $response) { - $response->registerXPathNamespace('d', 'DAV:'); - $href = $response->xpath('d:href'); - $href = (string)$href[0]; - - $properties = array(); - - foreach($response->xpath('d:propstat') as $propStat) { - - $propStat->registerXPathNamespace('d', 'DAV:'); - $status = $propStat->xpath('d:status'); - list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); - - $properties[$statusCode] = Sabre_DAV_XMLUtil::parseProperties(dom_import_simplexml($propStat), $this->propertyMap); - - } - - $propResult[$href] = $properties; - - } - - return $propResult; - - } - -} diff --git a/3rdparty/Sabre/DAV/Collection.php b/3rdparty/Sabre/DAV/Collection.php deleted file mode 100644 index c7648a8a52..0000000000 --- a/3rdparty/Sabre/DAV/Collection.php +++ /dev/null @@ -1,110 +0,0 @@ -getChildren() as $child) { - - if ($child->getName()==$name) return $child; - - } - throw new Sabre_DAV_Exception_NotFound('File not found: ' . $name); - - } - - /** - * Checks is a child-node exists. - * - * It is generally a good idea to try and override this. Usually it can be optimized. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - try { - - $this->getChild($name); - return true; - - } catch(Sabre_DAV_Exception_NotFound $e) { - - return false; - - } - - } - - /** - * Creates a new file in the directory - * - * Data will either be supplied as a stream resource, or in certain cases - * as a string. Keep in mind that you may have to support either. - * - * After succesful creation of the file, you may choose to return the ETag - * of the new file here. - * - * The returned ETag must be surrounded by double-quotes (The quotes should - * be part of the actual string). - * - * If you cannot accurately determine the ETag, you should not return it. - * If you don't store the file exactly as-is (you're transforming it - * somehow) you should also not return an ETag. - * - * This means that if a subsequent GET to this new file does not exactly - * return the same contents of what was submitted here, you are strongly - * recommended to omit the ETag. - * - * @param string $name Name of the file - * @param resource|string $data Initial payload - * @return null|string - */ - public function createFile($name, $data = null) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to create file (filename ' . $name . ')'); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to create directory'); - - } - - -} - diff --git a/3rdparty/Sabre/DAV/Exception.php b/3rdparty/Sabre/DAV/Exception.php deleted file mode 100644 index a2cd6cf582..0000000000 --- a/3rdparty/Sabre/DAV/Exception.php +++ /dev/null @@ -1,64 +0,0 @@ -lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock'); - $errorNode->appendChild($error); - if (!is_object($this->lock)) var_dump($this->lock); - $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/FileNotFound.php b/3rdparty/Sabre/DAV/Exception/FileNotFound.php deleted file mode 100644 index d76e400c93..0000000000 --- a/3rdparty/Sabre/DAV/Exception/FileNotFound.php +++ /dev/null @@ -1,19 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:valid-resourcetype'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php deleted file mode 100644 index 80ab7aff65..0000000000 --- a/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php +++ /dev/null @@ -1,39 +0,0 @@ -message = 'The locktoken supplied does not match any locks on this entity'; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/Locked.php b/3rdparty/Sabre/DAV/Exception/Locked.php deleted file mode 100644 index 976365ac1f..0000000000 --- a/3rdparty/Sabre/DAV/Exception/Locked.php +++ /dev/null @@ -1,67 +0,0 @@ -lock = $lock; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 423; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - if ($this->lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted'); - $errorNode->appendChild($error); - if (!is_object($this->lock)) var_dump($this->lock); - $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php b/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php deleted file mode 100644 index 3187575150..0000000000 --- a/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php +++ /dev/null @@ -1,45 +0,0 @@ -getAllowedMethods($server->getRequestUri()); - - return array( - 'Allow' => strtoupper(implode(', ',$methods)), - ); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php b/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php deleted file mode 100644 index 87ca624429..0000000000 --- a/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php +++ /dev/null @@ -1,28 +0,0 @@ -header = $header; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 412; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - if ($this->header) { - $prop = $errorNode->ownerDocument->createElement('s:header'); - $prop->nodeValue = $this->header; - $errorNode->appendChild($prop); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/ReportNotSupported.php b/3rdparty/Sabre/DAV/Exception/ReportNotSupported.php deleted file mode 100644 index a2906865f8..0000000000 --- a/3rdparty/Sabre/DAV/Exception/ReportNotSupported.php +++ /dev/null @@ -1,30 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:supported-report'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php deleted file mode 100644 index 29ee3654a7..0000000000 --- a/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php +++ /dev/null @@ -1,29 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * This method must throw Sabre_DAV_Exception_NotFound if the node does not - * exist. - * - * @param string $name - * @throws Sabre_DAV_Exception_NotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located'); - - if (is_dir($path)) { - - return new Sabre_DAV_FS_Directory($path); - - } else { - - return new Sabre_DAV_FS_File($path); - - } - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return void - */ - public function delete() { - - foreach($this->getChildren() as $child) $child->delete(); - rmdir($this->path); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FS/File.php b/3rdparty/Sabre/DAV/FS/File.php deleted file mode 100644 index 6a8039fe30..0000000000 --- a/3rdparty/Sabre/DAV/FS/File.php +++ /dev/null @@ -1,89 +0,0 @@ -path,$data); - - } - - /** - * Returns the data - * - * @return string - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return void - */ - public function delete() { - - unlink($this->path); - - } - - /** - * Returns the size of the node, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * - * @return mixed - */ - public function getETag() { - - return null; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * - * @return mixed - */ - public function getContentType() { - - return null; - - } - -} - diff --git a/3rdparty/Sabre/DAV/FS/Node.php b/3rdparty/Sabre/DAV/FS/Node.php deleted file mode 100644 index 1283e9d0fd..0000000000 --- a/3rdparty/Sabre/DAV/FS/Node.php +++ /dev/null @@ -1,80 +0,0 @@ -path = $path; - - } - - - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - list(, $name) = Sabre_DAV_URLUtil::splitPath($this->path); - return $name; - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path); - list(, $newName) = Sabre_DAV_URLUtil::splitPath($name); - - $newPath = $parentPath . '/' . $newName; - rename($this->path,$newPath); - - $this->path = $newPath; - - } - - - - /** - * Returns the last modification time, as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return filemtime($this->path); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/Directory.php b/3rdparty/Sabre/DAV/FSExt/Directory.php deleted file mode 100644 index 70dfdc2c3b..0000000000 --- a/3rdparty/Sabre/DAV/FSExt/Directory.php +++ /dev/null @@ -1,157 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - return '"' . md5_file($newPath) . '"'; - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - // We're not allowing dots - if ($name=='.' || $name=='..') throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * This method must throw Sabre_DAV_Exception_NotFound if the node does not - * exist. - * - * @param string $name - * @throws Sabre_DAV_Exception_NotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new Sabre_DAV_Exception_NotFound('File could not be located'); - if ($name=='.' || $name=='..') throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - - if (is_dir($path)) { - - return new Sabre_DAV_FSExt_Directory($path); - - } else { - - return new Sabre_DAV_FSExt_File($path); - - } - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - if ($name=='.' || $name=='..') - throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return bool - */ - public function delete() { - - // Deleting all children - foreach($this->getChildren() as $child) $child->delete(); - - // Removing resource info, if its still around - if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav'); - - // Removing the directory itself - rmdir($this->path); - - return parent::delete(); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/File.php b/3rdparty/Sabre/DAV/FSExt/File.php deleted file mode 100644 index 590fb808e6..0000000000 --- a/3rdparty/Sabre/DAV/FSExt/File.php +++ /dev/null @@ -1,117 +0,0 @@ -path,$data); - return '"' . md5_file($this->path) . '"'; - - } - - /** - * Updates the data at a given offset - * - * The data argument is a readable stream resource. - * The offset argument is a 0-based offset where the data should be - * written. - * - * param resource|string $data - * @return void - */ - public function putRange($data, $offset) { - - $f = fopen($this->path, 'c'); - fseek($f,$offset-1); - if (is_string($data)) { - fwrite($f, $data); - } else { - stream_copy_to_stream($data,$f); - } - fclose($f); - return '"' . md5_file($this->path) . '"'; - - } - - /** - * Returns the data - * - * @return resource - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return bool - */ - public function delete() { - - unlink($this->path); - return parent::delete(); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * - * @return string|null - */ - public function getETag() { - - return '"' . md5_file($this->path). '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * - * @return string|null - */ - public function getContentType() { - - return null; - - } - - /** - * Returns the size of the file, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/Node.php b/3rdparty/Sabre/DAV/FSExt/Node.php deleted file mode 100644 index 68ca06beb7..0000000000 --- a/3rdparty/Sabre/DAV/FSExt/Node.php +++ /dev/null @@ -1,212 +0,0 @@ -getResourceData(); - - foreach($properties as $propertyName=>$propertyValue) { - - // If it was null, we need to delete the property - if (is_null($propertyValue)) { - if (isset($resourceData['properties'][$propertyName])) { - unset($resourceData['properties'][$propertyName]); - } - } else { - $resourceData['properties'][$propertyName] = $propertyValue; - } - - } - - $this->putResourceData($resourceData); - return true; - } - - /** - * Returns a list of properties for this nodes.; - * - * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author - * If the array is empty, all properties should be returned - * - * @param array $properties - * @return array - */ - function getProperties($properties) { - - $resourceData = $this->getResourceData(); - - // if the array was empty, we need to return everything - if (!$properties) return $resourceData['properties']; - - $props = array(); - foreach($properties as $property) { - if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property]; - } - - return $props; - - } - - /** - * Returns the path to the resource file - * - * @return string - */ - protected function getResourceInfoPath() { - - list($parentDir) = Sabre_DAV_URLUtil::splitPath($this->path); - return $parentDir . '/.sabredav'; - - } - - /** - * Returns all the stored resource information - * - * @return array - */ - protected function getResourceData() { - - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return array('properties' => array()); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!isset($data[$this->getName()])) { - return array('properties' => array()); - } - - $data = $data[$this->getName()]; - if (!isset($data['properties'])) $data['properties'] = array(); - return $data; - - } - - /** - * Updates the resource information - * - * @param array $newData - * @return void - */ - protected function putResourceData(array $newData) { - - $path = $this->getResourceInfoPath(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - $data[$this->getName()] = $newData; - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($data)); - fclose($handle); - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path); - list(, $newName) = Sabre_DAV_URLUtil::splitPath($name); - $newPath = $parentPath . '/' . $newName; - - // We're deleting the existing resourcedata, and recreating it - // for the new path. - $resourceData = $this->getResourceData(); - $this->deleteResourceData(); - - rename($this->path,$newPath); - $this->path = $newPath; - $this->putResourceData($resourceData); - - - } - - /** - * @return bool - */ - public function deleteResourceData() { - - // When we're deleting this node, we also need to delete any resource information - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return true; - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (isset($data[$this->getName()])) unset($data[$this->getName()]); - ftruncate($handle,0); - rewind($handle); - fwrite($handle,serialize($data)); - fclose($handle); - - return true; - } - - public function delete() { - - return $this->deleteResourceData(); - - } - -} - diff --git a/3rdparty/Sabre/DAV/File.php b/3rdparty/Sabre/DAV/File.php deleted file mode 100644 index 3126bd8d36..0000000000 --- a/3rdparty/Sabre/DAV/File.php +++ /dev/null @@ -1,85 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - function updateProperties($mutations); - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * @param array $properties - * @return void - */ - function getProperties($properties); - -} - diff --git a/3rdparty/Sabre/DAV/IQuota.php b/3rdparty/Sabre/DAV/IQuota.php deleted file mode 100644 index 3fe4c4eced..0000000000 --- a/3rdparty/Sabre/DAV/IQuota.php +++ /dev/null @@ -1,27 +0,0 @@ -dataDir = $dataDir; - - } - - protected function getFileNameForUri($uri) { - - return $this->dataDir . '/sabredav_' . md5($uri) . '.locks'; - - } - - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $lockList = array(); - $currentPath = ''; - - foreach(explode('/',$uri) as $uriPart) { - - // weird algorithm that can probably be improved, but we're traversing the path top down - if ($currentPath) $currentPath.='/'; - $currentPath.=$uriPart; - - $uriLocks = $this->getData($currentPath); - - foreach($uriLocks as $uriLock) { - - // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0 - if($uri==$currentPath || $uriLock->depth!=0) { - $uriLock->uri = $currentPath; - $lockList[] = $uriLock; - } - - } - - } - - // Checking if we can remove any of these locks - foreach($lockList as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($lockList[$k]); - } - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - if ($lock->token == $lockInfo->token) unset($locks[$k]); - } - $locks[] = $lockInfo; - $this->putData($uri,$locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($uri,$locks); - return true; - - } - } - return false; - - } - - /** - * Returns the stored data for a uri - * - * @param string $uri - * @return array - */ - protected function getData($uri) { - - $path = $this->getFilenameForUri($uri); - if (!file_exists($path)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Updates the lock information - * - * @param string $uri - * @param array $newData - * @return void - */ - protected function putData($uri,array $newData) { - - $path = $this->getFileNameForUri($uri); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/Backend/File.php b/3rdparty/Sabre/DAV/Locks/Backend/File.php deleted file mode 100644 index c33f963514..0000000000 --- a/3rdparty/Sabre/DAV/Locks/Backend/File.php +++ /dev/null @@ -1,181 +0,0 @@ -locksFile = $locksFile; - - } - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $newLocks = array(); - - $locks = $this->getData(); - - foreach($locks as $lock) { - - if ($lock->uri === $uri || - //deep locks on parents - ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) || - - // locks on children - ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) { - - $newLocks[] = $lock; - - } - - } - - // Checking if we can remove any of these locks - foreach($newLocks as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]); - } - return $newLocks; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri, Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getData(); - - foreach($locks as $k=>$lock) { - if ( - ($lock->token == $lockInfo->token) || - (time() > $lock->timeout + $lock->created) - ) { - unset($locks[$k]); - } - } - $locks[] = $lockInfo; - $this->putData($locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri, Sabre_DAV_Locks_LockInfo $lockInfo) { - - $locks = $this->getData(); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($locks); - return true; - - } - } - return false; - - } - - /** - * Loads the lockdata from the filesystem. - * - * @return array - */ - protected function getData() { - - if (!file_exists($this->locksFile)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($this->locksFile,'r'); - flock($handle,LOCK_SH); - - // Reading data until the eof - $data = stream_get_contents($handle); - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Saves the lockdata - * - * @param array $newData - * @return void - */ - protected function putData(array $newData) { - - // opening up the file, and creating an exclusive lock - $handle = fopen($this->locksFile,'a+'); - flock($handle,LOCK_EX); - - // We can only truncate and rewind once the lock is acquired. - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php b/3rdparty/Sabre/DAV/Locks/Backend/PDO.php deleted file mode 100644 index acce80638e..0000000000 --- a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php +++ /dev/null @@ -1,165 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - // NOTE: the following 10 lines or so could be easily replaced by - // pure sql. MySQL's non-standard string concatenation prevents us - // from doing this though. - $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)'; - $params = array(time(),$uri); - - // We need to check locks for every part in the uri. - $uriParts = explode('/',$uri); - - // We already covered the last part of the uri - array_pop($uriParts); - - $currentPath=''; - - foreach($uriParts as $part) { - - if ($currentPath) $currentPath.='/'; - $currentPath.=$part; - - $query.=' OR (depth!=0 AND uri = ?)'; - $params[] = $currentPath; - - } - - if ($returnChildLocks) { - - $query.=' OR (uri LIKE ?)'; - $params[] = $uri . '/%'; - - } - $query.=')'; - - $stmt = $this->pdo->prepare($query); - $stmt->execute($params); - $result = $stmt->fetchAll(); - - $lockList = array(); - foreach($result as $row) { - - $lockInfo = new Sabre_DAV_Locks_LockInfo(); - $lockInfo->owner = $row['owner']; - $lockInfo->token = $row['token']; - $lockInfo->timeout = $row['timeout']; - $lockInfo->created = $row['created']; - $lockInfo->scope = $row['scope']; - $lockInfo->depth = $row['depth']; - $lockInfo->uri = $row['uri']; - $lockList[] = $lockInfo; - - } - - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 30*60; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getLocks($uri,false); - $exists = false; - foreach($locks as $lock) { - if ($lock->token == $lockInfo->token) $exists = true; - } - - if ($exists) { - $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } else { - $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } - - return true; - - } - - - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?'); - $stmt->execute(array($uri,$lockInfo->token)); - - return $stmt->rowCount()===1; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/LockInfo.php b/3rdparty/Sabre/DAV/Locks/LockInfo.php deleted file mode 100644 index 9df014a428..0000000000 --- a/3rdparty/Sabre/DAV/Locks/LockInfo.php +++ /dev/null @@ -1,81 +0,0 @@ -addPlugin($lockPlugin); - * - * @package Sabre - * @subpackage DAV - * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin { - - /** - * locksBackend - * - * @var Sabre_DAV_Locks_Backend_Abstract - */ - private $locksBackend; - - /** - * server - * - * @var Sabre_DAV_Server - */ - private $server; - - /** - * __construct - * - * @param Sabre_DAV_Locks_Backend_Abstract $locksBackend - */ - public function __construct(Sabre_DAV_Locks_Backend_Abstract $locksBackend = null) { - - $this->locksBackend = $locksBackend; - - } - - /** - * Initializes the plugin - * - * This method is automatically called by the Server class after addPlugin. - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50); - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties')); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'locks'; - - } - - /** - * This method is called by the Server if the user used an HTTP method - * the server didn't recognize. - * - * This plugin intercepts the LOCK and UNLOCK methods. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - switch($method) { - - case 'LOCK' : $this->httpLock($uri); return false; - case 'UNLOCK' : $this->httpUnlock($uri); return false; - - } - - } - - /** - * This method is called after most properties have been found - * it allows us to add in any Lock-related properties - * - * @param string $path - * @param array $newProperties - * @return bool - */ - public function afterGetProperties($path, &$newProperties) { - - foreach($newProperties[404] as $propName=>$discard) { - - switch($propName) { - - case '{DAV:}supportedlock' : - $val = false; - if ($this->locksBackend) $val = true; - $newProperties[200][$propName] = new Sabre_DAV_Property_SupportedLock($val); - unset($newProperties[404][$propName]); - break; - - case '{DAV:}lockdiscovery' : - $newProperties[200][$propName] = new Sabre_DAV_Property_LockDiscovery($this->getLocks($path)); - unset($newProperties[404][$propName]); - break; - - } - - - } - return true; - - } - - - /** - * This method is called before the logic for any HTTP method is - * handled. - * - * This plugin uses that feature to intercept access to locked resources. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - switch($method) { - - case 'DELETE' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'MKCOL' : - case 'PROPPATCH' : - case 'PUT' : - case 'PATCH' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'MOVE' : - $lastLock = null; - if (!$this->validateLock(array( - $uri, - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - ),$lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'COPY' : - $lastLock = null; - if (!$this->validateLock( - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - $lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - } - - return true; - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - if ($this->locksBackend) - return array('LOCK','UNLOCK'); - - return array(); - - } - - /** - * Returns a list of features for the HTTP OPTIONS Dav: header. - * - * In this case this is only the number 2. The 2 in the Dav: header - * indicates the server supports locks. - * - * @return array - */ - public function getFeatures() { - - return array(2); - - } - - /** - * Returns all lock information on a particular uri - * - * This function should return an array with Sabre_DAV_Locks_LockInfo objects. If there are no locks on a file, return an empty array. - * - * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree - * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object - * for any possible locks and return those as well. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks = false) { - - $lockList = array(); - - if ($this->locksBackend) - $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks)); - - return $lockList; - - } - - /** - * Locks an uri - * - * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock - * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type - * of lock (shared or exclusive) and the owner of the lock - * - * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock - * - * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3 - * - * @param string $uri - * @return void - */ - protected function httpLock($uri) { - - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) { - - // If the existing lock was an exclusive lock, we need to fail - if (!$lastLock || $lastLock->scope == Sabre_DAV_Locks_LockInfo::EXCLUSIVE) { - //var_dump($lastLock); - throw new Sabre_DAV_Exception_ConflictingLock($lastLock); - } - - } - - if ($body = $this->server->httpRequest->getBody(true)) { - // This is a new lock request - $lockInfo = $this->parseLockRequest($body); - $lockInfo->depth = $this->server->getHTTPDepth(); - $lockInfo->uri = $uri; - if($lastLock && $lockInfo->scope != Sabre_DAV_Locks_LockInfo::SHARED) throw new Sabre_DAV_Exception_ConflictingLock($lastLock); - - } elseif ($lastLock) { - - // This must have been a lock refresh - $lockInfo = $lastLock; - - // The resource could have been locked through another uri. - if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri; - - } else { - - // There was neither a lock refresh nor a new lock request - throw new Sabre_DAV_Exception_BadRequest('An xml body is required for lock requests'); - - } - - if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout; - - $newFile = false; - - // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first - try { - $this->server->tree->getNodeForPath($uri); - - // We need to call the beforeWriteContent event for RFC3744 - // Edit: looks like this is not used, and causing problems now. - // - // See Issue 222 - // $this->server->broadcastEvent('beforeWriteContent',array($uri)); - - } catch (Sabre_DAV_Exception_NotFound $e) { - - // It didn't, lets create it - $this->server->createFile($uri,fopen('php://memory','r')); - $newFile = true; - - } - - $this->lockNode($uri,$lockInfo); - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Lock-Token','token . '>'); - $this->server->httpResponse->sendStatus($newFile?201:200); - $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo)); - - } - - /** - * Unlocks a uri - * - * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header - * The server should return 204 (No content) on success - * - * @param string $uri - * @return void - */ - protected function httpUnlock($uri) { - - $lockToken = $this->server->httpRequest->getHeader('Lock-Token'); - - // If the locktoken header is not supplied, we need to throw a bad request exception - if (!$lockToken) throw new Sabre_DAV_Exception_BadRequest('No lock token was supplied'); - - $locks = $this->getLocks($uri); - - // Windows sometimes forgets to include < and > in the Lock-Token - // header - if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>'; - - foreach($locks as $lock) { - - if ('token . '>' == $lockToken) { - - $this->unlockNode($uri,$lock); - $this->server->httpResponse->setHeader('Content-Length','0'); - $this->server->httpResponse->sendStatus(204); - return; - - } - - } - - // If we got here, it means the locktoken was invalid - throw new Sabre_DAV_Exception_LockTokenMatchesRequestUri(); - - } - - /** - * Locks a uri - * - * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored - * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lockNode($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return; - - if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo); - throw new Sabre_DAV_Exception_MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.'); - - } - - /** - * Unlocks a uri - * - * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlockNode($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return; - if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo); - - } - - - /** - * Returns the contents of the HTTP Timeout header. - * - * The method formats the header into an integer. - * - * @return int - */ - public function getTimeoutHeader() { - - $header = $this->server->httpRequest->getHeader('Timeout'); - - if ($header) { - - if (stripos($header,'second-')===0) $header = (int)(substr($header,7)); - else if (strtolower($header)=='infinite') $header=Sabre_DAV_Locks_LockInfo::TIMEOUT_INFINITE; - else throw new Sabre_DAV_Exception_BadRequest('Invalid HTTP timeout header'); - - } else { - - $header = 0; - - } - - return $header; - - } - - /** - * Generates the response for successful LOCK requests - * - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return string - */ - protected function generateLockResponse(Sabre_DAV_Locks_LockInfo $lockInfo) { - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - - $prop = $dom->createElementNS('DAV:','d:prop'); - $dom->appendChild($prop); - - $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery'); - $prop->appendChild($lockDiscovery); - - $lockObj = new Sabre_DAV_Property_LockDiscovery(array($lockInfo),true); - $lockObj->serialize($this->server,$lockDiscovery); - - return $dom->saveXML(); - - } - - /** - * validateLock should be called when a write operation is about to happen - * It will check if the requested url is locked, and see if the correct lock tokens are passed - * - * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri - * @param mixed $lastLock This variable will be populated with the last checked lock object (Sabre_DAV_Locks_LockInfo) - * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees. - * @return bool - */ - protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) { - - if (is_null($urls)) { - $urls = array($this->server->getRequestUri()); - } elseif (is_string($urls)) { - $urls = array($urls); - } elseif (!is_array($urls)) { - throw new Sabre_DAV_Exception('The urls parameter should either be null, a string or an array'); - } - - $conditions = $this->getIfConditions(); - - // We're going to loop through the urls and make sure all lock conditions are satisfied - foreach($urls as $url) { - - $locks = $this->getLocks($url, $checkChildLocks); - - // If there were no conditions, but there were locks, we fail - if (!$conditions && $locks) { - reset($locks); - $lastLock = current($locks); - return false; - } - - // If there were no locks or conditions, we go to the next url - if (!$locks && !$conditions) continue; - - foreach($conditions as $condition) { - - if (!$condition['uri']) { - $conditionUri = $this->server->getRequestUri(); - } else { - $conditionUri = $this->server->calculateUri($condition['uri']); - } - - // If the condition has a url, and it isn't part of the affected url at all, check the next condition - if ($conditionUri && strpos($url,$conditionUri)!==0) continue; - - // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken - // At least 1 condition has to be satisfied - foreach($condition['tokens'] as $conditionToken) { - - $etagValid = true; - $lockValid = true; - - // key 2 can contain an etag - if ($conditionToken[2]) { - - $uri = $conditionUri?$conditionUri:$this->server->getRequestUri(); - $node = $this->server->tree->getNodeForPath($uri); - $etagValid = $node->getETag()==$conditionToken[2]; - - } - - // key 1 can contain a lock token - if ($conditionToken[1]) { - - $lockValid = false; - // Match all the locks - foreach($locks as $lockIndex=>$lock) { - - $lockToken = 'opaquelocktoken:' . $lock->token; - - // Checking NOT - if (!$conditionToken[0] && $lockToken != $conditionToken[1]) { - - // Condition valid, onto the next - $lockValid = true; - break; - } - if ($conditionToken[0] && $lockToken == $conditionToken[1]) { - - $lastLock = $lock; - // Condition valid and lock matched - unset($locks[$lockIndex]); - $lockValid = true; - break; - - } - - } - - } - - // If, after checking both etags and locks they are stil valid, - // we can continue with the next condition. - if ($etagValid && $lockValid) continue 2; - } - // No conditions matched, so we fail - throw new Sabre_DAV_Exception_PreconditionFailed('The tokens provided in the if header did not match','If'); - } - - // Conditions were met, we'll also need to check if all the locks are gone - if (count($locks)) { - - reset($locks); - - // There's still locks, we fail - $lastLock = current($locks); - return false; - - } - - - } - - // We got here, this means every condition was satisfied - return true; - - } - - /** - * This method is created to extract information from the WebDAV HTTP 'If:' header - * - * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information - * The function will return an array, containing structs with the following keys - * - * * uri - the uri the condition applies to. If this is returned as an - * empty string, this implies it's referring to the request url. - * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token) - * * etag - an etag, if supplied - * - * @return array - */ - public function getIfConditions() { - - $header = $this->server->httpRequest->getHeader('If'); - if (!$header) return array(); - - $matches = array(); - - $regex = '/(?:\<(?P.*?)\>\s)?\((?PNot\s)?(?:\<(?P[^\>]*)\>)?(?:\s?)(?:\[(?P[^\]]*)\])?\)/im'; - preg_match_all($regex,$header,$matches,PREG_SET_ORDER); - - $conditions = array(); - - foreach($matches as $match) { - - $condition = array( - 'uri' => $match['uri'], - 'tokens' => array( - array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'') - ), - ); - - if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array( - $match['not']?0:1, - $match['token'], - isset($match['etag'])?$match['etag']:'' - ); - else { - $conditions[] = $condition; - } - - } - - return $conditions; - - } - - /** - * Parses a webdav lock xml body, and returns a new Sabre_DAV_Locks_LockInfo object - * - * @param string $body - * @return Sabre_DAV_Locks_LockInfo - */ - protected function parseLockRequest($body) { - - $xml = simplexml_load_string($body,null,LIBXML_NOWARNING); - $xml->registerXPathNamespace('d','DAV:'); - $lockInfo = new Sabre_DAV_Locks_LockInfo(); - - $children = $xml->children("DAV:"); - $lockInfo->owner = (string)$children->owner; - - $lockInfo->token = Sabre_DAV_UUIDUtil::getUUID(); - $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0?Sabre_DAV_Locks_LockInfo::EXCLUSIVE:Sabre_DAV_Locks_LockInfo::SHARED; - - return $lockInfo; - - } - - -} diff --git a/3rdparty/Sabre/DAV/Mount/Plugin.php b/3rdparty/Sabre/DAV/Mount/Plugin.php deleted file mode 100644 index b37a90ae99..0000000000 --- a/3rdparty/Sabre/DAV/Mount/Plugin.php +++ /dev/null @@ -1,80 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?mount - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='mount') return; - - $currentUri = $this->server->httpRequest->getAbsoluteUri(); - - // Stripping off everything after the ? - list($currentUri) = explode('?',$currentUri); - - $this->davMount($currentUri); - - // Returning false to break the event chain - return false; - - } - - /** - * Generates the davmount response - * - * @param string $uri absolute uri - * @return void - */ - public function davMount($uri) { - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml'); - ob_start(); - echo '', "\n"; - echo "\n"; - echo " ", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "\n"; - echo ""; - $this->server->httpResponse->sendBody(ob_get_clean()); - - } - - -} diff --git a/3rdparty/Sabre/DAV/Node.php b/3rdparty/Sabre/DAV/Node.php deleted file mode 100644 index 3b95dfec2f..0000000000 --- a/3rdparty/Sabre/DAV/Node.php +++ /dev/null @@ -1,55 +0,0 @@ -rootNode = $rootNode; - - } - - /** - * Returns the INode object for the requested path - * - * @param string $path - * @return Sabre_DAV_INode - */ - public function getNodeForPath($path) { - - $path = trim($path,'/'); - if (isset($this->cache[$path])) return $this->cache[$path]; - - // Is it the root node? - if (!strlen($path)) { - return $this->rootNode; - } - - // Attempting to fetch its parent - list($parentName, $baseName) = Sabre_DAV_URLUtil::splitPath($path); - - // If there was no parent, we must simply ask it from the root node. - if ($parentName==="") { - $node = $this->rootNode->getChild($baseName); - } else { - // Otherwise, we recursively grab the parent and ask him/her. - $parent = $this->getNodeForPath($parentName); - - if (!($parent instanceof Sabre_DAV_ICollection)) - throw new Sabre_DAV_Exception_NotFound('Could not find node at path: ' . $path); - - $node = $parent->getChild($baseName); - - } - - $this->cache[$path] = $node; - return $node; - - } - - /** - * This function allows you to check if a node exists. - * - * @param string $path - * @return bool - */ - public function nodeExists($path) { - - try { - - // The root always exists - if ($path==='') return true; - - list($parent, $base) = Sabre_DAV_URLUtil::splitPath($path); - - $parentNode = $this->getNodeForPath($parent); - if (!$parentNode instanceof Sabre_DAV_ICollection) return false; - return $parentNode->childExists($base); - - } catch (Sabre_DAV_Exception_NotFound $e) { - - return false; - - } - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - $children = $node->getChildren(); - foreach($children as $child) { - - $this->cache[trim($path,'/') . '/' . $child->getName()] = $child; - - } - return $children; - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - // We don't care enough about sub-paths - // flushing the entire cache - $path = trim($path,'/'); - foreach($this->cache as $nodePath=>$node) { - if ($nodePath == $path || strpos($nodePath,$path.'/')===0) - unset($this->cache[$nodePath]); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/PartialUpdate/IFile.php b/3rdparty/Sabre/DAV/PartialUpdate/IFile.php deleted file mode 100644 index cf5ad55c6d..0000000000 --- a/3rdparty/Sabre/DAV/PartialUpdate/IFile.php +++ /dev/null @@ -1,38 +0,0 @@ -addPlugin($patchPlugin); - * - * @package Sabre - * @subpackage DAV - * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin { - - /** - * Reference to server - * - * @var Sabre_DAV_Server - */ - protected $server; - - /** - * Initializes the plugin - * - * This method is automatically called by the Server class after addPlugin. - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'partialupdate'; - - } - - /** - * This method is called by the Server if the user used an HTTP method - * the server didn't recognize. - * - * This plugin intercepts the PATCH methods. - * - * @param string $method - * @param string $uri - * @return bool|null - */ - public function unknownMethod($method, $uri) { - - switch($method) { - - case 'PATCH': - return $this->httpPatch($uri); - - } - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * We claim to support PATCH method (partial update) if and only if - * - the node exist - * - the node implements our partial update interface - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - $tree = $this->server->tree; - - if ($tree->nodeExists($uri) && - $tree->getNodeForPath($uri) instanceof Sabre_DAV_PartialUpdate_IFile) { - return array('PATCH'); - } - - return array(); - - } - - /** - * Returns a list of features for the HTTP OPTIONS Dav: header. - * - * @return array - */ - public function getFeatures() { - - return array('sabredav-partialupdate'); - - } - - /** - * Patch an uri - * - * The WebDAV patch request can be used to modify only a part of an - * existing resource. If the resource does not exist yet and the first - * offset is not 0, the request fails - * - * @param string $uri - * @return void - */ - protected function httpPatch($uri) { - - // Get the node. Will throw a 404 if not found - $node = $this->server->tree->getNodeForPath($uri); - if (!($node instanceof Sabre_DAV_PartialUpdate_IFile)) { - throw new Sabre_DAV_Exception_MethodNotAllowed('The target resource does not support the PATCH method.'); - } - - $range = $this->getHTTPUpdateRange(); - - if (!$range) { - throw new Sabre_DAV_Exception_BadRequest('No valid "X-Update-Range" found in the headers'); - } - - $contentType = strtolower( - $this->server->httpRequest->getHeader('Content-Type') - ); - - if ($contentType != 'application/x-sabredav-partialupdate') { - throw new Sabre_DAV_Exception_UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"'); - } - - $len = $this->server->httpRequest->getHeader('Content-Length'); - - // Load the begin and end data - $start = ($range[0])?$range[0]:0; - $end = ($range[1])?$range[1]:$len-1; - - // Check consistency - if($end < $start) - throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); - if($end - $start + 1 != $len) - throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets'); - - // Checking If-None-Match and related headers. - if (!$this->server->checkPreconditions()) return; - - if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null))) - return; - - $body = $this->server->httpRequest->getBody(); - $etag = $node->putRange($body, $start-1); - - $this->server->broadcastEvent('afterWriteContent',array($uri, $node)); - - $this->server->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->server->httpResponse->setHeader('ETag',$etag); - $this->server->httpResponse->sendStatus(204); - - return false; - - } - - /** - * Returns the HTTP custom range update header - * - * This method returns null if there is no well-formed HTTP range request - * header or array($start, $end). - * - * The first number is the offset of the first byte in the range. - * The second number is the offset of the last byte in the range. - * - * If the second offset is null, it should be treated as the offset of the last byte of the entity - * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity - * - * @return array|null - */ - public function getHTTPUpdateRange() { - - $range = $this->server->httpRequest->getHeader('X-Update-Range'); - if (is_null($range)) return null; - - // Matching "Range: bytes=1234-5678: both numbers are optional - - if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; - - if ($matches[1]==='' && $matches[2]==='') return null; - - return array( - $matches[1]!==''?$matches[1]:null, - $matches[2]!==''?$matches[2]:null, - ); - - } -} diff --git a/3rdparty/Sabre/DAV/Property.php b/3rdparty/Sabre/DAV/Property.php deleted file mode 100644 index 6487bf44bc..0000000000 --- a/3rdparty/Sabre/DAV/Property.php +++ /dev/null @@ -1,31 +0,0 @@ -time = $time; - } elseif (is_int($time) || ctype_digit($time)) { - $this->time = new DateTime('@' . $time); - } else { - $this->time = new DateTime($time); - } - - // Setting timezone to UTC - $this->time->setTimezone(new DateTimeZone('UTC')); - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $prop) { - - $doc = $prop->ownerDocument; - $prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/'); - $prop->setAttribute('b:dt','dateTime.rfc1123'); - $prop->nodeValue = Sabre_HTTP_Util::toHTTPDate($this->time); - - } - - /** - * getTime - * - * @return DateTime - */ - public function getTime() { - - return $this->time; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/Href.php b/3rdparty/Sabre/DAV/Property/Href.php deleted file mode 100644 index cd1d867f71..0000000000 --- a/3rdparty/Sabre/DAV/Property/Href.php +++ /dev/null @@ -1,91 +0,0 @@ -href = $href; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uri - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - $elem->nodeValue = ($this->autoPrefix?$server->getBaseUri():'') . $this->href; - $dom->appendChild($elem); - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. For non-compatible elements null will be returned. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_Href - */ - static function unserialize(DOMElement $dom) { - - if ($dom->firstChild && Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { - return new self($dom->firstChild->textContent,false); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/HrefList.php b/3rdparty/Sabre/DAV/Property/HrefList.php deleted file mode 100644 index 282c452ca0..0000000000 --- a/3rdparty/Sabre/DAV/Property/HrefList.php +++ /dev/null @@ -1,96 +0,0 @@ -hrefs = $hrefs; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uris - * - * @return array - */ - public function getHrefs() { - - return $this->hrefs; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - - foreach($this->hrefs as $href) { - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - $elem->nodeValue = ($this->autoPrefix?$server->getBaseUri():'') . $href; - $dom->appendChild($elem); - } - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_HrefList - */ - static function unserialize(DOMElement $dom) { - - $hrefs = array(); - foreach($dom->childNodes as $child) { - if (Sabre_DAV_XMLUtil::toClarkNotation($child)==='{DAV:}href') { - $hrefs[] = $child->textContent; - } - } - return new self($hrefs, false); - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/IHref.php b/3rdparty/Sabre/DAV/Property/IHref.php deleted file mode 100644 index 5c0409064c..0000000000 --- a/3rdparty/Sabre/DAV/Property/IHref.php +++ /dev/null @@ -1,25 +0,0 @@ -locks = $locks; - $this->revealLockToken = $revealLockToken; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $prop) { - - $doc = $prop->ownerDocument; - - foreach($this->locks as $lock) { - - $activeLock = $doc->createElementNS('DAV:','d:activelock'); - $prop->appendChild($activeLock); - - $lockScope = $doc->createElementNS('DAV:','d:lockscope'); - $activeLock->appendChild($lockScope); - - $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==Sabre_DAV_Locks_LockInfo::EXCLUSIVE?'exclusive':'shared'))); - - $lockType = $doc->createElementNS('DAV:','d:locktype'); - $activeLock->appendChild($lockType); - - $lockType->appendChild($doc->createElementNS('DAV:','d:write')); - - /* {DAV:}lockroot */ - if (!self::$hideLockRoot) { - $lockRoot = $doc->createElementNS('DAV:','d:lockroot'); - $activeLock->appendChild($lockRoot); - $href = $doc->createElementNS('DAV:','d:href'); - $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri)); - $lockRoot->appendChild($href); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == Sabre_DAV_Server::DEPTH_INFINITY?'infinity':$lock->depth))); - $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout)); - - if ($this->revealLockToken) { - $lockToken = $doc->createElementNS('DAV:','d:locktoken'); - $activeLock->appendChild($lockToken); - $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token)); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner)); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/ResourceType.php b/3rdparty/Sabre/DAV/Property/ResourceType.php deleted file mode 100644 index f6269611e5..0000000000 --- a/3rdparty/Sabre/DAV/Property/ResourceType.php +++ /dev/null @@ -1,125 +0,0 @@ -resourceType = array(); - elseif ($resourceType === Sabre_DAV_Server::NODE_DIRECTORY) - $this->resourceType = array('{DAV:}collection'); - elseif (is_array($resourceType)) - $this->resourceType = $resourceType; - else - $this->resourceType = array($resourceType); - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $prop) { - - $propName = null; - $rt = $this->resourceType; - - foreach($rt as $resourceType) { - if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) { - - if (isset($server->xmlNamespaces[$propName[1]])) { - $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2])); - } else { - $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2])); - } - - } - } - - } - - /** - * Returns the values in clark-notation - * - * For example array('{DAV:}collection') - * - * @return array - */ - public function getValue() { - - return $this->resourceType; - - } - - /** - * Checks if the principal contains a certain value - * - * @param string $type - * @return bool - */ - public function is($type) { - - return in_array($type, $this->resourceType); - - } - - /** - * Adds a resourcetype value to this property - * - * @param string $type - * @return void - */ - public function add($type) { - - $this->resourceType[] = $type; - $this->resourceType = array_unique($this->resourceType); - - } - - /** - * Unserializes a DOM element into a ResourceType property. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_ResourceType - */ - static public function unserialize(DOMElement $dom) { - - $value = array(); - foreach($dom->childNodes as $child) { - - $value[] = Sabre_DAV_XMLUtil::toClarkNotation($child); - - } - - return new self($value); - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/Response.php b/3rdparty/Sabre/DAV/Property/Response.php deleted file mode 100644 index 9f21163d12..0000000000 --- a/3rdparty/Sabre/DAV/Property/Response.php +++ /dev/null @@ -1,155 +0,0 @@ -href = $href; - $this->responseProperties = $responseProperties; - - } - - /** - * Returns the url - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Returns the property list - * - * @return array - */ - public function getResponseProperties() { - - return $this->responseProperties; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $dom) { - - $document = $dom->ownerDocument; - $properties = $this->responseProperties; - - $xresponse = $document->createElement('d:response'); - $dom->appendChild($xresponse); - - $uri = Sabre_DAV_URLUtil::encodePath($this->href); - - // Adding the baseurl to the beginning of the url - $uri = $server->getBaseUri() . $uri; - - $xresponse->appendChild($document->createElement('d:href',$uri)); - - // The properties variable is an array containing properties, grouped by - // HTTP status - foreach($properties as $httpStatus=>$propertyGroup) { - - // The 'href' is also in this array, and it's special cased. - // We will ignore it - if ($httpStatus=='href') continue; - - // If there are no properties in this group, we can also just carry on - if (!count($propertyGroup)) continue; - - $xpropstat = $document->createElement('d:propstat'); - $xresponse->appendChild($xpropstat); - - $xprop = $document->createElement('d:prop'); - $xpropstat->appendChild($xprop); - - $nsList = $server->xmlNamespaces; - - foreach($propertyGroup as $propertyName=>$propertyValue) { - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - // special case for empty namespaces - if ($propName[1]=='') { - - $currentProperty = $document->createElement($propName[2]); - $xprop->appendChild($currentProperty); - $currentProperty->setAttribute('xmlns',''); - - } else { - - if (!isset($nsList[$propName[1]])) { - $nsList[$propName[1]] = 'x' . count($nsList); - } - - // If the namespace was defined in the top-level xml namespaces, it means - // there was already a namespace declaration, and we don't have to worry about it. - if (isset($server->xmlNamespaces[$propName[1]])) { - $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]); - } else { - $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]); - } - $xprop->appendChild($currentProperty); - - } - - if (is_scalar($propertyValue)) { - $text = $document->createTextNode($propertyValue); - $currentProperty->appendChild($text); - } elseif ($propertyValue instanceof Sabre_DAV_PropertyInterface) { - $propertyValue->serialize($server,$currentProperty); - } elseif (!is_null($propertyValue)) { - throw new Sabre_DAV_Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); - } - - } - - $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus))); - - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/ResponseList.php b/3rdparty/Sabre/DAV/Property/ResponseList.php deleted file mode 100644 index cae923afbf..0000000000 --- a/3rdparty/Sabre/DAV/Property/ResponseList.php +++ /dev/null @@ -1,57 +0,0 @@ -responses = $responses; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - foreach($this->responses as $response) { - $response->serialize($server, $dom); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/SupportedLock.php b/3rdparty/Sabre/DAV/Property/SupportedLock.php deleted file mode 100644 index 4e3aaf23a1..0000000000 --- a/3rdparty/Sabre/DAV/Property/SupportedLock.php +++ /dev/null @@ -1,76 +0,0 @@ -supportsLocks = $supportsLocks; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $prop) { - - $doc = $prop->ownerDocument; - - if (!$this->supportsLocks) return null; - - $lockEntry1 = $doc->createElementNS('DAV:','d:lockentry'); - $lockEntry2 = $doc->createElementNS('DAV:','d:lockentry'); - - $prop->appendChild($lockEntry1); - $prop->appendChild($lockEntry2); - - $lockScope1 = $doc->createElementNS('DAV:','d:lockscope'); - $lockScope2 = $doc->createElementNS('DAV:','d:lockscope'); - $lockType1 = $doc->createElementNS('DAV:','d:locktype'); - $lockType2 = $doc->createElementNS('DAV:','d:locktype'); - - $lockEntry1->appendChild($lockScope1); - $lockEntry1->appendChild($lockType1); - $lockEntry2->appendChild($lockScope2); - $lockEntry2->appendChild($lockType2); - - $lockScope1->appendChild($doc->createElementNS('DAV:','d:exclusive')); - $lockScope2->appendChild($doc->createElementNS('DAV:','d:shared')); - - $lockType1->appendChild($doc->createElementNS('DAV:','d:write')); - $lockType2->appendChild($doc->createElementNS('DAV:','d:write')); - - //$frag->appendXML(''); - //$frag->appendXML(''); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php b/3rdparty/Sabre/DAV/Property/SupportedReportSet.php deleted file mode 100644 index e62699f3b5..0000000000 --- a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php +++ /dev/null @@ -1,109 +0,0 @@ -addReport($reports); - - } - - /** - * Adds a report to this property - * - * The report must be a string in clark-notation. - * Multiple reports can be specified as an array. - * - * @param mixed $report - * @return void - */ - public function addReport($report) { - - if (!is_array($report)) $report = array($report); - - foreach($report as $r) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$r)) - throw new Sabre_DAV_Exception('Reportname must be in clark-notation'); - - $this->reports[] = $r; - - } - - } - - /** - * Returns the list of supported reports - * - * @return array - */ - public function getValue() { - - return $this->reports; - - } - - /** - * Serializes the node - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $prop) { - - foreach($this->reports as $reportName) { - - $supportedReport = $prop->ownerDocument->createElement('d:supported-report'); - $prop->appendChild($supportedReport); - - $report = $prop->ownerDocument->createElement('d:report'); - $supportedReport->appendChild($report); - - preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches); - - list(, $namespace, $element) = $matches; - - $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null; - - if ($prefix) { - $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element)); - } else { - $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element)); - } - - } - - } - -} diff --git a/3rdparty/Sabre/DAV/PropertyInterface.php b/3rdparty/Sabre/DAV/PropertyInterface.php deleted file mode 100644 index 515072cbd3..0000000000 --- a/3rdparty/Sabre/DAV/PropertyInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - 'd', - 'http://sabredav.org/ns' => 's', - ); - - /** - * The propertymap can be used to map properties from - * requests to property classes. - * - * @var array - */ - public $propertyMap = array( - '{DAV:}resourcetype' => 'Sabre_DAV_Property_ResourceType', - ); - - public $protectedProperties = array( - // RFC4918 - '{DAV:}getcontentlength', - '{DAV:}getetag', - '{DAV:}getlastmodified', - '{DAV:}lockdiscovery', - '{DAV:}supportedlock', - - // RFC4331 - '{DAV:}quota-available-bytes', - '{DAV:}quota-used-bytes', - - // RFC3744 - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - - ); - - /** - * This is a flag that allow or not showing file, line and code - * of the exception in the returned XML - * - * @var bool - */ - public $debugExceptions = false; - - /** - * This property allows you to automatically add the 'resourcetype' value - * based on a node's classname or interface. - * - * The preset ensures that {DAV:}collection is automaticlly added for nodes - * implementing Sabre_DAV_ICollection. - * - * @var array - */ - public $resourceTypeMapping = array( - 'Sabre_DAV_ICollection' => '{DAV:}collection', - ); - - /** - * If this setting is turned off, SabreDAV's version number will be hidden - * from various places. - * - * Some people feel this is a good security measure. - * - * @var bool - */ - static public $exposeVersion = true; - - /** - * Sets up the server - * - * If a Sabre_DAV_Tree object is passed as an argument, it will - * use it as the directory tree. If a Sabre_DAV_INode is passed, it - * will create a Sabre_DAV_ObjectTree and use the node as the root. - * - * If nothing is passed, a Sabre_DAV_SimpleCollection is created in - * a Sabre_DAV_ObjectTree. - * - * If an array is passed, we automatically create a root node, and use - * the nodes in the array as top-level children. - * - * @param Sabre_DAV_Tree|Sabre_DAV_INode|array|null $treeOrNode The tree object - */ - public function __construct($treeOrNode = null) { - - if ($treeOrNode instanceof Sabre_DAV_Tree) { - $this->tree = $treeOrNode; - } elseif ($treeOrNode instanceof Sabre_DAV_INode) { - $this->tree = new Sabre_DAV_ObjectTree($treeOrNode); - } elseif (is_array($treeOrNode)) { - - // If it's an array, a list of nodes was passed, and we need to - // create the root node. - foreach($treeOrNode as $node) { - if (!($node instanceof Sabre_DAV_INode)) { - throw new Sabre_DAV_Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement Sabre_DAV_INode'); - } - } - - $root = new Sabre_DAV_SimpleCollection('root', $treeOrNode); - $this->tree = new Sabre_DAV_ObjectTree($root); - - } elseif (is_null($treeOrNode)) { - $root = new Sabre_DAV_SimpleCollection('root'); - $this->tree = new Sabre_DAV_ObjectTree($root); - } else { - throw new Sabre_DAV_Exception('Invalid argument passed to constructor. Argument must either be an instance of Sabre_DAV_Tree, Sabre_DAV_INode, an array or null'); - } - $this->httpResponse = new Sabre_HTTP_Response(); - $this->httpRequest = new Sabre_HTTP_Request(); - - } - - /** - * Starts the DAV Server - * - * @return void - */ - public function exec() { - - try { - - $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri()); - - } catch (Exception $e) { - - try { - $this->broadcastEvent('exception', array($e)); - } catch (Exception $ignore) { - } - $DOM = new DOMDocument('1.0','utf-8'); - $DOM->formatOutput = true; - - $error = $DOM->createElementNS('DAV:','d:error'); - $error->setAttribute('xmlns:s',self::NS_SABREDAV); - $DOM->appendChild($error); - - $h = function($v) { - - return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8'); - - }; - - $error->appendChild($DOM->createElement('s:exception',$h(get_class($e)))); - $error->appendChild($DOM->createElement('s:message',$h($e->getMessage()))); - if ($this->debugExceptions) { - $error->appendChild($DOM->createElement('s:file',$h($e->getFile()))); - $error->appendChild($DOM->createElement('s:line',$h($e->getLine()))); - $error->appendChild($DOM->createElement('s:code',$h($e->getCode()))); - $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString()))); - - } - if (self::$exposeVersion) { - $error->appendChild($DOM->createElement('s:sabredav-version',$h(Sabre_DAV_Version::VERSION))); - } - - if($e instanceof Sabre_DAV_Exception) { - - $httpCode = $e->getHTTPCode(); - $e->serialize($this,$error); - $headers = $e->getHTTPHeaders($this); - - } else { - - $httpCode = 500; - $headers = array(); - - } - $headers['Content-Type'] = 'application/xml; charset=utf-8'; - - $this->httpResponse->sendStatus($httpCode); - $this->httpResponse->setHeaders($headers); - $this->httpResponse->sendBody($DOM->saveXML()); - - } - - } - - /** - * Sets the base server uri - * - * @param string $uri - * @return void - */ - public function setBaseUri($uri) { - - // If the baseUri does not end with a slash, we must add it - if ($uri[strlen($uri)-1]!=='/') - $uri.='/'; - - $this->baseUri = $uri; - - } - - /** - * Returns the base responding uri - * - * @return string - */ - public function getBaseUri() { - - if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri(); - return $this->baseUri; - - } - - /** - * This method attempts to detect the base uri. - * Only the PATH_INFO variable is considered. - * - * If this variable is not set, the root (/) is assumed. - * - * @return string - */ - public function guessBaseUri() { - - $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO'); - $uri = $this->httpRequest->getRawServerValue('REQUEST_URI'); - - // If PATH_INFO is found, we can assume it's accurate. - if (!empty($pathInfo)) { - - // We need to make sure we ignore the QUERY_STRING part - if ($pos = strpos($uri,'?')) - $uri = substr($uri,0,$pos); - - // PATH_INFO is only set for urls, such as: /example.php/path - // in that case PATH_INFO contains '/path'. - // Note that REQUEST_URI is percent encoded, while PATH_INFO is - // not, Therefore they are only comparable if we first decode - // REQUEST_INFO as well. - $decodedUri = Sabre_DAV_URLUtil::decodePath($uri); - - // A simple sanity check: - if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) { - $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo)); - return rtrim($baseUri,'/') . '/'; - } - - throw new Sabre_DAV_Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.'); - - } - - // The last fallback is that we're just going to assume the server root. - return '/'; - - } - - /** - * Adds a plugin to the server - * - * For more information, console the documentation of Sabre_DAV_ServerPlugin - * - * @param Sabre_DAV_ServerPlugin $plugin - * @return void - */ - public function addPlugin(Sabre_DAV_ServerPlugin $plugin) { - - $this->plugins[$plugin->getPluginName()] = $plugin; - $plugin->initialize($this); - - } - - /** - * Returns an initialized plugin by it's name. - * - * This function returns null if the plugin was not found. - * - * @param string $name - * @return Sabre_DAV_ServerPlugin - */ - public function getPlugin($name) { - - if (isset($this->plugins[$name])) - return $this->plugins[$name]; - - // This is a fallback and deprecated. - foreach($this->plugins as $plugin) { - if (get_class($plugin)===$name) return $plugin; - } - - return null; - - } - - /** - * Returns all plugins - * - * @return array - */ - public function getPlugins() { - - return $this->plugins; - - } - - - /** - * Subscribe to an event. - * - * When the event is triggered, we'll call all the specified callbacks. - * It is possible to control the order of the callbacks through the - * priority argument. - * - * This is for example used to make sure that the authentication plugin - * is triggered before anything else. If it's not needed to change this - * number, it is recommended to ommit. - * - * @param string $event - * @param callback $callback - * @param int $priority - * @return void - */ - public function subscribeEvent($event, $callback, $priority = 100) { - - if (!isset($this->eventSubscriptions[$event])) { - $this->eventSubscriptions[$event] = array(); - } - while(isset($this->eventSubscriptions[$event][$priority])) $priority++; - $this->eventSubscriptions[$event][$priority] = $callback; - ksort($this->eventSubscriptions[$event]); - - } - - /** - * Broadcasts an event - * - * This method will call all subscribers. If one of the subscribers returns false, the process stops. - * - * The arguments parameter will be sent to all subscribers - * - * @param string $eventName - * @param array $arguments - * @return bool - */ - public function broadcastEvent($eventName,$arguments = array()) { - - if (isset($this->eventSubscriptions[$eventName])) { - - foreach($this->eventSubscriptions[$eventName] as $subscriber) { - - $result = call_user_func_array($subscriber,$arguments); - if ($result===false) return false; - - } - - } - - return true; - - } - - /** - * Handles a http request, and execute a method based on its name - * - * @param string $method - * @param string $uri - * @return void - */ - public function invokeMethod($method, $uri) { - - $method = strtoupper($method); - - if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return; - - // Make sure this is a HTTP method we support - $internalMethods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'MKCOL', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - if (in_array($method,$internalMethods)) { - - call_user_func(array($this,'http' . $method), $uri); - - } else { - - if ($this->broadcastEvent('unknownMethod',array($method, $uri))) { - // Unsupported method - throw new Sabre_DAV_Exception_NotImplemented('There was no handler found for this "' . $method . '" method'); - } - - } - - } - - // {{{ HTTP Method implementations - - /** - * HTTP OPTIONS - * - * @param string $uri - * @return void - */ - protected function httpOptions($uri) { - - $methods = $this->getAllowedMethods($uri); - - $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods))); - $features = array('1','3', 'extended-mkcol'); - - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - $this->httpResponse->setHeader('MS-Author-Via','DAV'); - $this->httpResponse->setHeader('Accept-Ranges','bytes'); - if (self::$exposeVersion) { - $this->httpResponse->setHeader('X-Sabre-Version',Sabre_DAV_Version::VERSION); - } - $this->httpResponse->setHeader('Content-Length',0); - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP GET - * - * This method simply fetches the contents of a uri, like normal - * - * @param string $uri - * @return bool - */ - protected function httpGet($uri) { - - $node = $this->tree->getNodeForPath($uri,0); - - if (!$this->checkPreconditions(true)) return false; - - if (!$node instanceof Sabre_DAV_IFile) throw new Sabre_DAV_Exception_NotImplemented('GET is only implemented on File objects'); - $body = $node->get(); - - // Converting string into stream, if needed. - if (is_string($body)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$body); - rewind($stream); - $body = $stream; - } - - /* - * TODO: getetag, getlastmodified, getsize should also be used using - * this method - */ - $httpHeaders = $this->getHTTPHeaders($uri); - - /* ContentType needs to get a default, because many webservers will otherwise - * default to text/html, and we don't want this for security reasons. - */ - if (!isset($httpHeaders['Content-Type'])) { - $httpHeaders['Content-Type'] = 'application/octet-stream'; - } - - - if (isset($httpHeaders['Content-Length'])) { - - $nodeSize = $httpHeaders['Content-Length']; - - // Need to unset Content-Length, because we'll handle that during figuring out the range - unset($httpHeaders['Content-Length']); - - } else { - $nodeSize = null; - } - - $this->httpResponse->setHeaders($httpHeaders); - - $range = $this->getHTTPRange(); - $ifRange = $this->httpRequest->getHeader('If-Range'); - $ignoreRangeHeader = false; - - // If ifRange is set, and range is specified, we first need to check - // the precondition. - if ($nodeSize && $range && $ifRange) { - - // if IfRange is parsable as a date we'll treat it as a DateTime - // otherwise, we must treat it as an etag. - try { - $ifRangeDate = new DateTime($ifRange); - - // It's a date. We must check if the entity is modified since - // the specified date. - if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true; - else { - $modified = new DateTime($httpHeaders['Last-Modified']); - if($modified > $ifRangeDate) $ignoreRangeHeader = true; - } - - } catch (Exception $e) { - - // It's an entity. We can do a simple comparison. - if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true; - elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true; - } - } - - // We're only going to support HTTP ranges if the backend provided a filesize - if (!$ignoreRangeHeader && $nodeSize && $range) { - - // Determining the exact byte offsets - if (!is_null($range[0])) { - - $start = $range[0]; - $end = $range[1]?$range[1]:$nodeSize-1; - if($start >= $nodeSize) - throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')'); - - if($end < $start) throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); - if($end >= $nodeSize) $end = $nodeSize-1; - - } else { - - $start = $nodeSize-$range[1]; - $end = $nodeSize-1; - - if ($start<0) $start = 0; - - } - - // New read/write stream - $newStream = fopen('php://temp','r+'); - - stream_copy_to_stream($body, $newStream, $end-$start+1, $start); - rewind($newStream); - - $this->httpResponse->setHeader('Content-Length', $end-$start+1); - $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize); - $this->httpResponse->sendStatus(206); - $this->httpResponse->sendBody($newStream); - - - } else { - - if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize); - $this->httpResponse->sendStatus(200); - $this->httpResponse->sendBody($body); - - } - - } - - /** - * HTTP HEAD - * - * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body - * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again - * - * @param string $uri - * @return void - */ - protected function httpHead($uri) { - - $node = $this->tree->getNodeForPath($uri); - /* This information is only collection for File objects. - * Ideally we want to throw 405 Method Not Allowed for every - * non-file, but MS Office does not like this - */ - if ($node instanceof Sabre_DAV_IFile) { - $headers = $this->getHTTPHeaders($this->getRequestUri()); - if (!isset($headers['Content-Type'])) { - $headers['Content-Type'] = 'application/octet-stream'; - } - $this->httpResponse->setHeaders($headers); - } - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP Delete - * - * The HTTP delete method, deletes a given uri - * - * @param string $uri - * @return void - */ - protected function httpDelete($uri) { - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - $this->broadcastEvent('afterUnbind',array($uri)); - - $this->httpResponse->sendStatus(204); - $this->httpResponse->setHeader('Content-Length','0'); - - } - - - /** - * WebDAV PROPFIND - * - * This WebDAV method requests information about an uri resource, or a list of resources - * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value - * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory) - * - * The request body contains an XML data structure that has a list of properties the client understands - * The response body is also an xml document, containing information about every uri resource and the requested properties - * - * It has to return a HTTP 207 Multi-status status code - * - * @param string $uri - * @return void - */ - protected function httpPropfind($uri) { - - // $xml = new Sabre_DAV_XMLReader(file_get_contents('php://input')); - $requestedProperties = $this->parsePropfindRequest($this->httpRequest->getBody(true)); - - $depth = $this->getHTTPDepth(1); - // The only two options for the depth of a propfind is 0 or 1 - if ($depth!=0) $depth = 1; - - $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth); - - // This is a multi-status response - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->httpResponse->setHeader('Vary','Brief,Prefer'); - - // Normally this header is only needed for OPTIONS responses, however.. - // iCal seems to also depend on these being set for PROPFIND. Since - // this is not harmful, we'll add it. - $features = array('1','3', 'extended-mkcol'); - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - - $prefer = $this->getHTTPPrefer(); - $minimal = $prefer['return-minimal']; - - $data = $this->generateMultiStatus($newProperties, $minimal); - $this->httpResponse->sendBody($data); - - } - - /** - * WebDAV PROPPATCH - * - * This method is called to update properties on a Node. The request is an XML body with all the mutations. - * In this XML body it is specified which properties should be set/updated and/or deleted - * - * @param string $uri - * @return void - */ - protected function httpPropPatch($uri) { - - $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true)); - - $result = $this->updateProperties($uri, $newProperties); - - $prefer = $this->getHTTPPrefer(); - $this->httpResponse->setHeader('Vary','Brief,Prefer'); - - if ($prefer['return-minimal']) { - - // If return-minimal is specified, we only have to check if the - // request was succesful, and don't need to return the - // multi-status. - $ok = true; - foreach($result as $code=>$prop) { - if ((int)$code > 299) { - $ok = false; - } - } - - if ($ok) { - - $this->httpResponse->sendStatus(204); - return; - - } - - } - - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } - - /** - * HTTP PUT method - * - * This HTTP method updates a file, or creates a new one. - * - * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content - * - * @param string $uri - * @return bool - */ - protected function httpPut($uri) { - - $body = $this->httpRequest->getBody(); - - // Intercepting Content-Range - if ($this->httpRequest->getHeader('Content-Range')) { - /** - Content-Range is dangerous for PUT requests: PUT per definition - stores a full resource. draft-ietf-httpbis-p2-semantics-15 says - in section 7.6: - An origin server SHOULD reject any PUT request that contains a - Content-Range header field, since it might be misinterpreted as - partial content (or might be partial content that is being mistakenly - PUT as a full representation). Partial content updates are possible - by targeting a separately identified resource with state that - overlaps a portion of the larger resource, or by using a different - method that has been specifically defined for partial updates (for - example, the PATCH method defined in [RFC5789]). - This clarifies RFC2616 section 9.6: - The recipient of the entity MUST NOT ignore any Content-* - (e.g. Content-Range) headers that it does not understand or implement - and MUST return a 501 (Not Implemented) response in such cases. - OTOH is a PUT request with a Content-Range currently the only way to - continue an aborted upload request and is supported by curl, mod_dav, - Tomcat and others. Since some clients do use this feature which results - in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject - all PUT requests with a Content-Range for now. - */ - - throw new Sabre_DAV_Exception_NotImplemented('PUT with Content-Range is not allowed.'); - } - - // Intercepting the Finder problem - if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) { - - /** - Many webservers will not cooperate well with Finder PUT requests, - because it uses 'Chunked' transfer encoding for the request body. - - The symptom of this problem is that Finder sends files to the - server, but they arrive as 0-length files in PHP. - - If we don't do anything, the user might think they are uploading - files successfully, but they end up empty on the server. Instead, - we throw back an error if we detect this. - - The reason Finder uses Chunked, is because it thinks the files - might change as it's being uploaded, and therefore the - Content-Length can vary. - - Instead it sends the X-Expected-Entity-Length header with the size - of the file at the very start of the request. If this header is set, - but we don't get a request body we will fail the request to - protect the end-user. - */ - - // Only reading first byte - $firstByte = fread($body,1); - if (strlen($firstByte)!==1) { - throw new Sabre_DAV_Exception_Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.'); - } - - // The body needs to stay intact, so we copy everything to a - // temporary stream. - - $newBody = fopen('php://temp','r+'); - fwrite($newBody,$firstByte); - stream_copy_to_stream($body, $newBody); - rewind($newBody); - - $body = $newBody; - - } - - if ($this->tree->nodeExists($uri)) { - - $node = $this->tree->getNodeForPath($uri); - - // Checking If-None-Match and related headers. - if (!$this->checkPreconditions()) return; - - // If the node is a collection, we'll deny it - if (!($node instanceof Sabre_DAV_IFile)) throw new Sabre_DAV_Exception_Conflict('PUT is not allowed on non-files.'); - if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false; - - $etag = $node->put($body); - - $this->broadcastEvent('afterWriteContent',array($uri, $node)); - - $this->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->httpResponse->setHeader('ETag',$etag); - $this->httpResponse->sendStatus(204); - - } else { - - $etag = null; - // If we got here, the resource didn't exist yet. - if (!$this->createFile($this->getRequestUri(),$body,$etag)) { - // For one reason or another the file was not created. - return; - } - - $this->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->httpResponse->setHeader('ETag', $etag); - $this->httpResponse->sendStatus(201); - - } - - } - - - /** - * WebDAV MKCOL - * - * The MKCOL method is used to create a new collection (directory) on the server - * - * @param string $uri - * @return void - */ - protected function httpMkcol($uri) { - - $requestBody = $this->httpRequest->getBody(true); - - if ($requestBody) { - - $contentType = $this->httpRequest->getHeader('Content-Type'); - if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) { - - // We must throw 415 for unsupported mkcol bodies - throw new Sabre_DAV_Exception_UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type'); - - } - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($requestBody); - if (Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') { - - // We must throw 415 for unsupported mkcol bodies - throw new Sabre_DAV_Exception_UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.'); - - } - - $properties = array(); - foreach($dom->firstChild->childNodes as $childNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue; - $properties = array_merge($properties, Sabre_DAV_XMLUtil::parseProperties($childNode, $this->propertyMap)); - - } - if (!isset($properties['{DAV:}resourcetype'])) - throw new Sabre_DAV_Exception_BadRequest('The mkcol request must include a {DAV:}resourcetype property'); - - $resourceType = $properties['{DAV:}resourcetype']->getValue(); - unset($properties['{DAV:}resourcetype']); - - } else { - - $properties = array(); - $resourceType = array('{DAV:}collection'); - - } - - $result = $this->createCollection($uri, $resourceType, $properties); - - if (is_array($result)) { - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } else { - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus(201); - } - - } - - /** - * WebDAV HTTP MOVE method - * - * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return bool - */ - protected function httpMove($uri) { - - $moveInfo = $this->getCopyAndMoveInfo(); - - // If the destination is part of the source tree, we must fail - if ($moveInfo['destination']==$uri) - throw new Sabre_DAV_Exception_Forbidden('Source and destination uri are identical.'); - - if ($moveInfo['destinationExists']) { - - if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false; - $this->tree->delete($moveInfo['destination']); - $this->broadcastEvent('afterUnbind',array($moveInfo['destination'])); - - } - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false; - if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false; - $this->tree->move($uri,$moveInfo['destination']); - $this->broadcastEvent('afterUnbind',array($uri)); - $this->broadcastEvent('afterBind',array($moveInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201); - - } - - /** - * WebDAV HTTP COPY method - * - * This method copies one uri to a different uri, and works much like the MOVE request - * A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return bool - */ - protected function httpCopy($uri) { - - $copyInfo = $this->getCopyAndMoveInfo(); - // If the destination is part of the source tree, we must fail - if ($copyInfo['destination']==$uri) - throw new Sabre_DAV_Exception_Forbidden('Source and destination uri are identical.'); - - if ($copyInfo['destinationExists']) { - if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false; - $this->tree->delete($copyInfo['destination']); - - } - if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false; - $this->tree->copy($uri,$copyInfo['destination']); - $this->broadcastEvent('afterBind',array($copyInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201); - - } - - - - /** - * HTTP REPORT method implementation - * - * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253) - * It's used in a lot of extensions, so it made sense to implement it into the core. - * - * @param string $uri - * @return void - */ - protected function httpReport($uri) { - - $body = $this->httpRequest->getBody(true); - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $reportName = Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild); - - if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { - - // If broadcastEvent returned true, it means the report was not supported - throw new Sabre_DAV_Exception_ReportNotSupported(); - - } - - } - - // }}} - // {{{ HTTP/WebDAV protocol helpers - - /** - * Returns an array with all the supported HTTP methods for a specific uri. - * - * @param string $uri - * @return array - */ - public function getAllowedMethods($uri) { - - $methods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - // The MKCOL is only allowed on an unmapped uri - try { - $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - $methods[] = 'MKCOL'; - } - - // We're also checking if any of the plugins register any new methods - foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri)); - array_unique($methods); - - return $methods; - - } - - /** - * Gets the uri for the request, keeping the base uri into consideration - * - * @return string - */ - public function getRequestUri() { - - return $this->calculateUri($this->httpRequest->getUri()); - - } - - /** - * Calculates the uri for a request, making sure that the base uri is stripped out - * - * @param string $uri - * @throws Sabre_DAV_Exception_Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri - * @return string - */ - public function calculateUri($uri) { - - if ($uri[0]!='/' && strpos($uri,'://')) { - - $uri = parse_url($uri,PHP_URL_PATH); - - } - - $uri = str_replace('//','/',$uri); - - if (strpos($uri,$this->getBaseUri())===0) { - - return trim(Sabre_DAV_URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/'); - - // A special case, if the baseUri was accessed without a trailing - // slash, we'll accept it as well. - } elseif ($uri.'/' === $this->getBaseUri()) { - - return ''; - - } else { - - throw new Sabre_DAV_Exception_Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')'); - - } - - } - - /** - * Returns the HTTP depth header - * - * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the Sabre_DAV_Server::DEPTH_INFINITY object - * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent - * - * @param mixed $default - * @return int - */ - public function getHTTPDepth($default = self::DEPTH_INFINITY) { - - // If its not set, we'll grab the default - $depth = $this->httpRequest->getHeader('Depth'); - - if (is_null($depth)) return $default; - - if ($depth == 'infinity') return self::DEPTH_INFINITY; - - - // If its an unknown value. we'll grab the default - if (!ctype_digit($depth)) return $default; - - return (int)$depth; - - } - - /** - * Returns the HTTP range header - * - * This method returns null if there is no well-formed HTTP range request - * header or array($start, $end). - * - * The first number is the offset of the first byte in the range. - * The second number is the offset of the last byte in the range. - * - * If the second offset is null, it should be treated as the offset of the last byte of the entity - * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity - * - * @return array|null - */ - public function getHTTPRange() { - - $range = $this->httpRequest->getHeader('range'); - if (is_null($range)) return null; - - // Matching "Range: bytes=1234-5678: both numbers are optional - - if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; - - if ($matches[1]==='' && $matches[2]==='') return null; - - return array( - $matches[1]!==''?$matches[1]:null, - $matches[2]!==''?$matches[2]:null, - ); - - } - - /** - * Returns the HTTP Prefer header information. - * - * The prefer header is defined in: - * http://tools.ietf.org/html/draft-snell-http-prefer-14 - * - * This method will return an array with options. - * - * Currently, the following options may be returned: - * array( - * 'return-asynch' => true, - * 'return-minimal' => true, - * 'return-representation' => true, - * 'wait' => 30, - * 'strict' => true, - * 'lenient' => true, - * ) - * - * This method also supports the Brief header, and will also return - * 'return-minimal' if the brief header was set to 't'. - * - * For the boolean options, false will be returned if the headers are not - * specified. For the integer options it will be 'null'. - * - * @return array - */ - public function getHTTPPrefer() { - - $result = array( - 'return-asynch' => false, - 'return-minimal' => false, - 'return-representation' => false, - 'wait' => null, - 'strict' => false, - 'lenient' => false, - ); - - if ($prefer = $this->httpRequest->getHeader('Prefer')) { - - $parameters = array_map('trim', - explode(',', $prefer) - ); - - foreach($parameters as $parameter) { - - // Right now our regex only supports the tokens actually - // specified in the draft. We may need to expand this if new - // tokens get registered. - if(!preg_match('/^(?P[a-z0-9-]+)(?:=(?P[0-9]+))?$/', $parameter, $matches)) { - continue; - } - - switch($matches['token']) { - - case 'return-asynch' : - case 'return-minimal' : - case 'return-representation' : - case 'strict' : - case 'lenient' : - $result[$matches['token']] = true; - break; - case 'wait' : - $result[$matches['token']] = $matches['value']; - break; - - } - - } - - } - - if ($this->httpRequest->getHeader('Brief')=='t') { - $result['return-minimal'] = true; - } - - return $result; - - } - - - /** - * Returns information about Copy and Move requests - * - * This function is created to help getting information about the source and the destination for the - * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions - * - * The returned value is an array with the following keys: - * * destination - Destination path - * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten) - * - * @return array - */ - public function getCopyAndMoveInfo() { - - // Collecting the relevant HTTP headers - if (!$this->httpRequest->getHeader('Destination')) throw new Sabre_DAV_Exception_BadRequest('The destination header was not supplied'); - $destination = $this->calculateUri($this->httpRequest->getHeader('Destination')); - $overwrite = $this->httpRequest->getHeader('Overwrite'); - if (!$overwrite) $overwrite = 'T'; - if (strtoupper($overwrite)=='T') $overwrite = true; - elseif (strtoupper($overwrite)=='F') $overwrite = false; - // We need to throw a bad request exception, if the header was invalid - else throw new Sabre_DAV_Exception_BadRequest('The HTTP Overwrite header should be either T or F'); - - list($destinationDir) = Sabre_DAV_URLUtil::splitPath($destination); - - try { - $destinationParent = $this->tree->getNodeForPath($destinationDir); - if (!($destinationParent instanceof Sabre_DAV_ICollection)) throw new Sabre_DAV_Exception_UnsupportedMediaType('The destination node is not a collection'); - } catch (Sabre_DAV_Exception_NotFound $e) { - - // If the destination parent node is not found, we throw a 409 - throw new Sabre_DAV_Exception_Conflict('The destination node is not found'); - } - - try { - - $destinationNode = $this->tree->getNodeForPath($destination); - - // If this succeeded, it means the destination already exists - // we'll need to throw precondition failed in case overwrite is false - if (!$overwrite) throw new Sabre_DAV_Exception_PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite'); - - } catch (Sabre_DAV_Exception_NotFound $e) { - - // Destination didn't exist, we're all good - $destinationNode = false; - - - - } - - // These are the three relevant properties we need to return - return array( - 'destination' => $destination, - 'destinationExists' => $destinationNode==true, - 'destinationNode' => $destinationNode, - ); - - } - - /** - * Returns a list of properties for a path - * - * This is a simplified version getPropertiesForPath. - * if you aren't interested in status codes, but you just - * want to have a flat list of properties. Use this method. - * - * @param string $path - * @param array $propertyNames - */ - public function getProperties($path, $propertyNames) { - - $result = $this->getPropertiesForPath($path,$propertyNames,0); - return $result[0][200]; - - } - - /** - * A kid-friendly way to fetch properties for a node's children. - * - * The returned array will be indexed by the path of the of child node. - * Only properties that are actually found will be returned. - * - * The parent node will not be returned. - * - * @param string $path - * @param array $propertyNames - * @return array - */ - public function getPropertiesForChildren($path, $propertyNames) { - - $result = array(); - foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) { - - // Skipping the parent path - if ($k === 0) continue; - - $result[$row['href']] = $row[200]; - - } - return $result; - - } - - /** - * Returns a list of HTTP headers for a particular resource - * - * The generated http headers are based on properties provided by the - * resource. The method basically provides a simple mapping between - * DAV property and HTTP header. - * - * The headers are intended to be used for HEAD and GET requests. - * - * @param string $path - * @return array - */ - public function getHTTPHeaders($path) { - - $propertyMap = array( - '{DAV:}getcontenttype' => 'Content-Type', - '{DAV:}getcontentlength' => 'Content-Length', - '{DAV:}getlastmodified' => 'Last-Modified', - '{DAV:}getetag' => 'ETag', - ); - - $properties = $this->getProperties($path,array_keys($propertyMap)); - - $headers = array(); - foreach($propertyMap as $property=>$header) { - if (!isset($properties[$property])) continue; - - if (is_scalar($properties[$property])) { - $headers[$header] = $properties[$property]; - - // GetLastModified gets special cased - } elseif ($properties[$property] instanceof Sabre_DAV_Property_GetLastModified) { - $headers[$header] = Sabre_HTTP_Util::toHTTPDate($properties[$property]->getTime()); - } - - } - - return $headers; - - } - - /** - * Returns a list of properties for a given path - * - * The path that should be supplied should have the baseUrl stripped out - * The list of properties should be supplied in Clark notation. If the list is empty - * 'allprops' is assumed. - * - * If a depth of 1 is requested child elements will also be returned. - * - * @param string $path - * @param array $propertyNames - * @param int $depth - * @return array - */ - public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) { - - if ($depth!=0) $depth = 1; - - $returnPropertyList = array(); - - $parentNode = $this->tree->getNodeForPath($path); - $nodes = array( - $path => $parentNode - ); - if ($depth==1 && $parentNode instanceof Sabre_DAV_ICollection) { - foreach($this->tree->getChildren($path) as $childNode) - $nodes[$path . '/' . $childNode->getName()] = $childNode; - } - - // If the propertyNames array is empty, it means all properties are requested. - // We shouldn't actually return everything we know though, and only return a - // sensible list. - $allProperties = count($propertyNames)==0; - - foreach($nodes as $myPath=>$node) { - - $currentPropertyNames = $propertyNames; - - $newProperties = array( - '200' => array(), - '404' => array(), - ); - - if ($allProperties) { - // Default list of propertyNames, when all properties were requested. - $currentPropertyNames = array( - '{DAV:}getlastmodified', - '{DAV:}getcontentlength', - '{DAV:}resourcetype', - '{DAV:}quota-used-bytes', - '{DAV:}quota-available-bytes', - '{DAV:}getetag', - '{DAV:}getcontenttype', - ); - } - - // If the resourceType was not part of the list, we manually add it - // and mark it for removal. We need to know the resourcetype in order - // to make certain decisions about the entry. - // WebDAV dictates we should add a / and the end of href's for collections - $removeRT = false; - if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) { - $currentPropertyNames[] = '{DAV:}resourcetype'; - $removeRT = true; - } - - $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties)); - // If this method explicitly returned false, we must ignore this - // node as it is inaccessible. - if ($result===false) continue; - - if (count($currentPropertyNames) > 0) { - - if ($node instanceof Sabre_DAV_IProperties) - $newProperties['200'] = $newProperties[200] + $node->getProperties($currentPropertyNames); - - } - - - foreach($currentPropertyNames as $prop) { - - if (isset($newProperties[200][$prop])) continue; - - switch($prop) { - case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Sabre_DAV_Property_GetLastModified($node->getLastModified()); break; - case '{DAV:}getcontentlength' : - if ($node instanceof Sabre_DAV_IFile) { - $size = $node->getSize(); - if (!is_null($size)) { - $newProperties[200][$prop] = (int)$node->getSize(); - } - } - break; - case '{DAV:}quota-used-bytes' : - if ($node instanceof Sabre_DAV_IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[0]; - } - break; - case '{DAV:}quota-available-bytes' : - if ($node instanceof Sabre_DAV_IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[1]; - } - break; - case '{DAV:}getetag' : if ($node instanceof Sabre_DAV_IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break; - case '{DAV:}getcontenttype' : if ($node instanceof Sabre_DAV_IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break; - case '{DAV:}supported-report-set' : - $reports = array(); - foreach($this->plugins as $plugin) { - $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath)); - } - $newProperties[200][$prop] = new Sabre_DAV_Property_SupportedReportSet($reports); - break; - case '{DAV:}resourcetype' : - $newProperties[200]['{DAV:}resourcetype'] = new Sabre_DAV_Property_ResourceType(); - foreach($this->resourceTypeMapping as $className => $resourceType) { - if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType); - } - break; - - } - - // If we were unable to find the property, we will list it as 404. - if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null; - - } - - $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node)); - - $newProperties['href'] = trim($myPath,'/'); - - // Its is a WebDAV recommendation to add a trailing slash to collectionnames. - // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard. - if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) { - $rt = $newProperties[200]['{DAV:}resourcetype']; - if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) { - $newProperties['href'] .='/'; - } - } - - // If the resourcetype property was manually added to the requested property list, - // we will remove it again. - if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']); - - $returnPropertyList[] = $newProperties; - - } - - return $returnPropertyList; - - } - - /** - * This method is invoked by sub-systems creating a new file. - * - * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin). - * It was important to get this done through a centralized function, - * allowing plugins to intercept this using the beforeCreateFile event. - * - * This method will return true if the file was actually created - * - * @param string $uri - * @param resource $data - * @param string $etag - * @return bool - */ - public function createFile($uri,$data, &$etag = null) { - - list($dir,$name) = Sabre_DAV_URLUtil::splitPath($uri); - - if (!$this->broadcastEvent('beforeBind',array($uri))) return false; - - $parent = $this->tree->getNodeForPath($dir); - if (!$parent instanceof Sabre_DAV_ICollection) { - throw new Sabre_DAV_Exception_Conflict('Files can only be created as children of collections'); - } - - if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false; - - $etag = $parent->createFile($name,$data); - $this->tree->markDirty($dir . '/' . $name); - - $this->broadcastEvent('afterBind',array($uri)); - $this->broadcastEvent('afterCreateFile',array($uri, $parent)); - - return true; - } - - /** - * This method is invoked by sub-systems creating a new directory. - * - * @param string $uri - * @return void - */ - public function createDirectory($uri) { - - $this->createCollection($uri,array('{DAV:}collection'),array()); - - } - - /** - * Use this method to create a new collection - * - * The {DAV:}resourcetype is specified using the resourceType array. - * At the very least it must contain {DAV:}collection. - * - * The properties array can contain a list of additional properties. - * - * @param string $uri The new uri - * @param array $resourceType The resourceType(s) - * @param array $properties A list of properties - * @return array|null - */ - public function createCollection($uri, array $resourceType, array $properties) { - - list($parentUri,$newName) = Sabre_DAV_URLUtil::splitPath($uri); - - // Making sure {DAV:}collection was specified as resourceType - if (!in_array('{DAV:}collection', $resourceType)) { - throw new Sabre_DAV_Exception_InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection'); - } - - - // Making sure the parent exists - try { - - $parent = $this->tree->getNodeForPath($parentUri); - - } catch (Sabre_DAV_Exception_NotFound $e) { - - throw new Sabre_DAV_Exception_Conflict('Parent node does not exist'); - - } - - // Making sure the parent is a collection - if (!$parent instanceof Sabre_DAV_ICollection) { - throw new Sabre_DAV_Exception_Conflict('Parent node is not a collection'); - } - - - - // Making sure the child does not already exist - try { - $parent->getChild($newName); - - // If we got here.. it means there's already a node on that url, and we need to throw a 405 - throw new Sabre_DAV_Exception_MethodNotAllowed('The resource you tried to create already exists'); - - } catch (Sabre_DAV_Exception_NotFound $e) { - // This is correct - } - - - if (!$this->broadcastEvent('beforeBind',array($uri))) return; - - // There are 2 modes of operation. The standard collection - // creates the directory, and then updates properties - // the extended collection can create it directly. - if ($parent instanceof Sabre_DAV_IExtendedCollection) { - - $parent->createExtendedCollection($newName, $resourceType, $properties); - - } else { - - // No special resourcetypes are supported - if (count($resourceType)>1) { - throw new Sabre_DAV_Exception_InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.'); - } - - $parent->createDirectory($newName); - $rollBack = false; - $exception = null; - $errorResult = null; - - if (count($properties)>0) { - - try { - - $errorResult = $this->updateProperties($uri, $properties); - if (!isset($errorResult[200])) { - $rollBack = true; - } - - } catch (Sabre_DAV_Exception $e) { - - $rollBack = true; - $exception = $e; - - } - - } - - if ($rollBack) { - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - - // Re-throwing exception - if ($exception) throw $exception; - - return $errorResult; - } - - } - $this->tree->markDirty($parentUri); - $this->broadcastEvent('afterBind',array($uri)); - - } - - /** - * This method updates a resource's properties - * - * The properties array must be a list of properties. Array-keys are - * property names in clarknotation, array-values are it's values. - * If a property must be deleted, the value should be null. - * - * Note that this request should either completely succeed, or - * completely fail. - * - * The response is an array with statuscodes for keys, which in turn - * contain arrays with propertynames. This response can be used - * to generate a multistatus body. - * - * @param string $uri - * @param array $properties - * @return array - */ - public function updateProperties($uri, array $properties) { - - // we'll start by grabbing the node, this will throw the appropriate - // exceptions if it doesn't. - $node = $this->tree->getNodeForPath($uri); - - $result = array( - 200 => array(), - 403 => array(), - 424 => array(), - ); - $remainingProperties = $properties; - $hasError = false; - - // Running through all properties to make sure none of them are protected - if (!$hasError) foreach($properties as $propertyName => $value) { - if(in_array($propertyName, $this->protectedProperties)) { - $result[403][$propertyName] = null; - unset($remainingProperties[$propertyName]); - $hasError = true; - } - } - - if (!$hasError) { - // Allowing plugins to take care of property updating - $hasError = !$this->broadcastEvent('updateProperties',array( - &$remainingProperties, - &$result, - $node - )); - } - - // If the node is not an instance of Sabre_DAV_IProperties, every - // property is 403 Forbidden - if (!$hasError && count($remainingProperties) && !($node instanceof Sabre_DAV_IProperties)) { - $hasError = true; - foreach($properties as $propertyName=> $value) { - $result[403][$propertyName] = null; - } - $remainingProperties = array(); - } - - // Only if there were no errors we may attempt to update the resource - if (!$hasError) { - - if (count($remainingProperties)>0) { - - $updateResult = $node->updateProperties($remainingProperties); - - if ($updateResult===true) { - // success - foreach($remainingProperties as $propertyName=>$value) { - $result[200][$propertyName] = null; - } - - } elseif ($updateResult===false) { - // The node failed to update the properties for an - // unknown reason - foreach($remainingProperties as $propertyName=>$value) { - $result[403][$propertyName] = null; - } - - } elseif (is_array($updateResult)) { - - // The node has detailed update information - // We need to merge the results with the earlier results. - foreach($updateResult as $status => $props) { - if (is_array($props)) { - if (!isset($result[$status])) - $result[$status] = array(); - - $result[$status] = array_merge($result[$status], $updateResult[$status]); - } - } - - } else { - throw new Sabre_DAV_Exception('Invalid result from updateProperties'); - } - $remainingProperties = array(); - } - - } - - foreach($remainingProperties as $propertyName=>$value) { - // if there are remaining properties, it must mean - // there's a dependency failure - $result[424][$propertyName] = null; - } - - // Removing empty array values - foreach($result as $status=>$props) { - - if (count($props)===0) unset($result[$status]); - - } - $result['href'] = $uri; - return $result; - - } - - /** - * This method checks the main HTTP preconditions. - * - * Currently these are: - * * If-Match - * * If-None-Match - * * If-Modified-Since - * * If-Unmodified-Since - * - * The method will return true if all preconditions are met - * The method will return false, or throw an exception if preconditions - * failed. If false is returned the operation should be aborted, and - * the appropriate HTTP response headers are already set. - * - * Normally this method will throw 412 Precondition Failed for failures - * related to If-None-Match, If-Match and If-Unmodified Since. It will - * set the status to 304 Not Modified for If-Modified_since. - * - * If the $handleAsGET argument is set to true, it will also return 304 - * Not Modified for failure of the If-None-Match precondition. This is the - * desired behaviour for HTTP GET and HTTP HEAD requests. - * - * @param bool $handleAsGET - * @return bool - */ - public function checkPreconditions($handleAsGET = false) { - - $uri = $this->getRequestUri(); - $node = null; - $lastMod = null; - $etag = null; - - if ($ifMatch = $this->httpRequest->getHeader('If-Match')) { - - // If-Match contains an entity tag. Only if the entity-tag - // matches we are allowed to make the request succeed. - // If the entity-tag is '*' we are only allowed to make the - // request succeed if a resource exists at that url. - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match'); - } - - // Only need to check entity tags if they are not * - if ($ifMatch!=='*') { - - // There can be multiple etags - $ifMatch = explode(',',$ifMatch); - $haveMatch = false; - foreach($ifMatch as $ifMatchItem) { - - // Stripping any extra spaces - $ifMatchItem = trim($ifMatchItem,' '); - - $etag = $node->getETag(); - if ($etag===$ifMatchItem) { - $haveMatch = true; - } else { - // Evolution has a bug where it sometimes prepends the " - // with a \. This is our workaround. - if (str_replace('\\"','"', $ifMatchItem) === $etag) { - $haveMatch = true; - } - } - - } - if (!$haveMatch) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); - } - } - } - - if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) { - - // The If-None-Match header contains an etag. - // Only if the ETag does not match the current ETag, the request will succeed - // The header can also contain *, in which case the request - // will only succeed if the entity does not exist at all. - $nodeExists = true; - if (!$node) { - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_NotFound $e) { - $nodeExists = false; - } - } - if ($nodeExists) { - $haveMatch = false; - if ($ifNoneMatch==='*') $haveMatch = true; - else { - - // There might be multiple etags - $ifNoneMatch = explode(',', $ifNoneMatch); - $etag = $node->getETag(); - - foreach($ifNoneMatch as $ifNoneMatchItem) { - - // Stripping any extra spaces - $ifNoneMatchItem = trim($ifNoneMatchItem,' '); - - if ($etag===$ifNoneMatchItem) $haveMatch = true; - - } - - } - - if ($haveMatch) { - if ($handleAsGET) { - $this->httpResponse->sendStatus(304); - return false; - } else { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match'); - } - } - } - - } - - if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) { - - // The If-Modified-Since header contains a date. We - // will only return the entity if it has been changed since - // that date. If it hasn't been changed, we return a 304 - // header - // Note that this header only has to be checked if there was no If-None-Match header - // as per the HTTP spec. - $date = Sabre_HTTP_Util::parseHTTPDate($ifModifiedSince); - - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new DateTime('@' . $lastMod); - if ($lastMod <= $date) { - $this->httpResponse->sendStatus(304); - $this->httpResponse->setHeader('Last-Modified', Sabre_HTTP_Util::toHTTPDate($lastMod)); - return false; - } - } - } - } - - if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) { - - // The If-Unmodified-Since will allow allow the request if the - // entity has not changed since the specified date. - $date = Sabre_HTTP_Util::parseHTTPDate($ifUnmodifiedSince); - - // We must only check the date if it's valid - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new DateTime('@' . $lastMod); - if ($lastMod > $date) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since'); - } - } - } - - } - return true; - - } - - // }}} - // {{{ XML Readers & Writers - - - /** - * Generates a WebDAV propfind response body based on a list of nodes. - * - * If 'strip404s' is set to true, all 404 responses will be removed. - * - * @param array $fileProperties The list with nodes - * @param bool strip404s - * @return string - */ - public function generateMultiStatus(array $fileProperties, $strip404s = false) { - - $dom = new DOMDocument('1.0','utf-8'); - //$dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($fileProperties as $entry) { - - $href = $entry['href']; - unset($entry['href']); - - if ($strip404s && isset($entry[404])) { - unset($entry[404]); - } - - $response = new Sabre_DAV_Property_Response($href,$entry); - $response->serialize($this,$multiStatus); - - } - - return $dom->saveXML(); - - } - - /** - * This method parses a PropPatch request - * - * PropPatch changes the properties for a resource. This method - * returns a list of properties. - * - * The keys in the returned array contain the property name (e.g.: {DAV:}displayname, - * and the value contains the property value. If a property is to be removed the value - * will be null. - * - * @param string $body xml body - * @return array list of properties in need of updating or deletion - */ - public function parsePropPatchRequest($body) { - - //We'll need to change the DAV namespace declaration to something else in order to make it parsable - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $newProperties = array(); - - foreach($dom->firstChild->childNodes as $child) { - - if ($child->nodeType !== XML_ELEMENT_NODE) continue; - - $operation = Sabre_DAV_XMLUtil::toClarkNotation($child); - - if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue; - - $innerProperties = Sabre_DAV_XMLUtil::parseProperties($child, $this->propertyMap); - - foreach($innerProperties as $propertyName=>$propertyValue) { - - if ($operation==='{DAV:}remove') { - $propertyValue = null; - } - - $newProperties[$propertyName] = $propertyValue; - - } - - } - - return $newProperties; - - } - - /** - * This method parses the PROPFIND request and returns its information - * - * This will either be a list of properties, or an empty array; in which case - * an {DAV:}allprop was requested. - * - * @param string $body - * @return array - */ - public function parsePropFindRequest($body) { - - // If the propfind body was empty, it means IE is requesting 'all' properties - if (!$body) return array(); - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - $elem = $dom->getElementsByTagNameNS('DAV:','propfind')->item(0); - return array_keys(Sabre_DAV_XMLUtil::parseProperties($elem)); - - } - - // }}} - -} - diff --git a/3rdparty/Sabre/DAV/ServerPlugin.php b/3rdparty/Sabre/DAV/ServerPlugin.php deleted file mode 100644 index 120569ffcc..0000000000 --- a/3rdparty/Sabre/DAV/ServerPlugin.php +++ /dev/null @@ -1,90 +0,0 @@ -name = $name; - foreach($children as $child) { - - if (!($child instanceof Sabre_DAV_INode)) throw new Sabre_DAV_Exception('Only instances of Sabre_DAV_INode are allowed to be passed in the children argument'); - $this->addChild($child); - - } - - } - - /** - * Adds a new childnode to this collection - * - * @param Sabre_DAV_INode $child - * @return void - */ - public function addChild(Sabre_DAV_INode $child) { - - $this->children[$child->getName()] = $child; - - } - - /** - * Returns the name of the collection - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns a child object, by its name. - * - * This method makes use of the getChildren method to grab all the child nodes, and compares the name. - * Generally its wise to override this, as this can usually be optimized - * - * This method must throw Sabre_DAV_Exception_NotFound if the node does not - * exist. - * - * @param string $name - * @throws Sabre_DAV_Exception_NotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - if (isset($this->children[$name])) return $this->children[$name]; - throw new Sabre_DAV_Exception_NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\''); - - } - - /** - * Returns a list of children for this collection - * - * @return array - */ - public function getChildren() { - - return array_values($this->children); - - } - - -} - diff --git a/3rdparty/Sabre/DAV/SimpleFile.php b/3rdparty/Sabre/DAV/SimpleFile.php deleted file mode 100644 index 58330d6861..0000000000 --- a/3rdparty/Sabre/DAV/SimpleFile.php +++ /dev/null @@ -1,121 +0,0 @@ -name = $name; - $this->contents = $contents; - $this->mimeType = $mimeType; - - } - - /** - * Returns the node name for this file. - * - * This name is used to construct the url. - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns the data - * - * This method may either return a string or a readable stream resource - * - * @return mixed - */ - public function get() { - - return $this->contents; - - } - - /** - * Returns the size of the file, in bytes. - * - * @return int - */ - public function getSize() { - - return strlen($this->contents); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * @return string - */ - public function getETag() { - - return '"' . md5($this->contents) . '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * @return string - */ - public function getContentType() { - - return $this->mimeType; - - } - -} diff --git a/3rdparty/Sabre/DAV/StringUtil.php b/3rdparty/Sabre/DAV/StringUtil.php deleted file mode 100644 index b126a94c82..0000000000 --- a/3rdparty/Sabre/DAV/StringUtil.php +++ /dev/null @@ -1,91 +0,0 @@ -dataDir = $dataDir; - - } - - /** - * Initialize the plugin - * - * This is called automatically be the Server class after this plugin is - * added with Sabre_DAV_Server::addPlugin() - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod')); - $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile')); - - } - - /** - * This method is called before any HTTP method handler - * - * This method intercepts any GET, DELETE, PUT and PROPFIND calls to - * filenames that are known to match the 'temporary file' regex. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if (!$tempLocation = $this->isTempFile($uri)) - return true; - - switch($method) { - case 'GET' : - return $this->httpGet($tempLocation); - case 'PUT' : - return $this->httpPut($tempLocation); - case 'PROPFIND' : - return $this->httpPropfind($tempLocation, $uri); - case 'DELETE' : - return $this->httpDelete($tempLocation); - } - return true; - - } - - /** - * This method is invoked if some subsystem creates a new file. - * - * This is used to deal with HTTP LOCK requests which create a new - * file. - * - * @param string $uri - * @param resource $data - * @return bool - */ - public function beforeCreateFile($uri,$data) { - - if ($tempPath = $this->isTempFile($uri)) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - file_put_contents($tempPath,$data); - return false; - } - return true; - - } - - /** - * This method will check if the url matches the temporary file pattern - * if it does, it will return an path based on $this->dataDir for the - * temporary file storage. - * - * @param string $path - * @return boolean|string - */ - protected function isTempFile($path) { - - // We're only interested in the basename. - list(, $tempPath) = Sabre_DAV_URLUtil::splitPath($path); - - foreach($this->temporaryFilePatterns as $tempFile) { - - if (preg_match($tempFile,$tempPath)) { - return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile'; - } - - } - - return false; - - } - - - /** - * This method handles the GET method for temporary files. - * If the file doesn't exist, it will return false which will kick in - * the regular system for the GET method. - * - * @param string $tempLocation - * @return bool - */ - public function httpGet($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('Content-Type','application/octet-stream'); - $hR->setHeader('Content-Length',filesize($tempLocation)); - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(200); - $hR->sendBody(fopen($tempLocation,'r')); - return false; - - } - - /** - * This method handles the PUT method. - * - * @param string $tempLocation - * @return bool - */ - public function httpPut($tempLocation) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - - $newFile = !file_exists($tempLocation); - - if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) { - throw new Sabre_DAV_Exception_PreconditionFailed('The resource already exists, and an If-None-Match header was supplied'); - } - - file_put_contents($tempLocation,$this->server->httpRequest->getBody()); - $hR->sendStatus($newFile?201:200); - return false; - - } - - /** - * This method handles the DELETE method. - * - * If the file didn't exist, it will return false, which will make the - * standard HTTP DELETE handler kick in. - * - * @param string $tempLocation - * @return bool - */ - public function httpDelete($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - unlink($tempLocation); - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(204); - return false; - - } - - /** - * This method handles the PROPFIND method. - * - * It's a very lazy method, it won't bother checking the request body - * for which properties were requested, and just sends back a default - * set of properties. - * - * @param string $tempLocation - * @param string $uri - * @return bool - */ - public function httpPropfind($tempLocation, $uri) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(207); - $hR->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true)); - - $properties = array( - 'href' => $uri, - 200 => array( - '{DAV:}getlastmodified' => new Sabre_DAV_Property_GetLastModified(filemtime($tempLocation)), - '{DAV:}getcontentlength' => filesize($tempLocation), - '{DAV:}resourcetype' => new Sabre_DAV_Property_ResourceType(null), - '{'.Sabre_DAV_Server::NS_SABREDAV.'}tempFile' => true, - - ), - ); - - $data = $this->server->generateMultiStatus(array($properties)); - $hR->sendBody($data); - return false; - - } - - - /** - * This method returns the directory where the temporary files should be stored. - * - * @return string - */ - protected function getDataDir() - { - return $this->dataDir; - } -} diff --git a/3rdparty/Sabre/DAV/Tree.php b/3rdparty/Sabre/DAV/Tree.php deleted file mode 100644 index 5021639415..0000000000 --- a/3rdparty/Sabre/DAV/Tree.php +++ /dev/null @@ -1,193 +0,0 @@ -getNodeForPath($path); - return true; - - } catch (Sabre_DAV_Exception_NotFound $e) { - - return false; - - } - - } - - /** - * Copies a file from path to another - * - * @param string $sourcePath The source location - * @param string $destinationPath The full destination path - * @return void - */ - public function copy($sourcePath, $destinationPath) { - - $sourceNode = $this->getNodeForPath($sourcePath); - - // grab the dirname and basename components - list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath); - - $destinationParent = $this->getNodeForPath($destinationDir); - $this->copyNode($sourceNode,$destinationParent,$destinationName); - - $this->markDirty($destinationDir); - - } - - /** - * Moves a file from one location to another - * - * @param string $sourcePath The path to the file which should be moved - * @param string $destinationPath The full destination path, so not just the destination parent node - * @return int - */ - public function move($sourcePath, $destinationPath) { - - list($sourceDir, $sourceName) = Sabre_DAV_URLUtil::splitPath($sourcePath); - list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath); - - if ($sourceDir===$destinationDir) { - $renameable = $this->getNodeForPath($sourcePath); - $renameable->setName($destinationName); - } else { - $this->copy($sourcePath,$destinationPath); - $this->getNodeForPath($sourcePath)->delete(); - } - $this->markDirty($sourceDir); - $this->markDirty($destinationDir); - - } - - /** - * Deletes a node from the tree - * - * @param string $path - * @return void - */ - public function delete($path) { - - $node = $this->getNodeForPath($path); - $node->delete(); - - list($parent) = Sabre_DAV_URLUtil::splitPath($path); - $this->markDirty($parent); - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - return $node->getChildren(); - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - - } - - /** - * copyNode - * - * @param Sabre_DAV_INode $source - * @param Sabre_DAV_ICollection $destinationParent - * @param string $destinationName - * @return void - */ - protected function copyNode(Sabre_DAV_INode $source,Sabre_DAV_ICollection $destinationParent,$destinationName = null) { - - if (!$destinationName) $destinationName = $source->getName(); - - if ($source instanceof Sabre_DAV_IFile) { - - $data = $source->get(); - - // If the body was a string, we need to convert it to a stream - if (is_string($data)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$data); - rewind($stream); - $data = $stream; - } - $destinationParent->createFile($destinationName,$data); - $destination = $destinationParent->getChild($destinationName); - - } elseif ($source instanceof Sabre_DAV_ICollection) { - - $destinationParent->createDirectory($destinationName); - - $destination = $destinationParent->getChild($destinationName); - foreach($source->getChildren() as $child) { - - $this->copyNode($child,$destination); - - } - - } - if ($source instanceof Sabre_DAV_IProperties && $destination instanceof Sabre_DAV_IProperties) { - - $props = $source->getProperties(array()); - $destination->updateProperties($props); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Tree/Filesystem.php b/3rdparty/Sabre/DAV/Tree/Filesystem.php deleted file mode 100644 index 40580ae366..0000000000 --- a/3rdparty/Sabre/DAV/Tree/Filesystem.php +++ /dev/null @@ -1,123 +0,0 @@ -basePath = $basePath; - - } - - /** - * Returns a new node for the given path - * - * @param string $path - * @return Sabre_DAV_FS_Node - */ - public function getNodeForPath($path) { - - $realPath = $this->getRealPath($path); - if (!file_exists($realPath)) throw new Sabre_DAV_Exception_NotFound('File at location ' . $realPath . ' not found'); - if (is_dir($realPath)) { - return new Sabre_DAV_FS_Directory($realPath); - } else { - return new Sabre_DAV_FS_File($realPath); - } - - } - - /** - * Returns the real filesystem path for a webdav url. - * - * @param string $publicPath - * @return string - */ - protected function getRealPath($publicPath) { - - return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/'); - - } - - /** - * Copies a file or directory. - * - * This method must work recursively and delete the destination - * if it exists - * - * @param string $source - * @param string $destination - * @return void - */ - public function copy($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - $this->realCopy($source,$destination); - - } - - /** - * Used by self::copy - * - * @param string $source - * @param string $destination - * @return void - */ - protected function realCopy($source,$destination) { - - if (is_file($source)) { - copy($source,$destination); - } else { - mkdir($destination); - foreach(scandir($source) as $subnode) { - - if ($subnode=='.' || $subnode=='..') continue; - $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode); - - } - } - - } - - /** - * Moves a file or directory recursively. - * - * If the destination exists, delete it first. - * - * @param string $source - * @param string $destination - * @return void - */ - public function move($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - rename($source,$destination); - - } - -} - diff --git a/3rdparty/Sabre/DAV/URLUtil.php b/3rdparty/Sabre/DAV/URLUtil.php deleted file mode 100644 index 794665a44f..0000000000 --- a/3rdparty/Sabre/DAV/URLUtil.php +++ /dev/null @@ -1,121 +0,0 @@ - - * will be returned as: - * {http://www.example.org}myelem - * - * This format is used throughout the SabreDAV sourcecode. - * - * This function will return null if a nodetype other than an Element is passed. - * - * @param DOMNode $dom - * @return string - */ - static function toClarkNotation(DOMNode $dom) { - - if ($dom->nodeType !== XML_ELEMENT_NODE) return null; - - $ns = $dom->namespaceURI; - - // Mapping to clark notation - return '{' . $ns . '}' . $dom->localName; - - } - - /** - * Parses a clark-notation string, and returns the namespace and element - * name components. - * - * If the string was invalid, it will throw an InvalidArgumentException. - * - * @param string $str - * @throws InvalidArgumentException - * @return array - */ - static function parseClarkNotation($str) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) { - throw new InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string'); - } - - return array( - $matches[1], - $matches[2] - ); - - } - - /** - * This method provides a generic way to load a DOMDocument for WebDAV use. - * - * This method throws a Sabre_DAV_Exception_BadRequest exception for any xml errors. - * It does not preserve whitespace. - * - * @param string $xml - * @throws Sabre_DAV_Exception_BadRequest - * @return DOMDocument - */ - static function loadDOMDocument($xml) { - - if (empty($xml)) - throw new Sabre_DAV_Exception_BadRequest('Empty XML document sent'); - - // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower) - // does not support this, so we must intercept this and convert to UTF-8. - if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") { - - // Note: the preceeding byte sequence is "]*)encoding="UTF-16"([^>]*)>|u','',$xml); - - } - - // Retaining old error setting - $oldErrorSetting = libxml_use_internal_errors(true); - - // Clearing any previous errors - libxml_clear_errors(); - - $dom = new DOMDocument(); - - // We don't generally care about any whitespace - $dom->preserveWhiteSpace = false; - - $dom->loadXML($xml,LIBXML_NOWARNING | LIBXML_NOERROR); - - if ($error = libxml_get_last_error()) { - libxml_clear_errors(); - throw new Sabre_DAV_Exception_BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')'); - } - - // Restoring old mechanism for error handling - if ($oldErrorSetting===false) libxml_use_internal_errors(false); - - return $dom; - - } - - /** - * Parses all WebDAV properties out of a DOM Element - * - * Generally WebDAV properties are enclosed in {DAV:}prop elements. This - * method helps by going through all these and pulling out the actual - * propertynames, making them array keys and making the property values, - * well.. the array values. - * - * If no value was given (self-closing element) null will be used as the - * value. This is used in for example PROPFIND requests. - * - * Complex values are supported through the propertyMap argument. The - * propertyMap should have the clark-notation properties as it's keys, and - * classnames as values. - * - * When any of these properties are found, the unserialize() method will be - * (statically) called. The result of this method is used as the value. - * - * @param DOMElement $parentNode - * @param array $propertyMap - * @return array - */ - static function parseProperties(DOMElement $parentNode, array $propertyMap = array()) { - - $propList = array(); - foreach($parentNode->childNodes as $propNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($propNode)!=='{DAV:}prop') continue; - - foreach($propNode->childNodes as $propNodeData) { - - /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */ - if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue; - - $propertyName = Sabre_DAV_XMLUtil::toClarkNotation($propNodeData); - if (isset($propertyMap[$propertyName])) { - $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData); - } else { - $propList[$propertyName] = $propNodeData->textContent; - } - } - - - } - return $propList; - - } - -} diff --git a/3rdparty/Sabre/DAV/includes.php b/3rdparty/Sabre/DAV/includes.php deleted file mode 100644 index 6728f88ce7..0000000000 --- a/3rdparty/Sabre/DAV/includes.php +++ /dev/null @@ -1,98 +0,0 @@ -principalPrefix = $principalPrefix; - $this->principalBackend = $principalBackend; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principalInfo - * @return Sabre_DAVACL_IPrincipal - */ - abstract function getChildForPrincipal(array $principalInfo); - - /** - * Returns the name of this collection. - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalPrefix); - return $name; - - } - - /** - * Return the list of users - * - * @return array - */ - public function getChildren() { - - if ($this->disableListing) - throw new Sabre_DAV_Exception_MethodNotAllowed('Listing members of this collection is disabled'); - - $children = array(); - foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) { - - $children[] = $this->getChildForPrincipal($principalInfo); - - - } - return $children; - - } - - /** - * Returns a child object, by its name. - * - * @param string $name - * @throws Sabre_DAV_Exception_NotFound - * @return Sabre_DAVACL_IPrincipal - */ - public function getChild($name) { - - $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name); - if (!$principalInfo) throw new Sabre_DAV_Exception_NotFound('Principal with name ' . $name . ' not found'); - return $this->getChildForPrincipal($principalInfo); - - } - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return a list of 'child names', which may be - * used to call $this->getChild in the future. - * - * @param array $searchProperties - * @return array - */ - public function searchPrincipals(array $searchProperties) { - - $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties); - $r = array(); - - foreach($result as $row) { - list(, $r[]) = Sabre_DAV_URLUtil::splitPath($row); - } - - return $r; - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php b/3rdparty/Sabre/DAVACL/Exception/AceConflict.php deleted file mode 100644 index 4b9f93b003..0000000000 --- a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-ace-conflict'); - $errorNode->appendChild($np); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php b/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php deleted file mode 100644 index 9b055dd970..0000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php +++ /dev/null @@ -1,81 +0,0 @@ -uri = $uri; - $this->privileges = $privileges; - - parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"'); - - } - - /** - * Adds in extra information in the xml response. - * - * This method adds the {DAV:}need-privileges element as defined in rfc3744 - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - $doc = $errorNode->ownerDocument; - - $np = $doc->createElementNS('DAV:','d:need-privileges'); - $errorNode->appendChild($np); - - foreach($this->privileges as $privilege) { - - $resource = $doc->createElementNS('DAV:','d:resource'); - $np->appendChild($resource); - - $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri)); - - $priv = $doc->createElementNS('DAV:','d:privilege'); - $resource->appendChild($priv); - - preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts); - $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2])); - - - } - - } - -} - diff --git a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php b/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php deleted file mode 100644 index f44e3e3228..0000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-abstract'); - $errorNode->appendChild($np); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php deleted file mode 100644 index 8d1e38ca1b..0000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:recognized-principal'); - $errorNode->appendChild($np); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php deleted file mode 100644 index 3b5d012d7f..0000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:not-supported-privilege'); - $errorNode->appendChild($np); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/IACL.php b/3rdparty/Sabre/DAVACL/IACL.php deleted file mode 100644 index 356bb481d5..0000000000 --- a/3rdparty/Sabre/DAVACL/IACL.php +++ /dev/null @@ -1,73 +0,0 @@ - array( - * '{DAV:}prop1' => null, - * ), - * 201 => array( - * '{DAV:}prop2' => null, - * ), - * 403 => array( - * '{DAV:}prop3' => null, - * ), - * 424 => array( - * '{DAV:}prop4' => null, - * ), - * ); - * - * In this previous example prop1 was successfully updated or deleted, and - * prop2 was succesfully created. - * - * prop3 failed to update due to '403 Forbidden' and because of this prop4 - * also could not be updated with '424 Failed dependency'. - * - * This last example was actually incorrect. While 200 and 201 could appear - * in 1 response, if there's any error (403) the other properties should - * always fail with 423 (failed dependency). - * - * But anyway, if you don't want to scratch your head over this, just - * return true or false. - * - * @param string $path - * @param array $mutations - * @return array|bool - */ - function updatePrincipal($path, $mutations); - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return an array with full principal uri's. - * - * If somebody attempted to search on a property the backend does not - * support, you should simply return 0 results. - * - * You can also just return 0 results if you choose to not support - * searching at all, but keep in mind that this may stop certain features - * from working. - * - * @param string $prefixPath - * @param array $searchProperties - * @return array - */ - function searchPrincipals($prefixPath, array $searchProperties); - - /** - * Returns the list of members for a group-principal - * - * @param string $principal - * @return array - */ - function getGroupMemberSet($principal); - - /** - * Returns the list of groups a principal is a member of - * - * @param string $principal - * @return array - */ - function getGroupMembership($principal); - - /** - * Updates the list of group members for a group principal. - * - * The principals should be passed as a list of uri's. - * - * @param string $principal - * @param array $members - * @return void - */ - function setGroupMemberSet($principal, array $members); - -} diff --git a/3rdparty/Sabre/DAVACL/Plugin.php b/3rdparty/Sabre/DAVACL/Plugin.php deleted file mode 100644 index 5b17c83847..0000000000 --- a/3rdparty/Sabre/DAVACL/Plugin.php +++ /dev/null @@ -1,1382 +0,0 @@ - 'Display name', - '{http://sabredav.org/ns}email-address' => 'Email address', - ); - - /** - * Any principal uri's added here, will automatically be added to the list - * of ACL's. They will effectively receive {DAV:}all privileges, as a - * protected privilege. - * - * @var array - */ - public $adminPrincipals = array(); - - /** - * Returns a list of features added by this plugin. - * - * This list is used in the response of a HTTP OPTIONS request. - * - * @return array - */ - public function getFeatures() { - - return array('access-control'); - - } - - /** - * Returns a list of available methods for a given url - * - * @param string $uri - * @return array - */ - public function getMethods($uri) { - - return array('ACL'); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'acl'; - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - return array( - '{DAV:}expand-property', - '{DAV:}principal-property-search', - '{DAV:}principal-search-property-set', - ); - - } - - - /** - * Checks if the current user has the specified privilege(s). - * - * You can specify a single privilege, or a list of privileges. - * This method will throw an exception if the privilege is not available - * and return true otherwise. - * - * @param string $uri - * @param array|string $privileges - * @param int $recursion - * @param bool $throwExceptions if set to false, this method won't through exceptions. - * @throws Sabre_DAVACL_Exception_NeedPrivileges - * @return bool - */ - public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) { - - if (!is_array($privileges)) $privileges = array($privileges); - - $acl = $this->getCurrentUserPrivilegeSet($uri); - - if (is_null($acl)) { - if ($this->allowAccessToNodesWithoutACL) { - return true; - } else { - if ($throwExceptions) - throw new Sabre_DAVACL_Exception_NeedPrivileges($uri,$privileges); - else - return false; - - } - } - - $failed = array(); - foreach($privileges as $priv) { - - if (!in_array($priv, $acl)) { - $failed[] = $priv; - } - - } - - if ($failed) { - if ($throwExceptions) - throw new Sabre_DAVACL_Exception_NeedPrivileges($uri,$failed); - else - return false; - } - return true; - - } - - /** - * Returns the standard users' principal. - * - * This is one authorative principal url for the current user. - * This method will return null if the user wasn't logged in. - * - * @return string|null - */ - public function getCurrentUserPrincipal() { - - $authPlugin = $this->server->getPlugin('auth'); - if (is_null($authPlugin)) return null; - /** @var $authPlugin Sabre_DAV_Auth_Plugin */ - - $userName = $authPlugin->getCurrentUser(); - if (!$userName) return null; - - return $this->defaultUsernamePath . '/' . $userName; - - } - - /** - * This array holds a cache for all the principals that are associated with - * a single principal. - * - * @var array - */ - protected $currentUserPrincipalsCache = array(); - - /** - * Returns a list of principals that's associated to the current - * user, either directly or through group membership. - * - * @return array - */ - public function getCurrentUserPrincipals() { - - $currentUser = $this->getCurrentUserPrincipal(); - - if (is_null($currentUser)) return array(); - - // First check our cache - if (isset($this->currentUserPrincipalsCache[$currentUser])) { - return $this->currentUserPrincipalsCache[$currentUser]; - } - - $check = array($currentUser); - $principals = array($currentUser); - - while(count($check)) { - - $principal = array_shift($check); - - $node = $this->server->tree->getNodeForPath($principal); - if ($node instanceof Sabre_DAVACL_IPrincipal) { - foreach($node->getGroupMembership() as $groupMember) { - - if (!in_array($groupMember, $principals)) { - - $check[] = $groupMember; - $principals[] = $groupMember; - - } - - } - - } - - } - - // Store the result in the cache - $this->currentUserPrincipalsCache[$currentUser] = $principals; - - return $principals; - - } - - /** - * Returns the supported privilege structure for this ACL plugin. - * - * See RFC3744 for more details. Currently we default on a simple, - * standard structure. - * - * You can either get the list of privileges by a uri (path) or by - * specifying a Node. - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - public function getSupportedPrivilegeSet($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - - if ($node instanceof Sabre_DAVACL_IACL) { - $result = $node->getSupportedPrivilegeSet(); - - if ($result) - return $result; - } - - return self::getDefaultSupportedPrivilegeSet(); - - } - - /** - * Returns a fairly standard set of privileges, which may be useful for - * other systems to use as a basis. - * - * @return array - */ - static function getDefaultSupportedPrivilegeSet() { - - return array( - 'privilege' => '{DAV:}all', - 'abstract' => true, - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}read-current-user-privilege-set', - 'abstract' => true, - ), - ), - ), // {DAV:}read - array( - 'privilege' => '{DAV:}write', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}write-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-properties', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-content', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}bind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unbind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unlock', - 'abstract' => true, - ), - ), - ), // {DAV:}write - ), - ); // {DAV:}all - - } - - /** - * Returns the supported privilege set as a flat list - * - * This is much easier to parse. - * - * The returned list will be index by privilege name. - * The value is a struct containing the following properties: - * - aggregates - * - abstract - * - concrete - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - final public function getFlatPrivilegeSet($node) { - - $privs = $this->getSupportedPrivilegeSet($node); - - $flat = array(); - $this->getFPSTraverse($privs, null, $flat); - - return $flat; - - } - - /** - * Traverses the privilege set tree for reordering - * - * This function is solely used by getFlatPrivilegeSet, and would have been - * a closure if it wasn't for the fact I need to support PHP 5.2. - * - * @param array $priv - * @param $concrete - * @param array $flat - * @return void - */ - final private function getFPSTraverse($priv, $concrete, &$flat) { - - $myPriv = array( - 'privilege' => $priv['privilege'], - 'abstract' => isset($priv['abstract']) && $priv['abstract'], - 'aggregates' => array(), - 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'], - ); - - if (isset($priv['aggregates'])) - foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege']; - - $flat[$priv['privilege']] = $myPriv; - - if (isset($priv['aggregates'])) { - - foreach($priv['aggregates'] as $subPriv) { - - $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat); - - } - - } - - } - - /** - * Returns the full ACL list. - * - * Either a uri or a Sabre_DAV_INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - public function getACL($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - if (!$node instanceof Sabre_DAVACL_IACL) { - return null; - } - $acl = $node->getACL(); - foreach($this->adminPrincipals as $adminPrincipal) { - $acl[] = array( - 'principal' => $adminPrincipal, - 'privilege' => '{DAV:}all', - 'protected' => true, - ); - } - return $acl; - - } - - /** - * Returns a list of privileges the current user has - * on a particular node. - * - * Either a uri or a Sabre_DAV_INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - public function getCurrentUserPrivilegeSet($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - - $acl = $this->getACL($node); - - if (is_null($acl)) return null; - - $principals = $this->getCurrentUserPrincipals(); - - $collected = array(); - - foreach($acl as $ace) { - - $principal = $ace['principal']; - - switch($principal) { - - case '{DAV:}owner' : - $owner = $node->getOwner(); - if ($owner && in_array($owner, $principals)) { - $collected[] = $ace; - } - break; - - - // 'all' matches for every user - case '{DAV:}all' : - - // 'authenticated' matched for every user that's logged in. - // Since it's not possible to use ACL while not being logged - // in, this is also always true. - case '{DAV:}authenticated' : - $collected[] = $ace; - break; - - // 'unauthenticated' can never occur either, so we simply - // ignore these. - case '{DAV:}unauthenticated' : - break; - - default : - if (in_array($ace['principal'], $principals)) { - $collected[] = $ace; - } - break; - - } - - - - } - - // Now we deduct all aggregated privileges. - $flat = $this->getFlatPrivilegeSet($node); - - $collected2 = array(); - while(count($collected)) { - - $current = array_pop($collected); - $collected2[] = $current['privilege']; - - foreach($flat[$current['privilege']]['aggregates'] as $subPriv) { - $collected2[] = $subPriv; - $collected[] = $flat[$subPriv]; - } - - } - - return array_values(array_unique($collected2)); - - } - - /** - * Principal property search - * - * This method can search for principals matching certain values in - * properties. - * - * This method will return a list of properties for the matched properties. - * - * @param array $searchProperties The properties to search on. This is a - * key-value list. The keys are property - * names, and the values the strings to - * match them on. - * @param array $requestedProperties This is the list of properties to - * return for every match. - * @param string $collectionUri The principal collection to search on. - * If this is ommitted, the standard - * principal collection-set will be used. - * @return array This method returns an array structure similar to - * Sabre_DAV_Server::getPropertiesForPath. Returned - * properties are index by a HTTP status code. - * - */ - public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) { - - if (!is_null($collectionUri)) { - $uris = array($collectionUri); - } else { - $uris = $this->principalCollectionSet; - } - - $lookupResults = array(); - foreach($uris as $uri) { - - $principalCollection = $this->server->tree->getNodeForPath($uri); - if (!$principalCollection instanceof Sabre_DAVACL_AbstractPrincipalCollection) { - // Not a principal collection, we're simply going to ignore - // this. - continue; - } - - $results = $principalCollection->searchPrincipals($searchProperties); - foreach($results as $result) { - $lookupResults[] = rtrim($uri,'/') . '/' . $result; - } - - } - - $matches = array(); - - foreach($lookupResults as $lookupResult) { - - list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0); - - } - - return $matches; - - } - - /** - * Sets up the plugin - * - * This method is automatically called by the server class. - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - - $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20); - $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20); - $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20); - $server->subscribeEvent('updateProperties',array($this,'updateProperties')); - $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod')); - - array_push($server->protectedProperties, - '{DAV:}alternate-URI-set', - '{DAV:}principal-URL', - '{DAV:}group-membership', - '{DAV:}principal-collection-set', - '{DAV:}current-user-principal', - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - '{DAV:}owner', - '{DAV:}group' - ); - - // Automatically mapping nodes implementing IPrincipal to the - // {DAV:}principal resourcetype. - $server->resourceTypeMapping['Sabre_DAVACL_IPrincipal'] = '{DAV:}principal'; - - // Mapping the group-member-set property to the HrefList property - // class. - $server->propertyMap['{DAV:}group-member-set'] = 'Sabre_DAV_Property_HrefList'; - - } - - - /* {{{ Event handlers */ - - /** - * Triggered before any method is handled - * - * @param string $method - * @param string $uri - * @return void - */ - public function beforeMethod($method, $uri) { - - $exists = $this->server->tree->nodeExists($uri); - - // If the node doesn't exists, none of these checks apply - if (!$exists) return; - - switch($method) { - - case 'GET' : - case 'HEAD' : - case 'OPTIONS' : - // For these 3 we only need to know if the node is readable. - $this->checkPrivileges($uri,'{DAV:}read'); - break; - - case 'PUT' : - case 'LOCK' : - case 'UNLOCK' : - // This method requires the write-content priv if the node - // already exists, and bind on the parent if the node is being - // created. - // The bind privilege is handled in the beforeBind event. - $this->checkPrivileges($uri,'{DAV:}write-content'); - break; - - - case 'PROPPATCH' : - $this->checkPrivileges($uri,'{DAV:}write-properties'); - break; - - case 'ACL' : - $this->checkPrivileges($uri,'{DAV:}write-acl'); - break; - - case 'COPY' : - case 'MOVE' : - // Copy requires read privileges on the entire source tree. - // If the target exists write-content normally needs to be - // checked, however, we're deleting the node beforehand and - // creating a new one after, so this is handled by the - // beforeUnbind event. - // - // The creation of the new node is handled by the beforeBind - // event. - // - // If MOVE is used beforeUnbind will also be used to check if - // the sourcenode can be deleted. - $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE); - - break; - - } - - } - - /** - * Triggered before a new node is created. - * - * This allows us to check permissions for any operation that creates a - * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE. - * - * @param string $uri - * @return void - */ - public function beforeBind($uri) { - - list($parentUri,$nodeName) = Sabre_DAV_URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}bind'); - - } - - /** - * Triggered before a node is deleted - * - * This allows us to check permissions for any operation that will delete - * an existing node. - * - * @param string $uri - * @return void - */ - public function beforeUnbind($uri) { - - list($parentUri,$nodeName) = Sabre_DAV_URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS); - - } - - /** - * Triggered before a node is unlocked. - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lock - * @TODO: not yet implemented - * @return void - */ - public function beforeUnlock($uri, Sabre_DAV_Locks_LockInfo $lock) { - - - } - - /** - * Triggered before properties are looked up in specific nodes. - * - * @param string $uri - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @TODO really should be broken into multiple methods, or even a class. - * @return bool - */ - public function beforeGetProperties($uri, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { - - // Checking the read permission - if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) { - - // User is not allowed to read properties - if ($this->hideNodesFromListings) { - return false; - } - - // Marking all requested properties as '403'. - foreach($requestedProperties as $key=>$requestedProperty) { - unset($requestedProperties[$key]); - $returnedProperties[403][$requestedProperty] = null; - } - return; - - } - - /* Adding principal properties */ - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}alternate-URI-set'] = new Sabre_DAV_Property_HrefList($node->getAlternateUriSet()); - - } - if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}principal-URL'] = new Sabre_DAV_Property_Href($node->getPrincipalUrl() . '/'); - - } - if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-member-set'] = new Sabre_DAV_Property_HrefList($node->getGroupMemberSet()); - - } - if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-membership'] = new Sabre_DAV_Property_HrefList($node->getGroupMembership()); - - } - - if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) { - - $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName(); - - } - - } - if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $val = $this->principalCollectionSet; - // Ensuring all collections end with a slash - foreach($val as $k=>$v) $val[$k] = $v . '/'; - $returnedProperties[200]['{DAV:}principal-collection-set'] = new Sabre_DAV_Property_HrefList($val); - - } - if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) { - - unset($requestedProperties[$index]); - if ($url = $this->getCurrentUserPrincipal()) { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF, $url . '/'); - } else { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::UNAUTHENTICATED); - } - - } - if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Sabre_DAVACL_Property_SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node)); - - } - if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) { - $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null; - unset($requestedProperties[$index]); - } else { - $val = $this->getCurrentUserPrivilegeSet($node); - if (!is_null($val)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Sabre_DAVACL_Property_CurrentUserPrivilegeSet($val); - } - } - - } - - /* The ACL property contains all the permissions */ - if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) { - - unset($requestedProperties[$index]); - $returnedProperties[403]['{DAV:}acl'] = null; - - } else { - - $acl = $this->getACL($node); - if (!is_null($acl)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}acl'] = new Sabre_DAVACL_Property_Acl($this->getACL($node)); - } - - } - - } - - /* The acl-restrictions property contains information on how privileges - * must behave. - */ - if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}acl-restrictions'] = new Sabre_DAVACL_Property_AclRestrictions(); - } - - /* Adding ACL properties */ - if ($node instanceof Sabre_DAVACL_IACL) { - - if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}owner'] = new Sabre_DAV_Property_Href($node->getOwner() . '/'); - - } - - } - - } - - /** - * This method intercepts PROPPATCH methods and make sure the - * group-member-set is updated correctly. - * - * @param array $propertyDelta - * @param array $result - * @param Sabre_DAV_INode $node - * @return bool - */ - public function updateProperties(&$propertyDelta, &$result, Sabre_DAV_INode $node) { - - if (!array_key_exists('{DAV:}group-member-set', $propertyDelta)) - return; - - if (is_null($propertyDelta['{DAV:}group-member-set'])) { - $memberSet = array(); - } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof Sabre_DAV_Property_HrefList) { - $memberSet = $propertyDelta['{DAV:}group-member-set']->getHrefs(); - } else { - throw new Sabre_DAV_Exception('The group-member-set property MUST be an instance of Sabre_DAV_Property_HrefList or null'); - } - - if (!($node instanceof Sabre_DAVACL_IPrincipal)) { - $result[403]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - // Returning false will stop the updateProperties process - return false; - } - - $node->setGroupMemberSet($memberSet); - // We must also clear our cache, just in case - - $this->currentUserPrincipalsCache = array(); - - $result[200]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - } - - /** - * This method handles HTTP REPORT requests - * - * @param string $reportName - * @param DOMNode $dom - * @return bool - */ - public function report($reportName, $dom) { - - switch($reportName) { - - case '{DAV:}principal-property-search' : - $this->principalPropertySearchReport($dom); - return false; - case '{DAV:}principal-search-property-set' : - $this->principalSearchPropertySetReport($dom); - return false; - case '{DAV:}expand-property' : - $this->expandPropertyReport($dom); - return false; - - } - - } - - /** - * This event is triggered for any HTTP method that is not known by the - * webserver. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - if ($method!=='ACL') return; - - $this->httpACL($uri); - return false; - - } - - /** - * This method is responsible for handling the 'ACL' event. - * - * @param string $uri - * @return void - */ - public function httpACL($uri) { - - $body = $this->server->httpRequest->getBody(true); - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $newAcl = - Sabre_DAVACL_Property_Acl::unserialize($dom->firstChild) - ->getPrivileges(); - - // Normalizing urls - foreach($newAcl as $k=>$newAce) { - $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']); - } - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_DAVACL_IACL)) { - throw new Sabre_DAV_Exception_MethodNotAllowed('This node does not support the ACL method'); - } - - $oldAcl = $this->getACL($node); - - $supportedPrivileges = $this->getFlatPrivilegeSet($node); - - /* Checking if protected principals from the existing principal set are - not overwritten. */ - foreach($oldAcl as $oldAce) { - - if (!isset($oldAce['protected']) || !$oldAce['protected']) continue; - - $found = false; - foreach($newAcl as $newAce) { - if ( - $newAce['privilege'] === $oldAce['privilege'] && - $newAce['principal'] === $oldAce['principal'] && - $newAce['protected'] - ) - $found = true; - } - - if (!$found) - throw new Sabre_DAVACL_Exception_AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request'); - - } - - foreach($newAcl as $newAce) { - - // Do we recognize the privilege - if (!isset($supportedPrivileges[$newAce['privilege']])) { - throw new Sabre_DAVACL_Exception_NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server'); - } - - if ($supportedPrivileges[$newAce['privilege']]['abstract']) { - throw new Sabre_DAVACL_Exception_NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege'); - } - - // Looking up the principal - try { - $principal = $this->server->tree->getNodeForPath($newAce['principal']); - } catch (Sabre_DAV_Exception_NotFound $e) { - throw new Sabre_DAVACL_Exception_NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist'); - } - if (!($principal instanceof Sabre_DAVACL_IPrincipal)) { - throw new Sabre_DAVACL_Exception_NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal'); - } - - } - $node->setACL($newAcl); - - } - - /* }}} */ - - /* Reports {{{ */ - - /** - * The expand-property report is defined in RFC3253 section 3-8. - * - * This report is very similar to a standard PROPFIND. The difference is - * that it has the additional ability to look at properties containing a - * {DAV:}href element, follow that property and grab additional elements - * there. - * - * Other rfc's, such as ACL rely on this report, so it made sense to put - * it in this plugin. - * - * @param DOMElement $dom - * @return void - */ - protected function expandPropertyReport($dom) { - - $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild); - $depth = $this->server->getHTTPDepth(0); - $requestUri = $this->server->getRequestUri(); - - $result = $this->expandProperties($requestUri,$requestedProperties,$depth); - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($result as $response) { - $response->serialize($this->server, $multiStatus); - } - - $xml = $dom->saveXML(); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->sendBody($xml); - - } - - /** - * This method is used by expandPropertyReport to parse - * out the entire HTTP request. - * - * @param DOMElement $node - * @return array - */ - protected function parseExpandPropertyReportRequest($node) { - - $requestedProperties = array(); - do { - - if (Sabre_DAV_XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue; - - if ($node->firstChild) { - - $children = $this->parseExpandPropertyReportRequest($node->firstChild); - - } else { - - $children = array(); - - } - - $namespace = $node->getAttribute('namespace'); - if (!$namespace) $namespace = 'DAV:'; - - $propName = '{'.$namespace.'}' . $node->getAttribute('name'); - $requestedProperties[$propName] = $children; - - } while ($node = $node->nextSibling); - - return $requestedProperties; - - } - - /** - * This method expands all the properties and returns - * a list with property values - * - * @param array $path - * @param array $requestedProperties the list of required properties - * @param int $depth - * @return array - */ - protected function expandProperties($path, array $requestedProperties, $depth) { - - $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth); - - $result = array(); - - foreach($foundProperties as $node) { - - foreach($requestedProperties as $propertyName=>$childRequestedProperties) { - - // We're only traversing if sub-properties were requested - if(count($childRequestedProperties)===0) continue; - - // We only have to do the expansion if the property was found - // and it contains an href element. - if (!array_key_exists($propertyName,$node[200])) continue; - - if ($node[200][$propertyName] instanceof Sabre_DAV_Property_IHref) { - $hrefs = array($node[200][$propertyName]->getHref()); - } elseif ($node[200][$propertyName] instanceof Sabre_DAV_Property_HrefList) { - $hrefs = $node[200][$propertyName]->getHrefs(); - } - - $childProps = array(); - foreach($hrefs as $href) { - $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0)); - } - $node[200][$propertyName] = new Sabre_DAV_Property_ResponseList($childProps); - - } - $result[] = new Sabre_DAV_Property_Response($path, $node); - - } - - return $result; - - } - - /** - * principalSearchPropertySetReport - * - * This method responsible for handing the - * {DAV:}principal-search-property-set report. This report returns a list - * of properties the client may search on, using the - * {DAV:}principal-property-search report. - * - * @param DOMDocument $dom - * @return void - */ - protected function principalSearchPropertySetReport(DOMDocument $dom) { - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new Sabre_DAV_Exception_BadRequest('This report is only defined when Depth: 0'); - } - - if ($dom->firstChild->hasChildNodes()) - throw new Sabre_DAV_Exception_BadRequest('The principal-search-property-set report element is not allowed to have child elements'); - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $root = $dom->createElement('d:principal-search-property-set'); - $dom->appendChild($root); - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $root->setAttribute('xmlns:' . $prefix,$namespace); - - } - - $nsList = $this->server->xmlNamespaces; - - foreach($this->principalSearchPropertySet as $propertyName=>$description) { - - $psp = $dom->createElement('d:principal-search-property'); - $root->appendChild($psp); - - $prop = $dom->createElement('d:prop'); - $psp->appendChild($prop); - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]); - $prop->appendChild($currentProperty); - - $descriptionElem = $dom->createElement('d:description'); - $descriptionElem->setAttribute('xml:lang','en'); - $descriptionElem->appendChild($dom->createTextNode($description)); - $psp->appendChild($descriptionElem); - - - } - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - /** - * principalPropertySearchReport - * - * This method is responsible for handing the - * {DAV:}principal-property-search report. This report can be used for - * clients to search for groups of principals, based on the value of one - * or more properties. - * - * @param DOMDocument $dom - * @return void - */ - protected function principalPropertySearchReport(DOMDocument $dom) { - - list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom); - - $uri = null; - if (!$applyToPrincipalCollectionSet) { - $uri = $this->server->getRequestUri(); - } - $result = $this->principalSearch($searchProperties, $requestedProperties, $uri); - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * parsePrincipalPropertySearchReportRequest - * - * This method parses the request body from a - * {DAV:}principal-property-search report. - * - * This method returns an array with two elements: - * 1. an array with properties to search on, and their values - * 2. a list of propertyvalues that should be returned for the request. - * - * @param DOMDocument $dom - * @return array - */ - protected function parsePrincipalPropertySearchReportRequest($dom) { - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new Sabre_DAV_Exception_BadRequest('This report is only defined when Depth: 0'); - } - - $searchProperties = array(); - - $applyToPrincipalCollectionSet = false; - - // Parsing the search request - foreach($dom->firstChild->childNodes as $searchNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') { - $applyToPrincipalCollectionSet = true; - } - - if (Sabre_DAV_XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search') - continue; - - $propertyName = null; - $propertyValue = null; - - foreach($searchNode->childNodes as $childNode) { - - switch(Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { - - case '{DAV:}prop' : - $property = Sabre_DAV_XMLUtil::parseProperties($searchNode); - reset($property); - $propertyName = key($property); - break; - - case '{DAV:}match' : - $propertyValue = $childNode->textContent; - break; - - } - - - } - - if (is_null($propertyName) || is_null($propertyValue)) - throw new Sabre_DAV_Exception_BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue); - - $searchProperties[$propertyName] = $propertyValue; - - } - - return array($searchProperties, array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet); - - } - - - /* }}} */ - -} diff --git a/3rdparty/Sabre/DAVACL/Principal.php b/3rdparty/Sabre/DAVACL/Principal.php deleted file mode 100644 index 51c6658afd..0000000000 --- a/3rdparty/Sabre/DAVACL/Principal.php +++ /dev/null @@ -1,279 +0,0 @@ -principalBackend = $principalBackend; - $this->principalProperties = $principalProperties; - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalProperties['uri']; - - } - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - $uris = array(); - if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) { - - $uris = $this->principalProperties['{DAV:}alternate-URI-set']; - - } - - if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) { - $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address']; - } - - return array_unique($uris); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']); - - } - - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $groupMembers - * @return void - */ - public function setGroupMemberSet(array $groupMembers) { - - $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers); - - } - - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - $uri = $this->principalProperties['uri']; - list(, $name) = Sabre_DAV_URLUtil::splitPath($uri); - return $name; - - } - - /** - * Returns the name of the user - * - * @return string - */ - public function getDisplayName() { - - if (isset($this->principalProperties['{DAV:}displayname'])) { - return $this->principalProperties['{DAV:}displayname']; - } else { - return $this->getName(); - } - - } - - /** - * Returns a list of properties - * - * @param array $requestedProperties - * @return array - */ - public function getProperties($requestedProperties) { - - $newProperties = array(); - foreach($requestedProperties as $propName) { - - if (isset($this->principalProperties[$propName])) { - $newProperties[$propName] = $this->principalProperties[$propName]; - } - - } - - return $newProperties; - - } - - /** - * Updates this principals properties. - * - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateProperties($mutations) { - - return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalProperties['uri']; - - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getPrincipalUrl(), - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Updating ACLs is not allowed here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See Sabre_DAVACL_Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php b/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php deleted file mode 100644 index a76b4a9d72..0000000000 --- a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php +++ /dev/null @@ -1,427 +0,0 @@ - array( - 'dbField' => 'displayname', - ), - - /** - * This property is actually used by the CardDAV plugin, where it gets - * mapped to {http://calendarserver.orgi/ns/}me-card. - * - * The reason we don't straight-up use that property, is because - * me-card is defined as a property on the users' addressbook - * collection. - */ - '{http://sabredav.org/ns}vcard-url' => array( - 'dbField' => 'vcardurl', - ), - /** - * This is the users' primary email-address. - */ - '{http://sabredav.org/ns}email-address' => array( - 'dbField' => 'email', - ), - ); - - /** - * Sets up the backend. - * - * @param PDO $pdo - * @param string $tableName - * @param string $groupMembersTableName - */ - public function __construct(PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') { - - $this->pdo = $pdo; - $this->tableName = $tableName; - $this->groupMembersTableName = $groupMembersTableName; - - } - - - /** - * Returns a list of principals based on a prefix. - * - * This prefix will often contain something like 'principals'. You are only - * expected to return principals that are in this base path. - * - * You are expected to return at least a 'uri' for every user, you can - * return any additional properties if you wish so. Common properties are: - * {DAV:}displayname - * {http://sabredav.org/ns}email-address - This is a custom SabreDAV - * field that's actualy injected in a number of other properties. If - * you have an email address, use this property. - * - * @param string $prefixPath - * @return array - */ - public function getPrincipalsByPrefix($prefixPath) { - - $fields = array( - 'uri', - ); - - foreach($this->fieldMap as $key=>$value) { - $fields[] = $value['dbField']; - } - $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName); - - $principals = array(); - - while($row = $result->fetch(PDO::FETCH_ASSOC)) { - - // Checking if the principal is in the prefix - list($rowPrefix) = Sabre_DAV_URLUtil::splitPath($row['uri']); - if ($rowPrefix !== $prefixPath) continue; - - $principal = array( - 'uri' => $row['uri'], - ); - foreach($this->fieldMap as $key=>$value) { - if ($row[$value['dbField']]) { - $principal[$key] = $row[$value['dbField']]; - } - } - $principals[] = $principal; - - } - - return $principals; - - } - - /** - * Returns a specific principal, specified by it's path. - * The returned structure should be the exact same as from - * getPrincipalsByPrefix. - * - * @param string $path - * @return array - */ - public function getPrincipalByPath($path) { - - $fields = array( - 'id', - 'uri', - ); - - foreach($this->fieldMap as $key=>$value) { - $fields[] = $value['dbField']; - } - $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?'); - $stmt->execute(array($path)); - - $row = $stmt->fetch(PDO::FETCH_ASSOC); - if (!$row) return; - - $principal = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - ); - foreach($this->fieldMap as $key=>$value) { - if ($row[$value['dbField']]) { - $principal[$key] = $row[$value['dbField']]; - } - } - return $principal; - - } - - /** - * Updates one ore more webdav properties on a principal. - * - * The list of mutations is supplied as an array. Each key in the array is - * a propertyname, such as {DAV:}displayname. - * - * Each value is the actual value to be updated. If a value is null, it - * must be deleted. - * - * This method should be atomic. It must either completely succeed, or - * completely fail. Success and failure can simply be returned as 'true' or - * 'false'. - * - * It is also possible to return detailed failure information. In that case - * an array such as this should be returned: - * - * array( - * 200 => array( - * '{DAV:}prop1' => null, - * ), - * 201 => array( - * '{DAV:}prop2' => null, - * ), - * 403 => array( - * '{DAV:}prop3' => null, - * ), - * 424 => array( - * '{DAV:}prop4' => null, - * ), - * ); - * - * In this previous example prop1 was successfully updated or deleted, and - * prop2 was succesfully created. - * - * prop3 failed to update due to '403 Forbidden' and because of this prop4 - * also could not be updated with '424 Failed dependency'. - * - * This last example was actually incorrect. While 200 and 201 could appear - * in 1 response, if there's any error (403) the other properties should - * always fail with 423 (failed dependency). - * - * But anyway, if you don't want to scratch your head over this, just - * return true or false. - * - * @param string $path - * @param array $mutations - * @return array|bool - */ - public function updatePrincipal($path, $mutations) { - - $updateAble = array(); - foreach($mutations as $key=>$value) { - - // We are not aware of this field, we must fail. - if (!isset($this->fieldMap[$key])) { - - $response = array( - 403 => array( - $key => null, - ), - 424 => array(), - ); - - // Adding the rest to the response as a 424 - foreach($mutations as $subKey=>$subValue) { - if ($subKey !== $key) { - $response[424][$subKey] = null; - } - } - return $response; - } - - $updateAble[$this->fieldMap[$key]['dbField']] = $value; - - } - - // No fields to update - $query = "UPDATE " . $this->tableName . " SET "; - - $first = true; - foreach($updateAble as $key => $value) { - if (!$first) { - $query.= ', '; - } - $first = false; - $query.= "$key = :$key "; - } - $query.='WHERE uri = :uri'; - $stmt = $this->pdo->prepare($query); - $updateAble['uri'] = $path; - $stmt->execute($updateAble); - - return true; - - } - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return an array with full principal uri's. - * - * If somebody attempted to search on a property the backend does not - * support, you should simply return 0 results. - * - * You can also just return 0 results if you choose to not support - * searching at all, but keep in mind that this may stop certain features - * from working. - * - * @param string $prefixPath - * @param array $searchProperties - * @return array - */ - public function searchPrincipals($prefixPath, array $searchProperties) { - - $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 '; - $values = array(); - foreach($searchProperties as $property => $value) { - - switch($property) { - - case '{DAV:}displayname' : - $query.=' AND displayname LIKE ?'; - $values[] = '%' . $value . '%'; - break; - case '{http://sabredav.org/ns}email-address' : - $query.=' AND email LIKE ?'; - $values[] = '%' . $value . '%'; - break; - default : - // Unsupported property - return array(); - - } - - } - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - $principals = array(); - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - // Checking if the principal is in the prefix - list($rowPrefix) = Sabre_DAV_URLUtil::splitPath($row['uri']); - if ($rowPrefix !== $prefixPath) continue; - - $principals[] = $row['uri']; - - } - - return $principals; - - } - - /** - * Returns the list of members for a group-principal - * - * @param string $principal - * @return array - */ - public function getGroupMemberSet($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Returns the list of groups a principal is a member of - * - * @param string $principal - * @return array - */ - public function getGroupMembership($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Updates the list of group members for a group principal. - * - * The principals should be passed as a list of uri's. - * - * @param string $principal - * @param array $members - * @return void - */ - public function setGroupMemberSet($principal, array $members) { - - // Grabbing the list of principal id's. - $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');'); - $stmt->execute(array_merge(array($principal), $members)); - - $memberIds = array(); - $principalId = null; - - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - if ($row['uri'] == $principal) { - $principalId = $row['id']; - } else { - $memberIds[] = $row['id']; - } - } - if (!$principalId) throw new Sabre_DAV_Exception('Principal not found'); - - // Wiping out old members - $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;'); - $stmt->execute(array($principalId)); - - foreach($memberIds as $memberId) { - - $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);'); - $stmt->execute(array($principalId, $memberId)); - - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/PrincipalCollection.php b/3rdparty/Sabre/DAVACL/PrincipalCollection.php deleted file mode 100644 index c3e4cb83f2..0000000000 --- a/3rdparty/Sabre/DAVACL/PrincipalCollection.php +++ /dev/null @@ -1,35 +0,0 @@ -principalBackend, $principal); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/Acl.php b/3rdparty/Sabre/DAVACL/Property/Acl.php deleted file mode 100644 index 3f79a8d532..0000000000 --- a/3rdparty/Sabre/DAVACL/Property/Acl.php +++ /dev/null @@ -1,209 +0,0 @@ -privileges = $privileges; - $this->prefixBaseUrl = $prefixBaseUrl; - - } - - /** - * Returns the list of privileges for this property - * - * @return array - */ - public function getPrivileges() { - - return $this->privileges; - - } - - /** - * Serializes the property into a DOMElement - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $ace) { - - $this->serializeAce($doc, $node, $ace, $server); - - } - - } - - /** - * Unserializes the {DAV:}acl xml element. - * - * @param DOMElement $dom - * @return Sabre_DAVACL_Property_Acl - */ - static public function unserialize(DOMElement $dom) { - - $privileges = array(); - $xaces = $dom->getElementsByTagNameNS('DAV:','ace'); - for($ii=0; $ii < $xaces->length; $ii++) { - - $xace = $xaces->item($ii); - $principal = $xace->getElementsByTagNameNS('DAV:','principal'); - if ($principal->length !== 1) { - throw new Sabre_DAV_Exception_BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); - } - $principal = Sabre_DAVACL_Property_Principal::unserialize($principal->item(0)); - - switch($principal->getType()) { - case Sabre_DAVACL_Property_Principal::HREF : - $principal = $principal->getHref(); - break; - case Sabre_DAVACL_Property_Principal::AUTHENTICATED : - $principal = '{DAV:}authenticated'; - break; - case Sabre_DAVACL_Property_Principal::UNAUTHENTICATED : - $principal = '{DAV:}unauthenticated'; - break; - case Sabre_DAVACL_Property_Principal::ALL : - $principal = '{DAV:}all'; - break; - - } - - $protected = false; - - if ($xace->getElementsByTagNameNS('DAV:','protected')->length > 0) { - $protected = true; - } - - $grants = $xace->getElementsByTagNameNS('DAV:','grant'); - if ($grants->length < 1) { - throw new Sabre_DAV_Exception_NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); - } - $grant = $grants->item(0); - - $xprivs = $grant->getElementsByTagNameNS('DAV:','privilege'); - for($jj=0; $jj<$xprivs->length; $jj++) { - - $xpriv = $xprivs->item($jj); - - $privilegeName = null; - - for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { - - $childNode = $xpriv->childNodes->item($kk); - if ($t = Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { - $privilegeName = $t; - break; - } - } - if (is_null($privilegeName)) { - throw new Sabre_DAV_Exception_BadRequest('{DAV:}privilege elements must have a privilege element contained within them.'); - } - - $privileges[] = array( - 'principal' => $principal, - 'protected' => $protected, - 'privilege' => $privilegeName, - ); - - } - - } - - return new self($privileges); - - } - - /** - * Serializes a single access control entry. - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param array $ace - * @param Sabre_DAV_Server $server - * @return void - */ - private function serializeAce($doc,$node,$ace, $server) { - - $xace = $doc->createElementNS('DAV:','d:ace'); - $node->appendChild($xace); - - $principal = $doc->createElementNS('DAV:','d:principal'); - $xace->appendChild($principal); - switch($ace['principal']) { - case '{DAV:}authenticated' : - $principal->appendChild($doc->createElementNS('DAV:','d:authenticated')); - break; - case '{DAV:}unauthenticated' : - $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated')); - break; - case '{DAV:}all' : - $principal->appendChild($doc->createElementNS('DAV:','d:all')); - break; - default: - $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/')); - } - - $grant = $doc->createElementNS('DAV:','d:grant'); - $xace->appendChild($grant); - - $privParts = null; - - preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts); - - $xprivilege = $doc->createElementNS('DAV:','d:privilege'); - $grant->appendChild($xprivilege); - - $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($ace['protected']) && $ace['protected']) - $xace->appendChild($doc->createElement('d:protected')); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php b/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php deleted file mode 100644 index a8b054956d..0000000000 --- a/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument; - - $elem->appendChild($doc->createElementNS('DAV:','d:grant-only')); - $elem->appendChild($doc->createElementNS('DAV:','d:no-invert')); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php deleted file mode 100644 index 94a2964061..0000000000 --- a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php +++ /dev/null @@ -1,75 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property in the DOM - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $privName) { - - $this->serializePriv($doc,$node,$privName); - - } - - } - - /** - * Serializes one privilege - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param string $privName - * @return void - */ - protected function serializePriv($doc,$node,$privName) { - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $node->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/Principal.php b/3rdparty/Sabre/DAVACL/Property/Principal.php deleted file mode 100644 index 3f68174227..0000000000 --- a/3rdparty/Sabre/DAVACL/Property/Principal.php +++ /dev/null @@ -1,160 +0,0 @@ -type = $type; - - if ($type===self::HREF && is_null($href)) { - throw new Sabre_DAV_Exception('The href argument must be specified for the HREF principal type.'); - } - $this->href = $href; - - } - - /** - * Returns the principal type - * - * @return int - */ - public function getType() { - - return $this->type; - - } - - /** - * Returns the principal uri. - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes the property into a DOMElement. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $node) { - - $prefix = $server->xmlNamespaces['DAV:']; - switch($this->type) { - - case self::UNAUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':unauthenticated') - ); - break; - case self::AUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':authenticated') - ); - break; - case self::HREF : - $href = $node->ownerDocument->createElement($prefix . ':href'); - $href->nodeValue = $server->getBaseUri() . $this->href; - $node->appendChild($href); - break; - - } - - } - - /** - * Deserializes a DOM element into a property object. - * - * @param DOMElement $dom - * @return Sabre_DAVACL_Property_Principal - */ - static public function unserialize(DOMElement $dom) { - - $parent = $dom->firstChild; - while(!Sabre_DAV_XMLUtil::toClarkNotation($parent)) { - $parent = $parent->nextSibling; - } - - switch(Sabre_DAV_XMLUtil::toClarkNotation($parent)) { - - case '{DAV:}unauthenticated' : - return new self(self::UNAUTHENTICATED); - case '{DAV:}authenticated' : - return new self(self::AUTHENTICATED); - case '{DAV:}href': - return new self(self::HREF, $parent->textContent); - case '{DAV:}all': - return new self(self::ALL); - default : - throw new Sabre_DAV_Exception_BadRequest('Unexpected element (' . Sabre_DAV_XMLUtil::toClarkNotation($parent) . '). Could not deserialize'); - - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php deleted file mode 100644 index 276d57ae09..0000000000 --- a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php +++ /dev/null @@ -1,92 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property into a domdocument. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - $this->serializePriv($doc, $node, $this->privileges); - - } - - /** - * Serializes a property - * - * This is a recursive function. - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param array $privilege - * @return void - */ - private function serializePriv($doc,$node,$privilege) { - - $xsp = $doc->createElementNS('DAV:','d:supported-privilege'); - $node->appendChild($xsp); - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $xsp->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($privilege['abstract']) && $privilege['abstract']) { - $xsp->appendChild($doc->createElementNS('DAV:','d:abstract')); - } - - if (isset($privilege['description'])) { - $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description'])); - } - - if (isset($privilege['aggregates'])) { - foreach($privilege['aggregates'] as $subPrivilege) { - $this->serializePriv($doc,$xsp,$subPrivilege); - } - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Version.php b/3rdparty/Sabre/DAVACL/Version.php deleted file mode 100644 index 084a9c13c8..0000000000 --- a/3rdparty/Sabre/DAVACL/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -httpRequest->getHeader('Authorization'); - $authHeader = explode(' ',$authHeader); - - if ($authHeader[0]!='AWS' || !isset($authHeader[1])) { - $this->errorCode = self::ERR_NOAWSHEADER; - return false; - } - - list($this->accessKey,$this->signature) = explode(':',$authHeader[1]); - - return true; - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getAccessKey() { - - return $this->accessKey; - - } - - /** - * Validates the signature based on the secretKey - * - * @param string $secretKey - * @return bool - */ - public function validate($secretKey) { - - $contentMD5 = $this->httpRequest->getHeader('Content-MD5'); - - if ($contentMD5) { - // We need to validate the integrity of the request - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - - if ($contentMD5!=base64_encode(md5($body,true))) { - // content-md5 header did not match md5 signature of body - $this->errorCode = self::ERR_MD5CHECKSUMWRONG; - return false; - } - - } - - if (!$requestDate = $this->httpRequest->getHeader('x-amz-date')) - $requestDate = $this->httpRequest->getHeader('Date'); - - if (!$this->validateRFC2616Date($requestDate)) - return false; - - $amzHeaders = $this->getAmzHeaders(); - - $signature = base64_encode( - $this->hmacsha1($secretKey, - $this->httpRequest->getMethod() . "\n" . - $contentMD5 . "\n" . - $this->httpRequest->getHeader('Content-type') . "\n" . - $requestDate . "\n" . - $amzHeaders . - $this->httpRequest->getURI() - ) - ); - - if ($this->signature != $signature) { - - $this->errorCode = self::ERR_INVALIDSIGNATURE; - return false; - - } - - return true; - - } - - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','AWS'); - $this->httpResponse->sendStatus(401); - - } - - /** - * Makes sure the supplied value is a valid RFC2616 date. - * - * If we would just use strtotime to get a valid timestamp, we have no way of checking if a - * user just supplied the word 'now' for the date header. - * - * This function also makes sure the Date header is within 15 minutes of the operating - * system date, to prevent replay attacks. - * - * @param string $dateHeader - * @return bool - */ - protected function validateRFC2616Date($dateHeader) { - - $date = Sabre_HTTP_Util::parseHTTPDate($dateHeader); - - // Unknown format - if (!$date) { - $this->errorCode = self::ERR_INVALIDDATEFORMAT; - return false; - } - - $min = new DateTime('-15 minutes'); - $max = new DateTime('+15 minutes'); - - // We allow 15 minutes around the current date/time - if ($date > $max || $date < $min) { - $this->errorCode = self::ERR_REQUESTTIMESKEWED; - return false; - } - - return $date; - - } - - /** - * Returns a list of AMZ headers - * - * @return string - */ - protected function getAmzHeaders() { - - $amzHeaders = array(); - $headers = $this->httpRequest->getHeaders(); - foreach($headers as $headerName => $headerValue) { - if (strpos(strtolower($headerName),'x-amz-')===0) { - $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n"; - } - } - ksort($amzHeaders); - - $headerStr = ''; - foreach($amzHeaders as $h=>$v) { - $headerStr.=$h.':'.$v; - } - - return $headerStr; - - } - - /** - * Generates an HMAC-SHA1 signature - * - * @param string $key - * @param string $message - * @return string - */ - private function hmacsha1($key, $message) { - - $blocksize=64; - if (strlen($key)>$blocksize) - $key=pack('H*', sha1($key)); - $key=str_pad($key,$blocksize,chr(0x00)); - $ipad=str_repeat(chr(0x36),$blocksize); - $opad=str_repeat(chr(0x5c),$blocksize); - $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message)))); - return $hmac; - - } - -} diff --git a/3rdparty/Sabre/HTTP/AbstractAuth.php b/3rdparty/Sabre/HTTP/AbstractAuth.php deleted file mode 100644 index 3bccabcd1c..0000000000 --- a/3rdparty/Sabre/HTTP/AbstractAuth.php +++ /dev/null @@ -1,111 +0,0 @@ -httpResponse = new Sabre_HTTP_Response(); - $this->httpRequest = new Sabre_HTTP_Request(); - - } - - /** - * Sets an alternative HTTP response object - * - * @param Sabre_HTTP_Response $response - * @return void - */ - public function setHTTPResponse(Sabre_HTTP_Response $response) { - - $this->httpResponse = $response; - - } - - /** - * Sets an alternative HTTP request object - * - * @param Sabre_HTTP_Request $request - * @return void - */ - public function setHTTPRequest(Sabre_HTTP_Request $request) { - - $this->httpRequest = $request; - - } - - - /** - * Sets the realm - * - * The realm is often displayed in authentication dialog boxes - * Commonly an application name displayed here - * - * @param string $realm - * @return void - */ - public function setRealm($realm) { - - $this->realm = $realm; - - } - - /** - * Returns the realm - * - * @return string - */ - public function getRealm() { - - return $this->realm; - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - abstract public function requireLogin(); - -} diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php deleted file mode 100644 index f90ed24f5d..0000000000 --- a/3rdparty/Sabre/HTTP/BasicAuth.php +++ /dev/null @@ -1,67 +0,0 @@ -httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) { - - return array($user,$pass); - - } - - // Most other webservers - $auth = $this->httpRequest->getHeader('Authorization'); - - // Apache could prefix environment variables with REDIRECT_ when urls - // are passed through mod_rewrite - if (!$auth) { - $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); - } - - if (!$auth) return false; - - if (strpos(strtolower($auth),'basic')!==0) return false; - - return explode(':', base64_decode(substr($auth, 6)),2); - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"'); - $this->httpResponse->sendStatus(401); - - } - -} diff --git a/3rdparty/Sabre/HTTP/DigestAuth.php b/3rdparty/Sabre/HTTP/DigestAuth.php deleted file mode 100644 index ee7f05c08e..0000000000 --- a/3rdparty/Sabre/HTTP/DigestAuth.php +++ /dev/null @@ -1,240 +0,0 @@ -nonce = uniqid(); - $this->opaque = md5($this->realm); - parent::__construct(); - - } - - /** - * Gathers all information from the headers - * - * This method needs to be called prior to anything else. - * - * @return void - */ - public function init() { - - $digest = $this->getDigest(); - $this->digestParts = $this->parseDigest($digest); - - } - - /** - * Sets the quality of protection value. - * - * Possible values are: - * Sabre_HTTP_DigestAuth::QOP_AUTH - * Sabre_HTTP_DigestAuth::QOP_AUTHINT - * - * Multiple values can be specified using logical OR. - * - * QOP_AUTHINT ensures integrity of the request body, but this is not - * supported by most HTTP clients. QOP_AUTHINT also requires the entire - * request body to be md5'ed, which can put strains on CPU and memory. - * - * @param int $qop - * @return void - */ - public function setQOP($qop) { - - $this->qop = $qop; - - } - - /** - * Validates the user. - * - * The A1 parameter should be md5($username . ':' . $realm . ':' . $password); - * - * @param string $A1 - * @return bool - */ - public function validateA1($A1) { - - $this->A1 = $A1; - return $this->validate(); - - } - - /** - * Validates authentication through a password. The actual password must be provided here. - * It is strongly recommended not store the password in plain-text and use validateA1 instead. - * - * @param string $password - * @return bool - */ - public function validatePassword($password) { - - $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password); - return $this->validate(); - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getUsername() { - - return $this->digestParts['username']; - - } - - /** - * Validates the digest challenge - * - * @return bool - */ - protected function validate() { - - $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri']; - - if ($this->digestParts['qop']=='auth-int') { - // Making sure we support this qop value - if (!($this->qop & self::QOP_AUTHINT)) return false; - // We need to add an md5 of the entire request body to the A2 part of the hash - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - $A2 .= ':' . md5($body); - } else { - - // We need to make sure we support this qop value - if (!($this->qop & self::QOP_AUTH)) return false; - } - - $A2 = md5($A2); - - $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}"); - - return $this->digestParts['response']==$validResponse; - - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $qop = ''; - switch($this->qop) { - case self::QOP_AUTH : $qop = 'auth'; break; - case self::QOP_AUTHINT : $qop = 'auth-int'; break; - case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break; - } - - $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"'); - $this->httpResponse->sendStatus(401); - - } - - - /** - * This method returns the full digest string. - * - * It should be compatibile with mod_php format and other webservers. - * - * If the header could not be found, null will be returned - * - * @return mixed - */ - public function getDigest() { - - // mod_php - $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST'); - if ($digest) return $digest; - - // most other servers - $digest = $this->httpRequest->getHeader('Authorization'); - - // Apache could prefix environment variables with REDIRECT_ when urls - // are passed through mod_rewrite - if (!$digest) { - $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); - } - - if ($digest && strpos(strtolower($digest),'digest')===0) { - return substr($digest,7); - } else { - return null; - } - - } - - - /** - * Parses the different pieces of the digest string into an array. - * - * This method returns false if an incomplete digest was supplied - * - * @param string $digest - * @return mixed - */ - protected function parseDigest($digest) { - - // protect against missing data - $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); - $data = array(); - - preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER); - - foreach ($matches as $m) { - $data[$m[1]] = $m[2] ? $m[2] : $m[3]; - unset($needed_parts[$m[1]]); - } - - return $needed_parts ? false : $data; - - } - -} diff --git a/3rdparty/Sabre/HTTP/Request.php b/3rdparty/Sabre/HTTP/Request.php deleted file mode 100644 index 74d5ed3d7e..0000000000 --- a/3rdparty/Sabre/HTTP/Request.php +++ /dev/null @@ -1,268 +0,0 @@ -_SERVER = $serverData; - else $this->_SERVER =& $_SERVER; - - if ($postData) $this->_POST = $postData; - else $this->_POST =& $_POST; - - } - - /** - * 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; - - } - - /** - * Returns all (known) HTTP headers. - * - * All headers are converted to lower-case, and additionally all underscores - * are automatically converted to dashes - * - * @return array - */ - public function getHeaders() { - - $hdrs = array(); - foreach($this->_SERVER as $key=>$value) { - - switch($key) { - case 'CONTENT_LENGTH' : - case 'CONTENT_TYPE' : - $hdrs[strtolower(str_replace('_','-',$key))] = $value; - break; - default : - if (strpos($key,'HTTP_')===0) { - $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value; - } - break; - } - - } - - return $hdrs; - - } - - /** - * Returns the HTTP request method - * - * This is for example POST or GET - * - * @return string - */ - public function getMethod() { - - return $this->_SERVER['REQUEST_METHOD']; - - } - - /** - * Returns the requested uri - * - * @return string - */ - public function getUri() { - - return $this->_SERVER['REQUEST_URI']; - - } - - /** - * Will return protocol + the hostname + the uri - * - * @return string - */ - public function getAbsoluteUri() { - - // Checking if the request was made through HTTPS. The last in line is for IIS - $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off'); - return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri(); - - } - - /** - * Returns everything after the ? from the current url - * - * @return string - */ - public function getQueryString() { - - return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:''; - - } - - /** - * Returns the HTTP request body body - * - * This method returns a readable stream resource. - * If the asString parameter is set to true, a string is sent instead. - * - * @param bool $asString - * @return resource - */ - public function getBody($asString = false) { - - if (is_null($this->body)) { - if (!is_null(self::$defaultInputStream)) { - $this->body = self::$defaultInputStream; - } else { - $this->body = fopen('php://input','r'); - self::$defaultInputStream = $this->body; - } - } - if ($asString) { - $body = stream_get_contents($this->body); - return $body; - } else { - return $this->body; - } - - } - - /** - * Sets the contents of the HTTP request body - * - * This method can either accept a string, or a readable stream resource. - * - * If the setAsDefaultInputStream is set to true, it means for this run of the - * script the supplied body will be used instead of php://input. - * - * @param mixed $body - * @param bool $setAsDefaultInputStream - * @return void - */ - public function setBody($body,$setAsDefaultInputStream = false) { - - if(is_resource($body)) { - $this->body = $body; - } else { - - $stream = fopen('php://temp','r+'); - fputs($stream,$body); - rewind($stream); - // String is assumed - $this->body = $stream; - } - if ($setAsDefaultInputStream) { - self::$defaultInputStream = $this->body; - } - - } - - /** - * Returns PHP's _POST variable. - * - * The reason this is in a method is so it can be subclassed and - * overridden. - * - * @return array - */ - public function getPostVars() { - - return $this->_POST; - - } - - /** - * Returns a specific item from the _SERVER array. - * - * Do not rely on this feature, it is for internal use only. - * - * @param string $field - * @return string - */ - public function getRawServerValue($field) { - - return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; - - } - -} - diff --git a/3rdparty/Sabre/HTTP/Response.php b/3rdparty/Sabre/HTTP/Response.php deleted file mode 100644 index 9d436881bd..0000000000 --- a/3rdparty/Sabre/HTTP/Response.php +++ /dev/null @@ -1,162 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authorative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC 4918 - 208 => 'Already Reported', // RFC 5842 - 226 => 'IM Used', // RFC 3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Reserved', - 307 => 'Temporary Redirect', - 400 => 'Bad request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC 2324 - 422 => 'Unprocessable Entity', // RFC 4918 - 423 => 'Locked', // RFC 4918 - 424 => 'Failed Dependency', // RFC 4918 - 426 => 'Upgrade required', - 428 => 'Precondition required', // draft-nottingham-http-new-status - 429 => 'Too Many Requests', // draft-nottingham-http-new-status - 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version not supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', // RFC 4918 - 508 => 'Loop Detected', // RFC 5842 - 509 => 'Bandwidth Limit Exceeded', // non-standard - 510 => 'Not extended', - 511 => 'Network Authentication Required', // draft-nottingham-http-new-status - ); - - return 'HTTP/1.1 ' . $code . ' ' . $msg[$code]; - - } - - // @codeCoverageIgnoreStart - // We cannot reasonably test header() related methods. - - /** - * Sends an HTTP status header to the client - * - * @param int $code HTTP status code - * @return bool - */ - public function sendStatus($code) { - - if (!headers_sent()) - return header($this->getStatusMessage($code)); - else return false; - - } - - /** - * Sets an HTTP header for the response - * - * @param string $name - * @param string $value - * @param bool $replace - * @return bool - */ - public function setHeader($name, $value, $replace = true) { - - $value = str_replace(array("\r","\n"),array('\r','\n'),$value); - if (!headers_sent()) - return header($name . ': ' . $value, $replace); - else return false; - - - } - // @codeCoverageIgnoreEnd - - /** - * Sets a bunch of HTTP Headers - * - * headersnames are specified as keys, value in the array value - * - * @param array $headers - * @return void - */ - public function setHeaders(array $headers) { - - foreach($headers as $key=>$value) - $this->setHeader($key, $value); - - } - - /** - * Sends the entire response body - * - * This method can accept either an open filestream, or a string. - * - * @param mixed $body - * @return void - */ - public function sendBody($body) { - - if (is_resource($body)) { - - fpassthru($body); - - } else { - - // We assume a string - echo $body; - - } - - } - -} diff --git a/3rdparty/Sabre/HTTP/Util.php b/3rdparty/Sabre/HTTP/Util.php deleted file mode 100644 index 67bdd489e1..0000000000 --- a/3rdparty/Sabre/HTTP/Util.php +++ /dev/null @@ -1,82 +0,0 @@ -= 0) - return new DateTime('@' . $realDate, new DateTimeZone('UTC')); - - } - - /** - * Transforms a DateTime object to HTTP's most common date format. - * - * We're serializing it as the RFC 1123 date, which, for HTTP must be - * specified as GMT. - * - * @param DateTime $dateTime - * @return string - */ - static function toHTTPDate(DateTime $dateTime) { - - // We need to clone it, as we don't want to affect the existing - // DateTime. - $dateTime = clone $dateTime; - $dateTime->setTimeZone(new DateTimeZone('GMT')); - return $dateTime->format('D, d M Y H:i:s \G\M\T'); - - } - -} diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php deleted file mode 100644 index 8ccd7c9edf..0000000000 --- a/3rdparty/Sabre/HTTP/Version.php +++ /dev/null @@ -1,24 +0,0 @@ - 'Sabre\\VObject\\Component\\VAlarm', - 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar', - 'VCARD' => 'Sabre\\VObject\\Component\\VCard', - 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent', - 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal', - 'VTODO' => 'Sabre\\VObject\\Component\\VTodo', - 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy', - ); - - /** - * Creates the new component by name, but in addition will also see if - * there's a class mapped to the property name. - * - * @param string $name - * @param string $value - * @return Component - */ - static public function create($name, $value = null) { - - $name = strtoupper($name); - - if (isset(self::$classMap[$name])) { - return new self::$classMap[$name]($name, $value); - } else { - return new self($name, $value); - } - - } - - /** - * Creates a new component. - * - * By default this object will iterate over its own children, but this can - * be overridden with the iterator argument - * - * @param string $name - * @param ElementList $iterator - */ - public function __construct($name, ElementList $iterator = null) { - - $this->name = strtoupper($name); - if (!is_null($iterator)) $this->iterator = $iterator; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = "BEGIN:" . $this->name . "\r\n"; - - /** - * Gives a component a 'score' for sorting purposes. - * - * This is solely used by the childrenSort method. - * - * A higher score means the item will be lower in the list. - * To avoid score collisions, each "score category" has a reasonable - * space to accomodate elements. The $key is added to the $score to - * preserve the original relative order of elements. - * - * @param int $key - * @param array $array - * @return int - */ - $sortScore = function($key, $array) { - - if ($array[$key] instanceof Component) { - - // We want to encode VTIMEZONE first, this is a personal - // preference. - if ($array[$key]->name === 'VTIMEZONE') { - $score=300000000; - return $score+$key; - } else { - $score=400000000; - return $score+$key; - } - } else { - // Properties get encoded first - // VCARD version 4.0 wants the VERSION property to appear first - if ($array[$key] instanceof Property) { - if ($array[$key]->name === 'VERSION') { - $score=100000000; - return $score+$key; - } else { - // All other properties - $score=200000000; - return $score+$key; - } - } - } - - }; - - $tmp = $this->children; - uksort($this->children, function($a, $b) use ($sortScore, $tmp) { - - $sA = $sortScore($a, $tmp); - $sB = $sortScore($b, $tmp); - - if ($sA === $sB) return 0; - - return ($sA < $sB) ? -1 : 1; - - }); - - foreach($this->children as $child) $str.=$child->serialize(); - $str.= "END:" . $this->name . "\r\n"; - - return $str; - - } - - /** - * Adds a new component or element - * - * You can call this method with the following syntaxes: - * - * add(Node $node) - * add(string $name, $value, array $parameters = array()) - * - * The first version adds an Element - * The second adds a property as a string. - * - * @param mixed $item - * @param mixed $itemValue - * @return void - */ - public function add($item, $itemValue = null, array $parameters = array()) { - - if ($item instanceof Node) { - if (!is_null($itemValue)) { - throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); - } - $item->parent = $this; - $this->children[] = $item; - } elseif(is_string($item)) { - - $item = Property::create($item,$itemValue, $parameters); - $item->parent = $this; - $this->children[] = $item; - - } else { - - throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string'); - - } - - } - - /** - * Returns an iterable list of children - * - * @return ElementList - */ - public function children() { - - return new ElementList($this->children); - - } - - /** - * Returns an array with elements that match the specified name. - * - * This function is also aware of MIME-Directory groups (as they appear in - * vcards). This means that if a property is grouped as "HOME.EMAIL", it - * will also be returned when searching for just "EMAIL". If you want to - * search for a property in a specific group, you can select on the entire - * string ("HOME.EMAIL"). If you want to search on a specific property that - * has not been assigned a group, specify ".EMAIL". - * - * Keys are retained from the 'children' array, which may be confusing in - * certain cases. - * - * @param string $name - * @return array - */ - public function select($name) { - - $group = null; - $name = strtoupper($name); - if (strpos($name,'.')!==false) { - list($group,$name) = explode('.', $name, 2); - } - - $result = array(); - foreach($this->children as $key=>$child) { - - if ( - strtoupper($child->name) === $name && - (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) - ) { - - $result[$key] = $child; - - } - } - - reset($result); - return $result; - - } - - /** - * This method only returns a list of sub-components. Properties are - * ignored. - * - * @return array - */ - public function getComponents() { - - $result = array(); - foreach($this->children as $child) { - if ($child instanceof Component) { - $result[] = $child; - } - } - - return $result; - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $result = array(); - foreach($this->children as $child) { - $result = array_merge($result, $child->validate($options)); - } - return $result; - - } - - /* Magic property accessors {{{ */ - - /** - * Using 'get' you will either get a property or component, - * - * If there were no child-elements found with the specified name, - * null is returned. - * - * @param string $name - * @return Property - */ - public function __get($name) { - - $matches = $this->select($name); - if (count($matches)===0) { - return null; - } else { - $firstMatch = current($matches); - /** @var $firstMatch Property */ - $firstMatch->setIterator(new ElementList(array_values($matches))); - return $firstMatch; - } - - } - - /** - * This method checks if a sub-element with the specified name exists. - * - * @param string $name - * @return bool - */ - public function __isset($name) { - - $matches = $this->select($name); - return count($matches)>0; - - } - - /** - * Using the setter method you can add properties or subcomponents - * - * You can either pass a Component, Property - * object, or a string to automatically create a Property. - * - * If the item already exists, it will be removed. If you want to add - * a new item with the same name, always use the add() method. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function __set($name, $value) { - - $matches = $this->select($name); - $overWrite = count($matches)?key($matches):null; - - if ($value instanceof Component || $value instanceof Property) { - $value->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $value; - } else { - $this->children[] = $value; - } - } elseif (is_scalar($value)) { - $property = Property::create($name,$value); - $property->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $property; - } else { - $this->children[] = $property; - } - } else { - throw new \InvalidArgumentException('You must pass a \\Sabre\\VObject\\Component, \\Sabre\\VObject\\Property or scalar type'); - } - - } - - /** - * Removes all properties and components within this component. - * - * @param string $name - * @return void - */ - public function __unset($name) { - - $matches = $this->select($name); - foreach($matches as $k=>$child) { - - unset($this->children[$k]); - $child->parent = null; - - } - - } - - /* }}} */ - - /** - * This method is automatically called when the object is cloned. - * Specifically, this will ensure all child elements are also cloned. - * - * @return void - */ - public function __clone() { - - foreach($this->children as $key=>$child) { - $this->children[$key] = clone $child; - $this->children[$key]->parent = $this; - } - - } - -} diff --git a/3rdparty/Sabre/VObject/Component/VAlarm.php b/3rdparty/Sabre/VObject/Component/VAlarm.php deleted file mode 100644 index 383e16eef1..0000000000 --- a/3rdparty/Sabre/VObject/Component/VAlarm.php +++ /dev/null @@ -1,108 +0,0 @@ -TRIGGER; - if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { - $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); - $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; - - $parentComponent = $this->parent; - if ($related === 'START') { - - if ($parentComponent->name === 'VTODO') { - $propName = 'DUE'; - } else { - $propName = 'DTSTART'; - } - - $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } else { - if ($parentComponent->name === 'VTODO') { - $endProp = 'DUE'; - } elseif ($parentComponent->name === 'VEVENT') { - $endProp = 'DTEND'; - } else { - throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); - } - - if (isset($parentComponent->$endProp)) { - $effectiveTrigger = clone $parentComponent->$endProp->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } elseif (isset($parentComponent->DURATION)) { - $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); - $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); - $effectiveTrigger->add($duration); - $effectiveTrigger->add($triggerDuration); - } else { - $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } - } - } else { - $effectiveTrigger = $trigger->getDateTime(); - } - return $effectiveTrigger; - - } - - /** - * Returns true or false depending on if the event falls in the specified - * time-range. This is used for filtering purposes. - * - * The rules used to determine if an event falls within the specified - * time-range is based on the CalDAV specification. - * - * @param \DateTime $start - * @param \DateTime $end - * @return bool - */ - public function isInTimeRange(\DateTime $start, \DateTime $end) { - - $effectiveTrigger = $this->getEffectiveTriggerTime(); - - if (isset($this->DURATION)) { - $duration = VObject\DateTimeParser::parseDuration($this->DURATION); - $repeat = (string)$this->repeat; - if (!$repeat) { - $repeat = 1; - } - - $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); - - foreach($period as $occurrence) { - - if ($start <= $occurrence && $end > $occurrence) { - return true; - } - } - return false; - } else { - return ($start <= $effectiveTrigger && $end > $effectiveTrigger); - } - - } - -} diff --git a/3rdparty/Sabre/VObject/Component/VCalendar.php b/3rdparty/Sabre/VObject/Component/VCalendar.php deleted file mode 100644 index 73f2f6d34f..0000000000 --- a/3rdparty/Sabre/VObject/Component/VCalendar.php +++ /dev/null @@ -1,242 +0,0 @@ -children as $component) { - - if (!$component instanceof VObject\Component) - continue; - - if (isset($component->{'RECURRENCE-ID'})) - continue; - - if ($componentName && $component->name !== strtoupper($componentName)) - continue; - - if ($component->name === 'VTIMEZONE') - continue; - - $components[] = $component; - - } - - return $components; - - } - - /** - * If this calendar object, has events with recurrence rules, this method - * can be used to expand the event into multiple sub-events. - * - * Each event will be stripped from it's recurrence information, and only - * the instances of the event in the specified timerange will be left - * alone. - * - * In addition, this method will cause timezone information to be stripped, - * and normalized to UTC. - * - * This method will alter the VCalendar. This cannot be reversed. - * - * This functionality is specifically used by the CalDAV standard. It is - * possible for clients to request expand events, if they are rather simple - * clients and do not have the possibility to calculate recurrences. - * - * @param DateTime $start - * @param DateTime $end - * @return void - */ - public function expand(\DateTime $start, \DateTime $end) { - - $newEvents = array(); - - foreach($this->select('VEVENT') as $key=>$vevent) { - - if (isset($vevent->{'RECURRENCE-ID'})) { - unset($this->children[$key]); - continue; - } - - - if (!$vevent->rrule) { - unset($this->children[$key]); - if ($vevent->isInTimeRange($start, $end)) { - $newEvents[] = $vevent; - } - continue; - } - - $uid = (string)$vevent->uid; - if (!$uid) { - throw new \LogicException('Event did not have a UID!'); - } - - $it = new VObject\RecurrenceIterator($this, $vevent->uid); - $it->fastForward($start); - - while($it->valid() && $it->getDTStart() < $end) { - - if ($it->getDTEnd() > $start) { - - $newEvents[] = $it->getEventObject(); - - } - $it->next(); - - } - unset($this->children[$key]); - - } - - foreach($newEvents as $newEvent) { - - foreach($newEvent->children as $child) { - if ($child instanceof VObject\Property\DateTime && - $child->getDateType() == VObject\Property\DateTime::LOCALTZ) { - $child->setDateTime($child->getDateTime(),VObject\Property\DateTime::UTC); - } - } - - $this->add($newEvent); - - } - - // Removing all VTIMEZONE components - unset($this->VTIMEZONE); - - } - - /** - * Validates the node for correctness. - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @return array - */ - /* - public function validate() { - - $warnings = array(); - - $version = $this->select('VERSION'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time', - 'node' => $this, - ); - } else { - if ((string)$this->VERSION !== '2.0') { - $warnings[] = array( - 'level' => 1, - 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', - 'node' => $this, - ); - } - } - $version = $this->select('PRODID'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time', - 'node' => $this, - ); - } - if (count($this->CALSCALE) > 1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The CALSCALE property must not be specified more than once.', - 'node' => $this, - ); - } - if (count($this->METHOD) > 1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The METHOD property must not be specified more than once.', - 'node' => $this, - ); - } - - $allowedComponents = array( - 'VEVENT', - 'VTODO', - 'VJOURNAL', - 'VFREEBUSY', - 'VTIMEZONE', - ); - $allowedProperties = array( - 'PRODID', - 'VERSION', - 'CALSCALE', - 'METHOD', - ); - $componentsFound = 0; - foreach($this->children as $child) { - if($child instanceof Component) { - $componentsFound++; - if (!in_array($child->name, $allowedComponents)) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The ' . $child->name . " component is not allowed in the VCALENDAR component", - 'node' => $this, - ); - } - } - if ($child instanceof Property) { - if (!in_array($child->name, $allowedProperties)) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The ' . $child->name . " property is not allowed in the VCALENDAR component", - 'node' => $this, - ); - } - } - } - - if ($componentsFound===0) { - $warnings[] = array( - 'level' => 1, - 'message' => 'An iCalendar object must have at least 1 component.', - 'node' => $this, - ); - } - - return array_merge( - $warnings, - parent::validate() - ); - - } - */ - -} - diff --git a/3rdparty/Sabre/VObject/Component/VCard.php b/3rdparty/Sabre/VObject/Component/VCard.php deleted file mode 100644 index b292698555..0000000000 --- a/3rdparty/Sabre/VObject/Component/VCard.php +++ /dev/null @@ -1,105 +0,0 @@ -select('VERSION'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->VERSION = self::DEFAULT_VERSION; - } - } else { - $version = (string)$this->VERSION; - if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { - $warnings[] = array( - 'level' => 1, - 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->VERSION = '4.0'; - } - } - - } - $version = $this->select('FN'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The FN property must appear in the VCARD component exactly 1 time', - 'node' => $this, - ); - if (($options & self::REPAIR) && count($version) === 0) { - // We're going to try to see if we can use the contents of the - // N property. - if (isset($this->N)) { - $value = explode(';', (string)$this->N); - if (isset($value[1]) && $value[1]) { - $this->FN = $value[1] . ' ' . $value[0]; - } else { - $this->FN = $value[0]; - } - - // Otherwise, the ORG property may work - } elseif (isset($this->ORG)) { - $this->FN = (string)$this->ORG; - } - - } - } - - return array_merge( - parent::validate($options), - $warnings - ); - - } - -} - diff --git a/3rdparty/Sabre/VObject/Component/VEvent.php b/3rdparty/Sabre/VObject/Component/VEvent.php deleted file mode 100644 index 9d10966e20..0000000000 --- a/3rdparty/Sabre/VObject/Component/VEvent.php +++ /dev/null @@ -1,70 +0,0 @@ -RRULE) { - $it = new VObject\RecurrenceIterator($this); - $it->fastForward($start); - - // We fast-forwarded to a spot where the end-time of the - // recurrence instance exceeded the start of the requested - // time-range. - // - // If the starttime of the recurrence did not exceed the - // end of the time range as well, we have a match. - return ($it->getDTStart() < $end && $it->getDTEnd() > $start); - - } - - $effectiveStart = $this->DTSTART->getDateTime(); - if (isset($this->DTEND)) { - - // The DTEND property is considered non inclusive. So for a 3 day - // event in july, dtstart and dtend would have to be July 1st and - // July 4th respectively. - // - // See: - // http://tools.ietf.org/html/rfc5545#page-54 - $effectiveEnd = $this->DTEND->getDateTime(); - - } elseif (isset($this->DURATION)) { - $effectiveEnd = clone $effectiveStart; - $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); - } elseif ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) { - $effectiveEnd = clone $effectiveStart; - $effectiveEnd->modify('+1 day'); - } else { - $effectiveEnd = clone $effectiveStart; - } - return ( - ($start <= $effectiveEnd) && ($end > $effectiveStart) - ); - - } - -} diff --git a/3rdparty/Sabre/VObject/Component/VFreeBusy.php b/3rdparty/Sabre/VObject/Component/VFreeBusy.php deleted file mode 100644 index d6da52cbd7..0000000000 --- a/3rdparty/Sabre/VObject/Component/VFreeBusy.php +++ /dev/null @@ -1,68 +0,0 @@ -select('FREEBUSY') as $freebusy) { - - // We are only interested in FBTYPE=BUSY (the default), - // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. - if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { - continue; - } - - // The freebusy component can hold more than 1 value, separated by - // commas. - $periods = explode(',', (string)$freebusy); - - foreach($periods as $period) { - // Every period is formatted as [start]/[end]. The start is an - // absolute UTC time, the end may be an absolute UTC time, or - // duration (relative) value. - list($busyStart, $busyEnd) = explode('/', $period); - - $busyStart = VObject\DateTimeParser::parse($busyStart); - $busyEnd = VObject\DateTimeParser::parse($busyEnd); - if ($busyEnd instanceof \DateInterval) { - $tmp = clone $busyStart; - $tmp->add($busyEnd); - $busyEnd = $tmp; - } - - if($start < $busyEnd && $end > $busyStart) { - return false; - } - - } - - } - - return true; - - } - -} - diff --git a/3rdparty/Sabre/VObject/Component/VJournal.php b/3rdparty/Sabre/VObject/Component/VJournal.php deleted file mode 100644 index f104a1f66e..0000000000 --- a/3rdparty/Sabre/VObject/Component/VJournal.php +++ /dev/null @@ -1,46 +0,0 @@ -DTSTART)?$this->DTSTART->getDateTime():null; - if ($dtstart) { - $effectiveEnd = clone $dtstart; - if ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) { - $effectiveEnd->modify('+1 day'); - } - - return ($start <= $effectiveEnd && $end > $dtstart); - - } - return false; - - - } - -} diff --git a/3rdparty/Sabre/VObject/Component/VTodo.php b/3rdparty/Sabre/VObject/Component/VTodo.php deleted file mode 100644 index 5f879aea43..0000000000 --- a/3rdparty/Sabre/VObject/Component/VTodo.php +++ /dev/null @@ -1,68 +0,0 @@ -DTSTART)?$this->DTSTART->getDateTime():null; - $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; - $due = isset($this->DUE)?$this->DUE->getDateTime():null; - $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; - $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; - - if ($dtstart) { - if ($duration) { - $effectiveEnd = clone $dtstart; - $effectiveEnd->add($duration); - return $start <= $effectiveEnd && $end > $dtstart; - } elseif ($due) { - return - ($start < $due || $start <= $dtstart) && - ($end > $dtstart || $end >= $due); - } else { - return $start <= $dtstart && $end > $dtstart; - } - } - if ($due) { - return ($start < $due && $end >= $due); - } - if ($completed && $created) { - return - ($start <= $created || $start <= $completed) && - ($end >= $created || $end >= $completed); - } - if ($completed) { - return ($start <= $completed && $end >= $completed); - } - if ($created) { - return ($end > $created); - } - return true; - - } - -} diff --git a/3rdparty/Sabre/VObject/DateTimeParser.php b/3rdparty/Sabre/VObject/DateTimeParser.php deleted file mode 100644 index d09ded9676..0000000000 --- a/3rdparty/Sabre/VObject/DateTimeParser.php +++ /dev/null @@ -1,181 +0,0 @@ -setTimeZone(new \DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object - * - * @param string $date - * @return DateTime - */ - static public function parseDate($date) { - - // Format is YYYYMMDD - $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches); - - if (!$result) { - throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); - } - - $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (RFC5545) formatted duration value. - * - * This method will either return a DateTimeInterval object, or a string - * suitable for strtotime or DateTime::modify. - * - * @param string $duration - * @param bool $asString - * @return DateInterval|string - */ - static public function parseDuration($duration, $asString = false) { - - $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); - if (!$result) { - throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); - } - - if (!$asString) { - $invert = false; - if ($matches['plusminus']==='-') { - $invert = true; - } - - - $parts = array( - 'week', - 'day', - 'hour', - 'minute', - 'second', - ); - foreach($parts as $part) { - $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0; - } - - - // We need to re-construct the $duration string, because weeks and - // days are not supported by DateInterval in the same string. - $duration = 'P'; - $days = $matches['day']; - if ($matches['week']) { - $days+=$matches['week']*7; - } - if ($days) - $duration.=$days . 'D'; - - if ($matches['minute'] || $matches['second'] || $matches['hour']) { - $duration.='T'; - - if ($matches['hour']) - $duration.=$matches['hour'].'H'; - - if ($matches['minute']) - $duration.=$matches['minute'].'M'; - - if ($matches['second']) - $duration.=$matches['second'].'S'; - - } - - if ($duration==='P') { - $duration = 'PT0S'; - } - $iv = new \DateInterval($duration); - if ($invert) $iv->invert = true; - - return $iv; - - } - - - - $parts = array( - 'week', - 'day', - 'hour', - 'minute', - 'second', - ); - - $newDur = ''; - foreach($parts as $part) { - if (isset($matches[$part]) && $matches[$part]) { - $newDur.=' '.$matches[$part] . ' ' . $part . 's'; - } - } - - $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); - if ($newDur === '+') { $newDur = '+0 seconds'; }; - return $newDur; - - } - - /** - * Parses either a Date or DateTime, or Duration value. - * - * @param string $date - * @param DateTimeZone|string $referenceTZ - * @return DateTime|DateInterval - */ - static public function parse($date, $referenceTZ = null) { - - if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) { - return self::parseDuration($date); - } elseif (strlen($date)===8) { - return self::parseDate($date); - } else { - return self::parseDateTime($date, $referenceTZ); - } - - } - - -} diff --git a/3rdparty/Sabre/VObject/ElementList.php b/3rdparty/Sabre/VObject/ElementList.php deleted file mode 100644 index b7f1c8eee2..0000000000 --- a/3rdparty/Sabre/VObject/ElementList.php +++ /dev/null @@ -1,172 +0,0 @@ -vevent where there's multiple VEVENT objects. - * - * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class ElementList implements \Iterator, \Countable, \ArrayAccess { - - /** - * Inner elements - * - * @var array - */ - protected $elements = array(); - - /** - * Creates the element list. - * - * @param array $elements - */ - public function __construct(array $elements) { - - $this->elements = $elements; - - } - - /* {{{ Iterator interface */ - - /** - * Current position - * - * @var int - */ - private $key = 0; - - /** - * Returns current item in iteration - * - * @return Element - */ - public function current() { - - return $this->elements[$this->key]; - - } - - /** - * To the next item in the iterator - * - * @return void - */ - public function next() { - - $this->key++; - - } - - /** - * Returns the current iterator key - * - * @return int - */ - public function key() { - - return $this->key; - - } - - /** - * Returns true if the current position in the iterator is a valid one - * - * @return bool - */ - public function valid() { - - return isset($this->elements[$this->key]); - - } - - /** - * Rewinds the iterator - * - * @return void - */ - public function rewind() { - - $this->key = 0; - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - return count($this->elements); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - return isset($this->elements[$offset]); - - } - - /** - * Gets an item through ArrayAccess. - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - return $this->elements[$offset]; - - } - - /** - * Sets an item through ArrayAccess. - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - throw new \LogicException('You can not add new objects to an ElementList'); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - throw new \LogicException('You can not remove objects from an ElementList'); - - } - - /* }}} */ - -} diff --git a/3rdparty/Sabre/VObject/FreeBusyGenerator.php b/3rdparty/Sabre/VObject/FreeBusyGenerator.php deleted file mode 100644 index c607d119ce..0000000000 --- a/3rdparty/Sabre/VObject/FreeBusyGenerator.php +++ /dev/null @@ -1,322 +0,0 @@ -setTimeRange($start, $end); - } - - if ($objects) { - $this->setObjects($objects); - } - - } - - /** - * Sets the VCALENDAR object. - * - * If this is set, it will not be generated for you. You are responsible - * for setting things like the METHOD, CALSCALE, VERSION, etc.. - * - * The VFREEBUSY object will be automatically added though. - * - * @param Component $vcalendar - * @return void - */ - public function setBaseObject(Component $vcalendar) { - - $this->baseObject = $vcalendar; - - } - - /** - * Sets the input objects - * - * You must either specify a valendar object as a strong, or as the parse - * Component. - * It's also possible to specify multiple objects as an array. - * - * @param mixed $objects - * @return void - */ - public function setObjects($objects) { - - if (!is_array($objects)) { - $objects = array($objects); - } - - $this->objects = array(); - foreach($objects as $object) { - - if (is_string($object)) { - $this->objects[] = Reader::read($object); - } elseif ($object instanceof Component) { - $this->objects[] = $object; - } else { - throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects'); - } - - } - - } - - /** - * Sets the time range - * - * Any freebusy object falling outside of this time range will be ignored. - * - * @param DateTime $start - * @param DateTime $end - * @return void - */ - public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { - - $this->start = $start; - $this->end = $end; - - } - - /** - * Parses the input data and returns a correct VFREEBUSY object, wrapped in - * a VCALENDAR. - * - * @return Component - */ - public function getResult() { - - $busyTimes = array(); - - foreach($this->objects as $object) { - - foreach($object->getBaseComponents() as $component) { - - switch($component->name) { - - case 'VEVENT' : - - $FBTYPE = 'BUSY'; - if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { - break; - } - if (isset($component->STATUS)) { - $status = strtoupper($component->STATUS); - if ($status==='CANCELLED') { - break; - } - if ($status==='TENTATIVE') { - $FBTYPE = 'BUSY-TENTATIVE'; - } - } - - $times = array(); - - if ($component->RRULE) { - - $iterator = new RecurrenceIterator($object, (string)$component->uid); - if ($this->start) { - $iterator->fastForward($this->start); - } - - $maxRecurrences = 200; - - while($iterator->valid() && --$maxRecurrences) { - - $startTime = $iterator->getDTStart(); - if ($this->end && $startTime > $this->end) { - break; - } - $times[] = array( - $iterator->getDTStart(), - $iterator->getDTEnd(), - ); - - $iterator->next(); - - } - - } else { - - $startTime = $component->DTSTART->getDateTime(); - if ($this->end && $startTime > $this->end) { - break; - } - $endTime = null; - if (isset($component->DTEND)) { - $endTime = $component->DTEND->getDateTime(); - } elseif (isset($component->DURATION)) { - $duration = DateTimeParser::parseDuration((string)$component->DURATION); - $endTime = clone $startTime; - $endTime->add($duration); - } elseif ($component->DTSTART->getDateType() === Property\DateTime::DATE) { - $endTime = clone $startTime; - $endTime->modify('+1 day'); - } else { - // The event had no duration (0 seconds) - break; - } - - $times[] = array($startTime, $endTime); - - } - - foreach($times as $time) { - - if ($this->end && $time[0] > $this->end) break; - if ($this->start && $time[1] < $this->start) break; - - $busyTimes[] = array( - $time[0], - $time[1], - $FBTYPE, - ); - } - break; - - case 'VFREEBUSY' : - foreach($component->FREEBUSY as $freebusy) { - - $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY'; - - // Skipping intervals marked as 'free' - if ($fbType==='FREE') - continue; - - $values = explode(',', $freebusy); - foreach($values as $value) { - list($startTime, $endTime) = explode('/', $value); - $startTime = DateTimeParser::parseDateTime($startTime); - - if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { - $duration = DateTimeParser::parseDuration($endTime); - $endTime = clone $startTime; - $endTime->add($duration); - } else { - $endTime = DateTimeParser::parseDateTime($endTime); - } - - if($this->start && $this->start > $endTime) continue; - if($this->end && $this->end < $startTime) continue; - $busyTimes[] = array( - $startTime, - $endTime, - $fbType - ); - - } - - - } - break; - - - - } - - - } - - } - - if ($this->baseObject) { - $calendar = $this->baseObject; - } else { - $calendar = new Component('VCALENDAR'); - $calendar->version = '2.0'; - $calendar->prodid = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN'; - $calendar->calscale = 'GREGORIAN'; - } - - $vfreebusy = new Component('VFREEBUSY'); - $calendar->add($vfreebusy); - - if ($this->start) { - $dtstart = new Property\DateTime('DTSTART'); - $dtstart->setDateTime($this->start,Property\DateTime::UTC); - $vfreebusy->add($dtstart); - } - if ($this->end) { - $dtend = new Property\DateTime('DTEND'); - $dtend->setDateTime($this->end,Property\DateTime::UTC); - $vfreebusy->add($dtend); - } - $dtstamp = new Property\DateTime('DTSTAMP'); - $dtstamp->setDateTime(new \DateTime('now'), Property\DateTime::UTC); - $vfreebusy->add($dtstamp); - - foreach($busyTimes as $busyTime) { - - $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); - $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); - - $prop = new Property( - 'FREEBUSY', - $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') - ); - $prop['FBTYPE'] = $busyTime[2]; - $vfreebusy->add($prop); - - } - - return $calendar; - - } - -} - diff --git a/3rdparty/Sabre/VObject/Node.php b/3rdparty/Sabre/VObject/Node.php deleted file mode 100644 index 5d2e1ce300..0000000000 --- a/3rdparty/Sabre/VObject/Node.php +++ /dev/null @@ -1,187 +0,0 @@ -iterator)) - return $this->iterator; - - return new ElementList(array($this)); - - } - - /** - * Sets the overridden iterator - * - * Note that this is not actually part of the iterator interface - * - * @param ElementList $iterator - * @return void - */ - public function setIterator(ElementList $iterator) { - - $this->iterator = $iterator; - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - $it = $this->getIterator(); - return $it->count(); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetExists($offset); - - } - - /** - * Gets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetGet($offset); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - $iterator = $this->getIterator(); - $iterator->offsetSet($offset,$value); - - // @codeCoverageIgnoreStart - // - // This method always throws an exception, so we ignore the closing - // brace - } - // @codeCoverageIgnoreEnd - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - $iterator = $this->getIterator(); - $iterator->offsetUnset($offset); - - // @codeCoverageIgnoreStart - // - // This method always throws an exception, so we ignore the closing - // brace - } - // @codeCoverageIgnoreEnd - - /* }}} */ - -} diff --git a/3rdparty/Sabre/VObject/Parameter.php b/3rdparty/Sabre/VObject/Parameter.php deleted file mode 100644 index d6d7c54c3b..0000000000 --- a/3rdparty/Sabre/VObject/Parameter.php +++ /dev/null @@ -1,88 +0,0 @@ -name = strtoupper($name); - $this->value = $value; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - if (is_null($this->value)) { - return $this->name; - } - $src = array( - '\\', - "\n", - ';', - ',', - ); - $out = array( - '\\\\', - '\n', - '\;', - '\,', - ); - - return $this->name . '=' . str_replace($src, $out, $this->value); - - } - - /** - * Called when this object is being cast to a string - * - * @return string - */ - public function __toString() { - - return $this->value; - - } - -} diff --git a/3rdparty/Sabre/VObject/ParseException.php b/3rdparty/Sabre/VObject/ParseException.php deleted file mode 100644 index 91386fec53..0000000000 --- a/3rdparty/Sabre/VObject/ParseException.php +++ /dev/null @@ -1,12 +0,0 @@ - 'Sabre\\VObject\\Property\\DateTime', - 'CREATED' => 'Sabre\\VObject\\Property\\DateTime', - 'DTEND' => 'Sabre\\VObject\\Property\\DateTime', - 'DTSTAMP' => 'Sabre\\VObject\\Property\\DateTime', - 'DTSTART' => 'Sabre\\VObject\\Property\\DateTime', - 'DUE' => 'Sabre\\VObject\\Property\\DateTime', - 'EXDATE' => 'Sabre\\VObject\\Property\\MultiDateTime', - 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\DateTime', - 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\DateTime', - 'TRIGGER' => 'Sabre\\VObject\\Property\\DateTime', - 'N' => 'Sabre\\VObject\\Property\\Compound', - 'ORG' => 'Sabre\\VObject\\Property\\Compound', - 'ADR' => 'Sabre\\VObject\\Property\\Compound', - 'CATEGORIES' => 'Sabre\\VObject\\Property\\Compound', - ); - - /** - * Creates the new property by name, but in addition will also see if - * there's a class mapped to the property name. - * - * Parameters can be specified with the optional third argument. Parameters - * must be a key->value map of the parameter name, and value. If the value - * is specified as an array, it is assumed that multiple parameters with - * the same name should be added. - * - * @param string $name - * @param string $value - * @param array $parameters - * @return Property - */ - static public function create($name, $value = null, array $parameters = array()) { - - $name = strtoupper($name); - $shortName = $name; - $group = null; - if (strpos($shortName,'.')!==false) { - list($group, $shortName) = explode('.', $shortName); - } - - if (isset(self::$classMap[$shortName])) { - return new self::$classMap[$shortName]($name, $value, $parameters); - } else { - return new self($name, $value, $parameters); - } - - } - - /** - * Creates a new property object - * - * Parameters can be specified with the optional third argument. Parameters - * must be a key->value map of the parameter name, and value. If the value - * is specified as an array, it is assumed that multiple parameters with - * the same name should be added. - * - * @param string $name - * @param string $value - * @param array $parameters - */ - public function __construct($name, $value = null, array $parameters = array()) { - - if (!is_scalar($value) && !is_null($value)) { - throw new \InvalidArgumentException('The value argument must be scalar or null'); - } - - $name = strtoupper($name); - $group = null; - if (strpos($name,'.')!==false) { - list($group, $name) = explode('.', $name); - } - $this->name = $name; - $this->group = $group; - $this->setValue($value); - - foreach($parameters as $paramName => $paramValues) { - - if (!is_array($paramValues)) { - $paramValues = array($paramValues); - } - - foreach($paramValues as $paramValue) { - $this->add($paramName, $paramValue); - } - - } - - } - - /** - * Updates the internal value - * - * @param string $value - * @return void - */ - public function setValue($value) { - - $this->value = $value; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = $this->name; - if ($this->group) $str = $this->group . '.' . $this->name; - - foreach($this->parameters as $param) { - - $str.=';' . $param->serialize(); - - } - - $src = array( - '\\', - "\n", - ); - $out = array( - '\\\\', - '\n', - ); - $str.=':' . str_replace($src, $out, $this->value); - - $out = ''; - while(strlen($str)>0) { - if (strlen($str)>75) { - $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; - $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); - } else { - $out.=$str . "\r\n"; - $str=''; - break; - } - } - - return $out; - - } - - /** - * Adds a new componenten or element - * - * You can call this method with the following syntaxes: - * - * add(Parameter $element) - * add(string $name, $value) - * - * The first version adds an Parameter - * The second adds a property as a string. - * - * @param mixed $item - * @param mixed $itemValue - * @return void - */ - public function add($item, $itemValue = null) { - - if ($item instanceof Parameter) { - if (!is_null($itemValue)) { - throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject'); - } - $item->parent = $this; - $this->parameters[] = $item; - } elseif(is_string($item)) { - - $parameter = new Parameter($item,$itemValue); - $parameter->parent = $this; - $this->parameters[] = $parameter; - - } else { - - throw new \InvalidArgumentException('The first argument must either be a Node a string'); - - } - - } - - /* ArrayAccess interface {{{ */ - - /** - * Checks if an array element exists - * - * @param mixed $name - * @return bool - */ - public function offsetExists($name) { - - if (is_int($name)) return parent::offsetExists($name); - - $name = strtoupper($name); - - foreach($this->parameters as $parameter) { - if ($parameter->name == $name) return true; - } - return false; - - } - - /** - * Returns a parameter, or parameter list. - * - * @param string $name - * @return Node - */ - public function offsetGet($name) { - - if (is_int($name)) return parent::offsetGet($name); - $name = strtoupper($name); - - $result = array(); - foreach($this->parameters as $parameter) { - if ($parameter->name == $name) - $result[] = $parameter; - } - - if (count($result)===0) { - return null; - } elseif (count($result)===1) { - return $result[0]; - } else { - $result[0]->setIterator(new ElementList($result)); - return $result[0]; - } - - } - - /** - * Creates a new parameter - * - * @param string $name - * @param mixed $value - * @return void - */ - public function offsetSet($name, $value) { - - if (is_int($name)) parent::offsetSet($name, $value); - - if (is_scalar($value)) { - if (!is_string($name)) - throw new \InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.'); - - $this->offsetUnset($name); - $parameter = new Parameter($name, $value); - $parameter->parent = $this; - $this->parameters[] = $parameter; - - } elseif ($value instanceof Parameter) { - if (!is_null($name)) - throw new \InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a \\Sabre\\VObject\\Parameter. Add using $array[]=$parameterObject.'); - - $value->parent = $this; - $this->parameters[] = $value; - } else { - throw new \InvalidArgumentException('You can only add parameters to the property object'); - } - - } - - /** - * Removes one or more parameters with the specified name - * - * @param string $name - * @return void - */ - public function offsetUnset($name) { - - if (is_int($name)) parent::offsetUnset($name); - $name = strtoupper($name); - - foreach($this->parameters as $key=>$parameter) { - if ($parameter->name == $name) { - $parameter->parent = null; - unset($this->parameters[$key]); - } - - } - - } - - /* }}} */ - - /** - * Called when this object is being cast to a string - * - * @return string - */ - public function __toString() { - - return (string)$this->value; - - } - - /** - * This method is automatically called when the object is cloned. - * Specifically, this will ensure all child elements are also cloned. - * - * @return void - */ - public function __clone() { - - foreach($this->parameters as $key=>$child) { - $this->parameters[$key] = clone $child; - $this->parameters[$key]->parent = $this; - } - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $warnings = array(); - - // Checking if our value is UTF-8 - if (!StringUtil::isUTF8($this->value)) { - $warnings[] = array( - 'level' => 1, - 'message' => 'Property is not valid UTF-8!', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->value = StringUtil::convertToUTF8($this->value); - } - } - - // Checking if the propertyname does not contain any invalid bytes. - if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', - 'node' => $this, - ); - if ($options & self::REPAIR) { - // Uppercasing and converting underscores to dashes. - $this->name = strtoupper( - str_replace('_', '-', $this->name) - ); - // Removing every other invalid character - $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); - - } - - } - - // Validating inner parameters - foreach($this->parameters as $param) { - $warnings = array_merge($warnings, $param->validate($options)); - } - - return $warnings; - - } - -} diff --git a/3rdparty/Sabre/VObject/Property/Compound.php b/3rdparty/Sabre/VObject/Property/Compound.php deleted file mode 100644 index e2c18e7726..0000000000 --- a/3rdparty/Sabre/VObject/Property/Compound.php +++ /dev/null @@ -1,129 +0,0 @@ - ';', - 'ADR' => ';', - 'ORG' => ';', - 'CATEGORIES' => ',', - ); - - /** - * The currently used delimiter. - * - * @var string - */ - protected $delimiter = null; - - /** - * Get a compound value as an array. - * - * @param $name string - * @return array - */ - public function getParts() { - - if (is_null($this->value)) { - return array(); - } - - $delimiter = $this->getDelimiter(); - - // split by any $delimiter which is NOT prefixed by a slash. - // Note that this is not a a perfect solution. If a value is prefixed - // by two slashes, it should actually be split anyway. - // - // Hopefully we can fix this better in a future version, where we can - // break compatibility a bit. - $compoundValues = preg_split("/(?value); - - // remove slashes from any semicolon and comma left escaped in the single values - $compoundValues = array_map( - function($val) { - return strtr($val, array('\,' => ',', '\;' => ';')); - }, $compoundValues); - - return $compoundValues; - - } - - /** - * Returns the delimiter for this property. - * - * @return string - */ - public function getDelimiter() { - - if (!$this->delimiter) { - if (isset(self::$delimiterMap[$this->name])) { - $this->delimiter = self::$delimiterMap[$this->name]; - } else { - // To be a bit future proof, we are going to default the - // delimiter to ; - $this->delimiter = ';'; - } - } - return $this->delimiter; - - } - - /** - * Set a compound value as an array. - * - * - * @param $name string - * @return array - */ - public function setParts(array $values) { - - // add slashes to all semicolons and commas in the single values - $values = array_map( - function($val) { - return strtr($val, array(',' => '\,', ';' => '\;')); - }, $values); - - $this->setValue( - implode($this->getDelimiter(), $values) - ); - - } - -} diff --git a/3rdparty/Sabre/VObject/Property/DateTime.php b/3rdparty/Sabre/VObject/Property/DateTime.php deleted file mode 100644 index 556cd441d8..0000000000 --- a/3rdparty/Sabre/VObject/Property/DateTime.php +++ /dev/null @@ -1,233 +0,0 @@ -setValue($dt->format('Ymd\\THis')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case self::UTC : - $dt->setTimeZone(new \DateTimeZone('UTC')); - $this->setValue($dt->format('Ymd\\THis\\Z')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case self::LOCALTZ : - $this->setValue($dt->format('Ymd\\THis')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - $this->offsetSet('TZID', $dt->getTimeZone()->getName()); - break; - case self::DATE : - $this->setValue($dt->format('Ymd')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE'); - break; - default : - throw new \InvalidArgumentException('You must pass a valid dateType constant'); - - } - $this->dateTime = $dt; - $this->dateType = $dateType; - - } - - /** - * Returns the current DateTime value. - * - * If no value was set, this method returns null. - * - * @return \DateTime|null - */ - public function getDateTime() { - - if ($this->dateTime) - return $this->dateTime; - - list( - $this->dateType, - $this->dateTime - ) = self::parseData($this->value, $this); - return $this->dateTime; - - } - - /** - * Returns the type of Date format. - * - * This method returns one of the format constants. If no date was set, - * this method will return null. - * - * @return int|null - */ - public function getDateType() { - - if ($this->dateType) - return $this->dateType; - - list( - $this->dateType, - $this->dateTime, - ) = self::parseData($this->value, $this); - return $this->dateType; - - } - - /** - * Parses the internal data structure to figure out what the current date - * and time is. - * - * The returned array contains two elements: - * 1. A 'DateType' constant (as defined on this class), or null. - * 2. A DateTime object (or null) - * - * @param string|null $propertyValue The string to parse (yymmdd or - * ymmddThhmmss, etc..) - * @param \Sabre\VObject\Property|null $property The instance of the - * property we're parsing. - * @return array - */ - static public function parseData($propertyValue, VObject\Property $property = null) { - - if (is_null($propertyValue)) { - return array(null, null); - } - - $date = '(?P[1-2][0-9]{3})(?P[0-1][0-9])(?P[0-3][0-9])'; - $time = '(?P[0-2][0-9])(?P[0-5][0-9])(?P[0-5][0-9])'; - $regex = "/^$date(T$time(?PZ)?)?$/"; - - if (!preg_match($regex, $propertyValue, $matches)) { - throw new \InvalidArgumentException($propertyValue . ' is not a valid \DateTime or Date string'); - } - - if (!isset($matches['hour'])) { - // Date-only - return array( - self::DATE, - new \DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00', new \DateTimeZone('UTC')), - ); - } - - $dateStr = - $matches['year'] .'-' . - $matches['month'] . '-' . - $matches['date'] . ' ' . - $matches['hour'] . ':' . - $matches['minute'] . ':' . - $matches['second']; - - if (isset($matches['isutc'])) { - $dt = new \DateTime($dateStr,new \DateTimeZone('UTC')); - $dt->setTimeZone(new \DateTimeZone('UTC')); - return array( - self::UTC, - $dt - ); - } - - // Finding the timezone. - $tzid = $property['TZID']; - if (!$tzid) { - // This was a floating time string. This implies we use the - // timezone from date_default_timezone_set / date.timezone ini - // setting. - return array( - self::LOCAL, - new \DateTime($dateStr) - ); - } - - // To look up the timezone, we must first find the VCALENDAR component. - $root = $property; - while($root->parent) { - $root = $root->parent; - } - if ($root->name === 'VCALENDAR') { - $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid, $root); - } else { - $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid); - } - - $dt = new \DateTime($dateStr, $tz); - $dt->setTimeZone($tz); - - return array( - self::LOCALTZ, - $dt - ); - - } - -} diff --git a/3rdparty/Sabre/VObject/Property/MultiDateTime.php b/3rdparty/Sabre/VObject/Property/MultiDateTime.php deleted file mode 100644 index 629ef4a134..0000000000 --- a/3rdparty/Sabre/VObject/Property/MultiDateTime.php +++ /dev/null @@ -1,168 +0,0 @@ -offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - switch($dateType) { - - case DateTime::LOCAL : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd\\THis'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case DateTime::UTC : - $val = array(); - foreach($dt as $i) { - $i->setTimeZone(new \DateTimeZone('UTC')); - $val[] = $i->format('Ymd\\THis\\Z'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case DateTime::LOCALTZ : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd\\THis'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName()); - break; - case DateTime::DATE : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE'); - break; - default : - throw new \InvalidArgumentException('You must pass a valid dateType constant'); - - } - $this->dateTimes = $dt; - $this->dateType = $dateType; - - } - - /** - * Returns the current DateTime value. - * - * If no value was set, this method returns null. - * - * @return array|null - */ - public function getDateTimes() { - - if ($this->dateTimes) - return $this->dateTimes; - - $dts = array(); - - if (!$this->value) { - $this->dateTimes = null; - $this->dateType = null; - return null; - } - - foreach(explode(',',$this->value) as $val) { - list( - $type, - $dt - ) = DateTime::parseData($val, $this); - $dts[] = $dt; - $this->dateType = $type; - } - $this->dateTimes = $dts; - return $this->dateTimes; - - } - - /** - * Returns the type of Date format. - * - * This method returns one of the format constants. If no date was set, - * this method will return null. - * - * @return int|null - */ - public function getDateType() { - - if ($this->dateType) - return $this->dateType; - - if (!$this->value) { - $this->dateTimes = null; - $this->dateType = null; - return null; - } - - $dts = array(); - foreach(explode(',',$this->value) as $val) { - list( - $type, - $dt - ) = DateTime::parseData($val, $this); - $dts[] = $dt; - $this->dateType = $type; - } - $this->dateTimes = $dts; - return $this->dateType; - - } - -} diff --git a/3rdparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php deleted file mode 100644 index a24590cb38..0000000000 --- a/3rdparty/Sabre/VObject/Reader.php +++ /dev/null @@ -1,217 +0,0 @@ -add($parsedLine); - - if ($nextLine===false) - throw new ParseException('Invalid VObject. Document ended prematurely.'); - - } - - // Checking component name of the 'END:' line. - if (substr($nextLine,4)!==$obj->name) { - throw new ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"'); - } - next($lines); - - return $obj; - - } - - // Properties - //$result = preg_match('/(?P[A-Z0-9-]+)(?:;(?P^(?([^:^\"]|\"([^\"]*)\")*))?"; - $regex = "/^(?P$token)$parameters:(?P.*)$/i"; - - $result = preg_match($regex,$line,$matches); - - if (!$result) { - if ($options & self::OPTION_IGNORE_INVALID_LINES) { - return null; - } else { - throw new ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format'); - } - } - - $propertyName = strtoupper($matches['name']); - $propertyValue = preg_replace_callback('#(\\\\(\\\\|N|n))#',function($matches) { - if ($matches[2]==='n' || $matches[2]==='N') { - return "\n"; - } else { - return $matches[2]; - } - }, $matches['value']); - - $obj = Property::create($propertyName, $propertyValue); - - if ($matches['parameters']) { - - foreach(self::readParameters($matches['parameters']) as $param) { - $obj->add($param); - } - - } - - return $obj; - - - } - - /** - * Reads a parameter list from a property - * - * This method returns an array of Parameter - * - * @param string $parameters - * @return array - */ - static private function readParameters($parameters) { - - $token = '[A-Z0-9-]+'; - - $paramValue = '(?P[^\"^;]*|"[^"]*")'; - - $regex = "/(?<=^|;)(?P$token)(=$paramValue(?=$|;))?/i"; - preg_match_all($regex, $parameters, $matches, PREG_SET_ORDER); - - $params = array(); - foreach($matches as $match) { - - $value = isset($match['paramValue'])?$match['paramValue']:null; - - if (isset($value[0])) { - // Stripping quotes, if needed - if ($value[0] === '"') $value = substr($value,1,strlen($value)-2); - } else { - $value = ''; - } - - $value = preg_replace_callback('#(\\\\(\\\\|N|n|;|,))#',function($matches) { - if ($matches[2]==='n' || $matches[2]==='N') { - return "\n"; - } else { - return $matches[2]; - } - }, $value); - - $params[] = new Parameter($match['paramName'], $value); - - } - - return $params; - - } - - -} diff --git a/3rdparty/Sabre/VObject/RecurrenceIterator.php b/3rdparty/Sabre/VObject/RecurrenceIterator.php deleted file mode 100644 index 46c7f44780..0000000000 --- a/3rdparty/Sabre/VObject/RecurrenceIterator.php +++ /dev/null @@ -1,1061 +0,0 @@ - 0, - 'MO' => 1, - 'TU' => 2, - 'WE' => 3, - 'TH' => 4, - 'FR' => 5, - 'SA' => 6, - ); - - /** - * Mappings between the day number and english day name. - * - * @var array - */ - private $dayNames = array( - 0 => 'Sunday', - 1 => 'Monday', - 2 => 'Tuesday', - 3 => 'Wednesday', - 4 => 'Thursday', - 5 => 'Friday', - 6 => 'Saturday', - ); - - /** - * If the current iteration of the event is an overriden event, this - * property will hold the VObject - * - * @var Component - */ - private $currentOverriddenEvent; - - /** - * This property may contain the date of the next not-overridden event. - * This date is calculated sometimes a bit early, before overridden events - * are evaluated. - * - * @var DateTime - */ - private $nextDate; - - /** - * Creates the iterator - * - * You should pass a VCALENDAR component, as well as the UID of the event - * we're going to traverse. - * - * @param Component $vcal - * @param string|null $uid - */ - public function __construct(Component $vcal, $uid=null) { - - if (is_null($uid)) { - if ($vcal->name === 'VCALENDAR') { - throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); - } - $components = array($vcal); - $uid = (string)$vcal->uid; - } else { - $components = $vcal->select('VEVENT'); - } - foreach($components as $component) { - if ((string)$component->uid == $uid) { - if (isset($component->{'RECURRENCE-ID'})) { - $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component; - $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime(); - } else { - $this->baseEvent = $component; - } - } - } - if (!$this->baseEvent) { - throw new \InvalidArgumentException('Could not find a base event with uid: ' . $uid); - } - - $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); - - $this->endDate = null; - if (isset($this->baseEvent->DTEND)) { - $this->endDate = clone $this->baseEvent->DTEND->getDateTime(); - } else { - $this->endDate = clone $this->startDate; - if (isset($this->baseEvent->DURATION)) { - $this->endDate->add(DateTimeParser::parse($this->baseEvent->DURATION->value)); - } elseif ($this->baseEvent->DTSTART->getDateType()===Property\DateTime::DATE) { - $this->endDate->modify('+1 day'); - } - } - $this->currentDate = clone $this->startDate; - - $rrule = (string)$this->baseEvent->RRULE; - - $parts = explode(';', $rrule); - - // If no rrule was specified, we create a default setting - if (!$rrule) { - $this->frequency = 'daily'; - $this->count = 1; - } else foreach($parts as $part) { - - list($key, $value) = explode('=', $part, 2); - - switch(strtoupper($key)) { - - case 'FREQ' : - if (!in_array( - strtolower($value), - array('secondly','minutely','hourly','daily','weekly','monthly','yearly') - )) { - throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); - - } - $this->frequency = strtolower($value); - break; - - case 'UNTIL' : - $this->until = DateTimeParser::parse($value); - break; - - case 'COUNT' : - $this->count = (int)$value; - break; - - case 'INTERVAL' : - $this->interval = (int)$value; - if ($this->interval < 1) { - throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); - } - break; - - case 'BYSECOND' : - $this->bySecond = explode(',', $value); - break; - - case 'BYMINUTE' : - $this->byMinute = explode(',', $value); - break; - - case 'BYHOUR' : - $this->byHour = explode(',', $value); - break; - - case 'BYDAY' : - $this->byDay = explode(',', strtoupper($value)); - break; - - case 'BYMONTHDAY' : - $this->byMonthDay = explode(',', $value); - break; - - case 'BYYEARDAY' : - $this->byYearDay = explode(',', $value); - break; - - case 'BYWEEKNO' : - $this->byWeekNo = explode(',', $value); - break; - - case 'BYMONTH' : - $this->byMonth = explode(',', $value); - break; - - case 'BYSETPOS' : - $this->bySetPos = explode(',', $value); - break; - - case 'WKST' : - $this->weekStart = strtoupper($value); - break; - - } - - } - - // Parsing exception dates - if (isset($this->baseEvent->EXDATE)) { - foreach($this->baseEvent->EXDATE as $exDate) { - - foreach(explode(',', (string)$exDate) as $exceptionDate) { - - $this->exceptionDates[] = - DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); - - } - - } - - } - - } - - /** - * Returns the current item in the list - * - * @return DateTime - */ - public function current() { - - if (!$this->valid()) return null; - return clone $this->currentDate; - - } - - /** - * This method returns the startdate for the current iteration of the - * event. - * - * @return DateTime - */ - public function getDtStart() { - - if (!$this->valid()) return null; - return clone $this->currentDate; - - } - - /** - * This method returns the enddate for the current iteration of the - * event. - * - * @return DateTime - */ - public function getDtEnd() { - - if (!$this->valid()) return null; - $dtEnd = clone $this->currentDate; - $dtEnd->add( $this->startDate->diff( $this->endDate ) ); - return clone $dtEnd; - - } - - /** - * Returns a VEVENT object with the updated start and end date. - * - * Any recurrence information is removed, and this function may return an - * 'overridden' event instead. - * - * This method always returns a cloned instance. - * - * @return Component\VEvent - */ - public function getEventObject() { - - if ($this->currentOverriddenEvent) { - return clone $this->currentOverriddenEvent; - } - $event = clone $this->baseEvent; - unset($event->RRULE); - unset($event->EXDATE); - unset($event->RDATE); - unset($event->EXRULE); - - $event->DTSTART->setDateTime($this->getDTStart(), $event->DTSTART->getDateType()); - if (isset($event->DTEND)) { - $event->DTEND->setDateTime($this->getDtEnd(), $event->DTSTART->getDateType()); - } - if ($this->counter > 0) { - $event->{'RECURRENCE-ID'} = (string)$event->DTSTART; - } - - return $event; - - } - - /** - * Returns the current item number - * - * @return int - */ - public function key() { - - return $this->counter; - - } - - /** - * Whether or not there is a 'next item' - * - * @return bool - */ - public function valid() { - - if (!is_null($this->count)) { - return $this->counter < $this->count; - } - if (!is_null($this->until)) { - return $this->currentDate <= $this->until; - } - return true; - - } - - /** - * Resets the iterator - * - * @return void - */ - public function rewind() { - - $this->currentDate = clone $this->startDate; - $this->counter = 0; - - } - - /** - * This method allows you to quickly go to the next occurrence after the - * specified date. - * - * Note that this checks the current 'endDate', not the 'stardDate'. This - * means that if you forward to January 1st, the iterator will stop at the - * first event that ends *after* January 1st. - * - * @param DateTime $dt - * @return void - */ - public function fastForward(\DateTime $dt) { - - while($this->valid() && $this->getDTEnd() <= $dt) { - $this->next(); - } - - } - - /** - * Returns true if this recurring event never ends. - * - * @return bool - */ - public function isInfinite() { - - return !$this->count && !$this->until; - - } - - /** - * Goes on to the next iteration - * - * @return void - */ - public function next() { - - /* - if (!is_null($this->count) && $this->counter >= $this->count) { - $this->currentDate = null; - }*/ - - - $previousStamp = $this->currentDate->getTimeStamp(); - - while(true) { - - $this->currentOverriddenEvent = null; - - // If we have a next date 'stored', we use that - if ($this->nextDate) { - $this->currentDate = $this->nextDate; - $currentStamp = $this->currentDate->getTimeStamp(); - $this->nextDate = null; - } else { - - // Otherwise, we calculate it - switch($this->frequency) { - - case 'daily' : - $this->nextDaily(); - break; - - case 'weekly' : - $this->nextWeekly(); - break; - - case 'monthly' : - $this->nextMonthly(); - break; - - case 'yearly' : - $this->nextYearly(); - break; - - } - $currentStamp = $this->currentDate->getTimeStamp(); - - // Checking exception dates - foreach($this->exceptionDates as $exceptionDate) { - if ($this->currentDate == $exceptionDate) { - $this->counter++; - continue 2; - } - } - foreach($this->overriddenDates as $overriddenDate) { - if ($this->currentDate == $overriddenDate) { - continue 2; - } - } - - } - - // Checking overridden events - foreach($this->overriddenEvents as $index=>$event) { - if ($index > $previousStamp && $index <= $currentStamp) { - - // We're moving the 'next date' aside, for later use. - $this->nextDate = clone $this->currentDate; - - $this->currentDate = $event->DTSTART->getDateTime(); - $this->currentOverriddenEvent = $event; - - break; - } - } - - break; - - } - - /* - if (!is_null($this->until)) { - if($this->currentDate > $this->until) { - $this->currentDate = null; - } - }*/ - - $this->counter++; - - } - - /** - * Does the processing for advancing the iterator for daily frequency. - * - * @return void - */ - protected function nextDaily() { - - if (!$this->byDay) { - $this->currentDate->modify('+' . $this->interval . ' days'); - return; - } - - $recurrenceDays = array(); - foreach($this->byDay as $byDay) { - - // The day may be preceeded with a positive (+n) or - // negative (-n) integer. However, this does not make - // sense in 'weekly' so we ignore it here. - $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; - - } - - do { - - $this->currentDate->modify('+' . $this->interval . ' days'); - - // Current day of the week - $currentDay = $this->currentDate->format('w'); - - } while (!in_array($currentDay, $recurrenceDays)); - - } - - /** - * Does the processing for advancing the iterator for weekly frequency. - * - * @return void - */ - protected function nextWeekly() { - - if (!$this->byDay) { - $this->currentDate->modify('+' . $this->interval . ' weeks'); - return; - } - - $recurrenceDays = array(); - foreach($this->byDay as $byDay) { - - // The day may be preceeded with a positive (+n) or - // negative (-n) integer. However, this does not make - // sense in 'weekly' so we ignore it here. - $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; - - } - - // Current day of the week - $currentDay = $this->currentDate->format('w'); - - // First day of the week: - $firstDay = $this->dayMap[$this->weekStart]; - - $time = array( - $this->currentDate->format('H'), - $this->currentDate->format('i'), - $this->currentDate->format('s') - ); - - // Increasing the 'current day' until we find our next - // occurrence. - while(true) { - - $currentDay++; - - if ($currentDay>6) { - $currentDay = 0; - } - - // We need to roll over to the next week - if ($currentDay === $firstDay) { - $this->currentDate->modify('+' . $this->interval . ' weeks'); - - // We need to go to the first day of this week, but only if we - // are not already on this first day of this week. - if($this->currentDate->format('w') != $firstDay) { - $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); - $this->currentDate->setTime($time[0],$time[1],$time[2]); - } - } - - // We have a match - if (in_array($currentDay ,$recurrenceDays)) { - $this->currentDate->modify($this->dayNames[$currentDay]); - $this->currentDate->setTime($time[0],$time[1],$time[2]); - break; - } - - } - - } - - /** - * Does the processing for advancing the iterator for monthly frequency. - * - * @return void - */ - protected function nextMonthly() { - - $currentDayOfMonth = $this->currentDate->format('j'); - if (!$this->byMonthDay && !$this->byDay) { - - // If the current day is higher than the 28th, rollover can - // occur to the next month. We Must skip these invalid - // entries. - if ($currentDayOfMonth < 29) { - $this->currentDate->modify('+' . $this->interval . ' months'); - } else { - $increase = 0; - do { - $increase++; - $tempDate = clone $this->currentDate; - $tempDate->modify('+ ' . ($this->interval*$increase) . ' months'); - } while ($tempDate->format('j') != $currentDayOfMonth); - $this->currentDate = $tempDate; - } - return; - } - - while(true) { - - $occurrences = $this->getMonthlyOccurrences(); - - foreach($occurrences as $occurrence) { - - // The first occurrence thats higher than the current - // day of the month wins. - if ($occurrence > $currentDayOfMonth) { - break 2; - } - - } - - // If we made it all the way here, it means there were no - // valid occurrences, and we need to advance to the next - // month. - $this->currentDate->modify('first day of this month'); - $this->currentDate->modify('+ ' . $this->interval . ' months'); - - // This goes to 0 because we need to start counting at hte - // beginning. - $currentDayOfMonth = 0; - - } - - $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence); - - } - - /** - * Does the processing for advancing the iterator for yearly frequency. - * - * @return void - */ - protected function nextYearly() { - - $currentMonth = $this->currentDate->format('n'); - $currentYear = $this->currentDate->format('Y'); - $currentDayOfMonth = $this->currentDate->format('j'); - - // No sub-rules, so we just advance by year - if (!$this->byMonth) { - - // Unless it was a leap day! - if ($currentMonth==2 && $currentDayOfMonth==29) { - - $counter = 0; - do { - $counter++; - // Here we increase the year count by the interval, until - // we hit a date that's also in a leap year. - // - // We could just find the next interval that's dividable by - // 4, but that would ignore the rule that there's no leap - // year every year that's dividable by a 100, but not by - // 400. (1800, 1900, 2100). So we just rely on the datetime - // functions instead. - $nextDate = clone $this->currentDate; - $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); - } while ($nextDate->format('n')!=2); - $this->currentDate = $nextDate; - - return; - - } - - // The easiest form - $this->currentDate->modify('+' . $this->interval . ' years'); - return; - - } - - $currentMonth = $this->currentDate->format('n'); - $currentYear = $this->currentDate->format('Y'); - $currentDayOfMonth = $this->currentDate->format('j'); - - $advancedToNewMonth = false; - - // If we got a byDay or getMonthDay filter, we must first expand - // further. - if ($this->byDay || $this->byMonthDay) { - - while(true) { - - $occurrences = $this->getMonthlyOccurrences(); - - foreach($occurrences as $occurrence) { - - // The first occurrence that's higher than the current - // day of the month wins. - // If we advanced to the next month or year, the first - // occurrence is always correct. - if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { - break 2; - } - - } - - // If we made it here, it means we need to advance to - // the next month or year. - $currentDayOfMonth = 1; - $advancedToNewMonth = true; - do { - - $currentMonth++; - if ($currentMonth>12) { - $currentYear+=$this->interval; - $currentMonth = 1; - } - } while (!in_array($currentMonth, $this->byMonth)); - - $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); - - } - - // If we made it here, it means we got a valid occurrence - $this->currentDate->setDate($currentYear, $currentMonth, $occurrence); - return; - - } else { - - // These are the 'byMonth' rules, if there are no byDay or - // byMonthDay sub-rules. - do { - - $currentMonth++; - if ($currentMonth>12) { - $currentYear+=$this->interval; - $currentMonth = 1; - } - } while (!in_array($currentMonth, $this->byMonth)); - $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); - - return; - - } - - } - - /** - * Returns all the occurrences for a monthly frequency with a 'byDay' or - * 'byMonthDay' expansion for the current month. - * - * The returned list is an array of integers with the day of month (1-31). - * - * @return array - */ - protected function getMonthlyOccurrences() { - - $startDate = clone $this->currentDate; - - $byDayResults = array(); - - // Our strategy is to simply go through the byDays, advance the date to - // that point and add it to the results. - if ($this->byDay) foreach($this->byDay as $day) { - - $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]]; - - // Dayname will be something like 'wednesday'. Now we need to find - // all wednesdays in this month. - $dayHits = array(); - - $checkDate = clone $startDate; - $checkDate->modify('first day of this month'); - $checkDate->modify($dayName); - - do { - $dayHits[] = $checkDate->format('j'); - $checkDate->modify('next ' . $dayName); - } while ($checkDate->format('n') === $startDate->format('n')); - - // So now we have 'all wednesdays' for month. It is however - // possible that the user only really wanted the 1st, 2nd or last - // wednesday. - if (strlen($day)>2) { - $offset = (int)substr($day,0,-2); - - if ($offset>0) { - // It is possible that the day does not exist, such as a - // 5th or 6th wednesday of the month. - if (isset($dayHits[$offset-1])) { - $byDayResults[] = $dayHits[$offset-1]; - } - } else { - - // if it was negative we count from the end of the array - $byDayResults[] = $dayHits[count($dayHits) + $offset]; - } - } else { - // There was no counter (first, second, last wednesdays), so we - // just need to add the all to the list). - $byDayResults = array_merge($byDayResults, $dayHits); - - } - - } - - $byMonthDayResults = array(); - if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) { - - // Removing values that are out of range for this month - if ($monthDay > $startDate->format('t') || - $monthDay < 0-$startDate->format('t')) { - continue; - } - if ($monthDay>0) { - $byMonthDayResults[] = $monthDay; - } else { - // Negative values - $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; - } - } - - // If there was just byDay or just byMonthDay, they just specify our - // (almost) final list. If both were provided, then byDay limits the - // list. - if ($this->byMonthDay && $this->byDay) { - $result = array_intersect($byMonthDayResults, $byDayResults); - } elseif ($this->byMonthDay) { - $result = $byMonthDayResults; - } else { - $result = $byDayResults; - } - $result = array_unique($result); - sort($result, SORT_NUMERIC); - - // The last thing that needs checking is the BYSETPOS. If it's set, it - // means only certain items in the set survive the filter. - if (!$this->bySetPos) { - return $result; - } - - $filteredResult = array(); - foreach($this->bySetPos as $setPos) { - - if ($setPos<0) { - $setPos = count($result)-($setPos+1); - } - if (isset($result[$setPos-1])) { - $filteredResult[] = $result[$setPos-1]; - } - } - - sort($filteredResult, SORT_NUMERIC); - return $filteredResult; - - } - - -} - diff --git a/3rdparty/Sabre/VObject/Splitter/ICalendar.php b/3rdparty/Sabre/VObject/Splitter/ICalendar.php deleted file mode 100644 index 7a9a63e1b2..0000000000 --- a/3rdparty/Sabre/VObject/Splitter/ICalendar.php +++ /dev/null @@ -1,111 +0,0 @@ -children as $component) { - if (!$component instanceof VObject\Component) { - continue; - } - - // Get all timezones - if ($component->name === 'VTIMEZONE') { - $this->vtimezones[(string)$component->TZID] = $component; - continue; - } - - // Get component UID for recurring Events search - if($component->UID) { - $uid = (string)$component->UID; - } else { - // Generating a random UID - $uid = sha1(microtime()) . '-vobjectimport'; - } - - // Take care of recurring events - if (!array_key_exists($uid, $this->objects)) { - $this->objects[$uid] = VObject\Component::create('VCALENDAR'); - } - - $this->objects[$uid]->add(clone $component); - } - - } - - /** - * Every time getNext() is called, a new object will be parsed, until we - * hit the end of the stream. - * - * When the end is reached, null will be returned. - * - * @return Sabre\VObject\Component|null - */ - public function getNext() { - - if($object=array_shift($this->objects)) { - - // create our baseobject - $object->version = '2.0'; - $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; - $object->calscale = 'GREGORIAN'; - - // add vtimezone information to obj (if we have it) - foreach ($this->vtimezones as $vtimezone) { - $object->add($vtimezone); - } - - return $object; - - } else { - - return null; - - } - - } - -} diff --git a/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php b/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php deleted file mode 100644 index 9f7a82450e..0000000000 --- a/3rdparty/Sabre/VObject/Splitter/SplitterInterface.php +++ /dev/null @@ -1,39 +0,0 @@ -input = $input; - - } - - /** - * Every time getNext() is called, a new object will be parsed, until we - * hit the end of the stream. - * - * When the end is reached, null will be returned. - * - * @return Sabre\VObject\Component|null - */ - public function getNext() { - - $vcard = ''; - - do { - - if (feof($this->input)) { - return false; - } - - $line = fgets($this->input); - $vcard .= $line; - - } while(strtoupper(substr($line,0,4))!=="END:"); - - $object = VObject\Reader::read($vcard); - - if($object->name !== 'VCARD') { - throw new \InvalidArgumentException("Thats no vCard!", 1); - } - - return $object; - - } - -} diff --git a/3rdparty/Sabre/VObject/StringUtil.php b/3rdparty/Sabre/VObject/StringUtil.php deleted file mode 100644 index 886a7135d6..0000000000 --- a/3rdparty/Sabre/VObject/StringUtil.php +++ /dev/null @@ -1,61 +0,0 @@ -'Australia/Darwin', - 'AUS Eastern Standard Time'=>'Australia/Sydney', - 'Afghanistan Standard Time'=>'Asia/Kabul', - 'Alaskan Standard Time'=>'America/Anchorage', - 'Arab Standard Time'=>'Asia/Riyadh', - 'Arabian Standard Time'=>'Asia/Dubai', - 'Arabic Standard Time'=>'Asia/Baghdad', - 'Argentina Standard Time'=>'America/Buenos_Aires', - 'Armenian Standard Time'=>'Asia/Yerevan', - 'Atlantic Standard Time'=>'America/Halifax', - 'Azerbaijan Standard Time'=>'Asia/Baku', - 'Azores Standard Time'=>'Atlantic/Azores', - 'Bangladesh Standard Time'=>'Asia/Dhaka', - 'Canada Central Standard Time'=>'America/Regina', - 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', - 'Caucasus Standard Time'=>'Asia/Yerevan', - 'Cen. Australia Standard Time'=>'Australia/Adelaide', - 'Central America Standard Time'=>'America/Guatemala', - 'Central Asia Standard Time'=>'Asia/Almaty', - 'Central Brazilian Standard Time'=>'America/Cuiaba', - 'Central Europe Standard Time'=>'Europe/Budapest', - 'Central European Standard Time'=>'Europe/Warsaw', - 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', - 'Central Standard Time'=>'America/Chicago', - 'Central Standard Time (Mexico)'=>'America/Mexico_City', - 'China Standard Time'=>'Asia/Shanghai', - 'Dateline Standard Time'=>'Etc/GMT+12', - 'E. Africa Standard Time'=>'Africa/Nairobi', - 'E. Australia Standard Time'=>'Australia/Brisbane', - 'E. Europe Standard Time'=>'Europe/Minsk', - 'E. South America Standard Time'=>'America/Sao_Paulo', - 'Eastern Standard Time'=>'America/New_York', - 'Egypt Standard Time'=>'Africa/Cairo', - 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', - 'FLE Standard Time'=>'Europe/Kiev', - 'Fiji Standard Time'=>'Pacific/Fiji', - 'GMT Standard Time'=>'Europe/London', - 'GTB Standard Time'=>'Europe/Istanbul', - 'Georgian Standard Time'=>'Asia/Tbilisi', - 'Greenland Standard Time'=>'America/Godthab', - 'Greenwich Standard Time'=>'Atlantic/Reykjavik', - 'Hawaiian Standard Time'=>'Pacific/Honolulu', - 'India Standard Time'=>'Asia/Calcutta', - 'Iran Standard Time'=>'Asia/Tehran', - 'Israel Standard Time'=>'Asia/Jerusalem', - 'Jordan Standard Time'=>'Asia/Amman', - 'Kamchatka Standard Time'=>'Asia/Kamchatka', - 'Korea Standard Time'=>'Asia/Seoul', - 'Magadan Standard Time'=>'Asia/Magadan', - 'Mauritius Standard Time'=>'Indian/Mauritius', - 'Mexico Standard Time'=>'America/Mexico_City', - 'Mexico Standard Time 2'=>'America/Chihuahua', - 'Mid-Atlantic Standard Time'=>'Etc/GMT+2', - 'Middle East Standard Time'=>'Asia/Beirut', - 'Montevideo Standard Time'=>'America/Montevideo', - 'Morocco Standard Time'=>'Africa/Casablanca', - 'Mountain Standard Time'=>'America/Denver', - 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', - 'Myanmar Standard Time'=>'Asia/Rangoon', - 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', - 'Namibia Standard Time'=>'Africa/Windhoek', - 'Nepal Standard Time'=>'Asia/Katmandu', - 'New Zealand Standard Time'=>'Pacific/Auckland', - 'Newfoundland Standard Time'=>'America/St_Johns', - 'North Asia East Standard Time'=>'Asia/Irkutsk', - 'North Asia Standard Time'=>'Asia/Krasnoyarsk', - 'Pacific SA Standard Time'=>'America/Santiago', - 'Pacific Standard Time'=>'America/Los_Angeles', - 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', - 'Pakistan Standard Time'=>'Asia/Karachi', - 'Paraguay Standard Time'=>'America/Asuncion', - 'Romance Standard Time'=>'Europe/Paris', - 'Russian Standard Time'=>'Europe/Moscow', - 'SA Eastern Standard Time'=>'America/Cayenne', - 'SA Pacific Standard Time'=>'America/Bogota', - 'SA Western Standard Time'=>'America/La_Paz', - 'SE Asia Standard Time'=>'Asia/Bangkok', - 'Samoa Standard Time'=>'Pacific/Apia', - 'Singapore Standard Time'=>'Asia/Singapore', - 'South Africa Standard Time'=>'Africa/Johannesburg', - 'Sri Lanka Standard Time'=>'Asia/Colombo', - 'Syria Standard Time'=>'Asia/Damascus', - 'Taipei Standard Time'=>'Asia/Taipei', - 'Tasmania Standard Time'=>'Australia/Hobart', - 'Tokyo Standard Time'=>'Asia/Tokyo', - 'Tonga Standard Time'=>'Pacific/Tongatapu', - 'US Eastern Standard Time'=>'America/Indianapolis', - 'US Mountain Standard Time'=>'America/Phoenix', - 'UTC'=>'Etc/GMT', - 'UTC+12'=>'Etc/GMT-12', - 'UTC-02'=>'Etc/GMT+2', - 'UTC-11'=>'Etc/GMT+11', - 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', - 'Venezuela Standard Time'=>'America/Caracas', - 'Vladivostok Standard Time'=>'Asia/Vladivostok', - 'W. Australia Standard Time'=>'Australia/Perth', - 'W. Central Africa Standard Time'=>'Africa/Lagos', - 'W. Europe Standard Time'=>'Europe/Berlin', - 'West Asia Standard Time'=>'Asia/Tashkent', - 'West Pacific Standard Time'=>'Pacific/Port_Moresby', - 'Yakutsk Standard Time'=>'Asia/Yakutsk', - - // Microsoft exchange timezones - // Source: - // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx - // - // Correct timezones deduced with help from: - // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones - 'Universal Coordinated Time' => 'UTC', - 'Casablanca, Monrovia' => 'Africa/Casablanca', - 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', - 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', - 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', - 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', - 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', - 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', - 'Prague, Central Europe' => 'Europe/Prague', - 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', - 'West Central Africa' => 'Africa/Luanda', // This was a best guess - 'Athens, Istanbul, Minsk' => 'Europe/Athens', - 'Bucharest' => 'Europe/Bucharest', - 'Cairo' => 'Africa/Cairo', - 'Harare, Pretoria' => 'Africa/Harare', - 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', - 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', - 'Baghdad' => 'Asia/Baghdad', - 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', - 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', - 'East Africa, Nairobi' => 'Africa/Nairobi', - 'Tehran' => 'Asia/Tehran', - 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess - 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', - 'Kabul' => 'Asia/Kabul', - 'Ekaterinburg' => 'Asia/Yekaterinburg', - 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', - 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', - 'Kathmandu, Nepal' => 'Asia/Kathmandu', - 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', - 'Astana, Dhaka' => 'Asia/Dhaka', - 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', - 'Rangoon' => 'Asia/Rangoon', - 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', - 'Krasnoyarsk' => 'Asia/Krasnoyarsk', - 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', - 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', - 'Kuala Lumpur, Singapore' => 'Asia/Singapore', - 'Perth, Western Australia' => 'Australia/Perth', - 'Taipei' => 'Asia/Taipei', - 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', - 'Seoul, Korea Standard time' => 'Asia/Seoul', - 'Yakutsk' => 'Asia/Yakutsk', - 'Adelaide, Central Australia' => 'Australia/Adelaide', - 'Darwin' => 'Australia/Darwin', - 'Brisbane, East Australia' => 'Australia/Brisbane', - 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', - 'Guam, Port Moresby' => 'Pacific/Guam', - 'Hobart, Tasmania' => 'Australia/Hobart', - 'Vladivostok' => 'Asia/Vladivostok', - 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', - 'Auckland, Wellington' => 'Pacific/Auckland', - 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', - 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', - 'Azores' => 'Atlantic/Azores', - 'Cape Verde Is.' => 'Atlantic/Cape_Verde', - 'Mid-Atlantic' => 'America/Noronha', - 'Brasilia' => 'America/Sao_Paulo', // Best guess - 'Buenos Aires' => 'America/Argentina/Buenos_Aires', - 'Greenland' => 'America/Godthab', - 'Newfoundland' => 'America/St_Johns', - 'Atlantic Time (Canada)' => 'America/Halifax', - 'Caracas, La Paz' => 'America/Caracas', - 'Santiago' => 'America/Santiago', - 'Bogota, Lima, Quito' => 'America/Bogota', - 'Eastern Time (US & Canada)' => 'America/New_York', - 'Indiana (East)' => 'America/Indiana/Indianapolis', - 'Central America' => 'America/Guatemala', - 'Central Time (US & Canada)' => 'America/Chicago', - 'Mexico City, Tegucigalpa' => 'America/Mexico_City', - 'Saskatchewan' => 'America/Edmonton', - 'Arizona' => 'America/Phoenix', - 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess - 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess - 'Alaska' => 'America/Anchorage', - 'Hawaii' => 'Pacific/Honolulu', - 'Midway Island, Samoa' => 'Pacific/Midway', - 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', - - ); - - public static $microsoftExchangeMap = array( - 0 => 'UTC', - 31 => 'Africa/Casablanca', - 2 => 'Europe/Lisbon', - 1 => 'Europe/London', - 4 => 'Europe/Berlin', - 6 => 'Europe/Prague', - 3 => 'Europe/Paris', - 69 => 'Africa/Luanda', // This was a best guess - 7 => 'Europe/Athens', - 5 => 'Europe/Bucharest', - 49 => 'Africa/Cairo', - 50 => 'Africa/Harare', - 59 => 'Europe/Helsinki', - 27 => 'Asia/Jerusalem', - 26 => 'Asia/Baghdad', - 74 => 'Asia/Kuwait', - 51 => 'Europe/Moscow', - 56 => 'Africa/Nairobi', - 25 => 'Asia/Tehran', - 24 => 'Asia/Muscat', // Best guess - 54 => 'Asia/Baku', - 48 => 'Asia/Kabul', - 58 => 'Asia/Yekaterinburg', - 47 => 'Asia/Karachi', - 23 => 'Asia/Calcutta', - 62 => 'Asia/Kathmandu', - 46 => 'Asia/Almaty', - 71 => 'Asia/Dhaka', - 66 => 'Asia/Colombo', - 61 => 'Asia/Rangoon', - 22 => 'Asia/Bangkok', - 64 => 'Asia/Krasnoyarsk', - 45 => 'Asia/Shanghai', - 63 => 'Asia/Irkutsk', - 21 => 'Asia/Singapore', - 73 => 'Australia/Perth', - 75 => 'Asia/Taipei', - 20 => 'Asia/Tokyo', - 72 => 'Asia/Seoul', - 70 => 'Asia/Yakutsk', - 19 => 'Australia/Adelaide', - 44 => 'Australia/Darwin', - 18 => 'Australia/Brisbane', - 76 => 'Australia/Sydney', - 43 => 'Pacific/Guam', - 42 => 'Australia/Hobart', - 68 => 'Asia/Vladivostok', - 41 => 'Asia/Magadan', - 17 => 'Pacific/Auckland', - 40 => 'Pacific/Fiji', - 67 => 'Pacific/Tongatapu', - 29 => 'Atlantic/Azores', - 53 => 'Atlantic/Cape_Verde', - 30 => 'America/Noronha', - 8 => 'America/Sao_Paulo', // Best guess - 32 => 'America/Argentina/Buenos_Aires', - 60 => 'America/Godthab', - 28 => 'America/St_Johns', - 9 => 'America/Halifax', - 33 => 'America/Caracas', - 65 => 'America/Santiago', - 35 => 'America/Bogota', - 10 => 'America/New_York', - 34 => 'America/Indiana/Indianapolis', - 55 => 'America/Guatemala', - 11 => 'America/Chicago', - 37 => 'America/Mexico_City', - 36 => 'America/Edmonton', - 38 => 'America/Phoenix', - 12 => 'America/Denver', // Best guess - 13 => 'America/Los_Angeles', // Best guess - 14 => 'America/Anchorage', - 15 => 'Pacific/Honolulu', - 16 => 'Pacific/Midway', - 39 => 'Pacific/Kwajalein', - ); - - /** - * This method will try to find out the correct timezone for an iCalendar - * date-time value. - * - * You must pass the contents of the TZID parameter, as well as the full - * calendar. - * - * If the lookup fails, this method will return UTC. - * - * @param string $tzid - * @param Sabre\VObject\Component $vcalendar - * @return DateTimeZone - */ - static public function getTimeZone($tzid, Component $vcalendar = null) { - - // First we will just see if the tzid is a support timezone identifier. - try { - return new \DateTimeZone($tzid); - } catch (\Exception $e) { - } - - // Next, we check if the tzid is somewhere in our tzid map. - if (isset(self::$map[$tzid])) { - return new \DateTimeZone(self::$map[$tzid]); - } - - if ($vcalendar) { - - // If that didn't work, we will scan VTIMEZONE objects - foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { - - if ((string)$vtimezone->TZID === $tzid) { - - // Some clients add 'X-LIC-LOCATION' with the olson name. - if (isset($vtimezone->{'X-LIC-LOCATION'})) { - try { - return new \DateTimeZone($vtimezone->{'X-LIC-LOCATION'}); - } catch (\Exception $e) { - } - - } - // Microsoft may add a magic number, which we also have an - // answer for. - if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { - if (isset(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value])) { - return new \DateTimeZone(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value]); - } - } - } - - } - - } - - // If we got all the way here, we default to UTC. - return new \DateTimeZone(date_default_timezone_get()); - - - } - - -} diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php deleted file mode 100644 index 0065b7abc9..0000000000 --- a/3rdparty/Sabre/VObject/Version.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 1997-2009 The Authors - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: System.php 313024 2011-07-06 19:51:24Z dufuz $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/** - * base class - */ -require_once 'PEAR.php'; -require_once 'Console/Getopt.php'; - -$GLOBALS['_System_temp_files'] = array(); - -/** -* System offers cross plattform compatible system functions -* -* Static functions for different operations. Should work under -* Unix and Windows. The names and usage has been taken from its respectively -* GNU commands. The functions will return (bool) false on error and will -* trigger the error with the PHP trigger_error() function (you can silence -* the error by prefixing a '@' sign after the function call, but this -* is not recommended practice. Instead use an error handler with -* {@link set_error_handler()}). -* -* Documentation on this class you can find in: -* http://pear.php.net/manual/ -* -* Example usage: -* if (!@System::rm('-r file1 dir1')) { -* print "could not delete file1 or dir1"; -* } -* -* In case you need to to pass file names with spaces, -* pass the params as an array: -* -* System::rm(array('-r', $file1, $dir1)); -* -* @category pear -* @package System -* @author Tomas V.V. Cox -* @copyright 1997-2006 The PHP Group -* @license http://opensource.org/licenses/bsd-license.php New BSD License -* @version Release: 1.9.4 -* @link http://pear.php.net/package/PEAR -* @since Class available since Release 0.1 -* @static -*/ -class System -{ - /** - * returns the commandline arguments of a function - * - * @param string $argv the commandline - * @param string $short_options the allowed option short-tags - * @param string $long_options the allowed option long-tags - * @return array the given options and there values - * @static - * @access private - */ - function _parseArgs($argv, $short_options, $long_options = null) - { - if (!is_array($argv) && $argv !== null) { - // Find all items, quoted or otherwise - preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av); - $argv = $av[1]; - foreach ($av[2] as $k => $a) { - if (empty($a)) { - continue; - } - $argv[$k] = trim($a) ; - } - } - return Console_Getopt::getopt2($argv, $short_options, $long_options); - } - - /** - * Output errors with PHP trigger_error(). You can silence the errors - * with prefixing a "@" sign to the function call: @System::mkdir(..); - * - * @param mixed $error a PEAR error or a string with the error message - * @return bool false - * @static - * @access private - */ - function raiseError($error) - { - if (PEAR::isError($error)) { - $error = $error->getMessage(); - } - trigger_error($error, E_USER_WARNING); - return false; - } - - /** - * Creates a nested array representing the structure of a directory - * - * System::_dirToStruct('dir1', 0) => - * Array - * ( - * [dirs] => Array - * ( - * [0] => dir1 - * ) - * - * [files] => Array - * ( - * [0] => dir1/file2 - * [1] => dir1/file3 - * ) - * ) - * @param string $sPath Name of the directory - * @param integer $maxinst max. deep of the lookup - * @param integer $aktinst starting deep of the lookup - * @param bool $silent if true, do not emit errors. - * @return array the structure of the dir - * @static - * @access private - */ - function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false) - { - $struct = array('dirs' => array(), 'files' => array()); - if (($dir = @opendir($sPath)) === false) { - if (!$silent) { - System::raiseError("Could not open dir $sPath"); - } - return $struct; // XXX could not open error - } - - $struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ? - $list = array(); - while (false !== ($file = readdir($dir))) { - if ($file != '.' && $file != '..') { - $list[] = $file; - } - } - - closedir($dir); - natsort($list); - if ($aktinst < $maxinst || $maxinst == 0) { - foreach ($list as $val) { - $path = $sPath . DIRECTORY_SEPARATOR . $val; - if (is_dir($path) && !is_link($path)) { - $tmp = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent); - $struct = array_merge_recursive($struct, $tmp); - } else { - $struct['files'][] = $path; - } - } - } - - return $struct; - } - - /** - * Creates a nested array representing the structure of a directory and files - * - * @param array $files Array listing files and dirs - * @return array - * @static - * @see System::_dirToStruct() - */ - function _multipleToStruct($files) - { - $struct = array('dirs' => array(), 'files' => array()); - settype($files, 'array'); - foreach ($files as $file) { - if (is_dir($file) && !is_link($file)) { - $tmp = System::_dirToStruct($file, 0); - $struct = array_merge_recursive($tmp, $struct); - } else { - if (!in_array($file, $struct['files'])) { - $struct['files'][] = $file; - } - } - } - return $struct; - } - - /** - * The rm command for removing files. - * Supports multiple files and dirs and also recursive deletes - * - * @param string $args the arguments for rm - * @return mixed PEAR_Error or true for success - * @static - * @access public - */ - function rm($args) - { - $opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-) - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - foreach ($opts[0] as $opt) { - if ($opt[0] == 'r') { - $do_recursive = true; - } - } - $ret = true; - if (isset($do_recursive)) { - $struct = System::_multipleToStruct($opts[1]); - foreach ($struct['files'] as $file) { - if (!@unlink($file)) { - $ret = false; - } - } - - rsort($struct['dirs']); - foreach ($struct['dirs'] as $dir) { - if (!@rmdir($dir)) { - $ret = false; - } - } - } else { - foreach ($opts[1] as $file) { - $delete = (is_dir($file)) ? 'rmdir' : 'unlink'; - if (!@$delete($file)) { - $ret = false; - } - } - } - return $ret; - } - - /** - * Make directories. - * - * The -p option will create parent directories - * @param string $args the name of the director(y|ies) to create - * @return bool True for success - * @static - * @access public - */ - function mkDir($args) - { - $opts = System::_parseArgs($args, 'pm:'); - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - - $mode = 0777; // default mode - foreach ($opts[0] as $opt) { - if ($opt[0] == 'p') { - $create_parents = true; - } elseif ($opt[0] == 'm') { - // if the mode is clearly an octal number (starts with 0) - // convert it to decimal - if (strlen($opt[1]) && $opt[1]{0} == '0') { - $opt[1] = octdec($opt[1]); - } else { - // convert to int - $opt[1] += 0; - } - $mode = $opt[1]; - } - } - - $ret = true; - if (isset($create_parents)) { - foreach ($opts[1] as $dir) { - $dirstack = array(); - while ((!file_exists($dir) || !is_dir($dir)) && - $dir != DIRECTORY_SEPARATOR) { - array_unshift($dirstack, $dir); - $dir = dirname($dir); - } - - while ($newdir = array_shift($dirstack)) { - if (!is_writeable(dirname($newdir))) { - $ret = false; - break; - } - - if (!mkdir($newdir, $mode)) { - $ret = false; - } - } - } - } else { - foreach($opts[1] as $dir) { - if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) { - $ret = false; - } - } - } - - return $ret; - } - - /** - * Concatenate files - * - * Usage: - * 1) $var = System::cat('sample.txt test.txt'); - * 2) System::cat('sample.txt test.txt > final.txt'); - * 3) System::cat('sample.txt test.txt >> final.txt'); - * - * Note: as the class use fopen, urls should work also (test that) - * - * @param string $args the arguments - * @return boolean true on success - * @static - * @access public - */ - function &cat($args) - { - $ret = null; - $files = array(); - if (!is_array($args)) { - $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); - } - - $count_args = count($args); - for ($i = 0; $i < $count_args; $i++) { - if ($args[$i] == '>') { - $mode = 'wb'; - $outputfile = $args[$i+1]; - break; - } elseif ($args[$i] == '>>') { - $mode = 'ab+'; - $outputfile = $args[$i+1]; - break; - } else { - $files[] = $args[$i]; - } - } - $outputfd = false; - if (isset($mode)) { - if (!$outputfd = fopen($outputfile, $mode)) { - $err = System::raiseError("Could not open $outputfile"); - return $err; - } - $ret = true; - } - foreach ($files as $file) { - if (!$fd = fopen($file, 'r')) { - System::raiseError("Could not open $file"); - continue; - } - while ($cont = fread($fd, 2048)) { - if (is_resource($outputfd)) { - fwrite($outputfd, $cont); - } else { - $ret .= $cont; - } - } - fclose($fd); - } - if (is_resource($outputfd)) { - fclose($outputfd); - } - return $ret; - } - - /** - * Creates temporary files or directories. This function will remove - * the created files when the scripts finish its execution. - * - * Usage: - * 1) $tempfile = System::mktemp("prefix"); - * 2) $tempdir = System::mktemp("-d prefix"); - * 3) $tempfile = System::mktemp(); - * 4) $tempfile = System::mktemp("-t /var/tmp prefix"); - * - * prefix -> The string that will be prepended to the temp name - * (defaults to "tmp"). - * -d -> A temporary dir will be created instead of a file. - * -t -> The target dir where the temporary (file|dir) will be created. If - * this param is missing by default the env vars TMP on Windows or - * TMPDIR in Unix will be used. If these vars are also missing - * c:\windows\temp or /tmp will be used. - * - * @param string $args The arguments - * @return mixed the full path of the created (file|dir) or false - * @see System::tmpdir() - * @static - * @access public - */ - function mktemp($args = null) - { - static $first_time = true; - $opts = System::_parseArgs($args, 't:d'); - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - - foreach ($opts[0] as $opt) { - if ($opt[0] == 'd') { - $tmp_is_dir = true; - } elseif ($opt[0] == 't') { - $tmpdir = $opt[1]; - } - } - - $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp'; - if (!isset($tmpdir)) { - $tmpdir = System::tmpdir(); - } - - if (!System::mkDir(array('-p', $tmpdir))) { - return false; - } - - $tmp = tempnam($tmpdir, $prefix); - if (isset($tmp_is_dir)) { - unlink($tmp); // be careful possible race condition here - if (!mkdir($tmp, 0700)) { - return System::raiseError("Unable to create temporary directory $tmpdir"); - } - } - - $GLOBALS['_System_temp_files'][] = $tmp; - if (isset($tmp_is_dir)) { - //$GLOBALS['_System_temp_files'][] = dirname($tmp); - } - - if ($first_time) { - PEAR::registerShutdownFunc(array('System', '_removeTmpFiles')); - $first_time = false; - } - - return $tmp; - } - - /** - * Remove temporary files created my mkTemp. This function is executed - * at script shutdown time - * - * @static - * @access private - */ - function _removeTmpFiles() - { - if (count($GLOBALS['_System_temp_files'])) { - $delete = $GLOBALS['_System_temp_files']; - array_unshift($delete, '-r'); - System::rm($delete); - $GLOBALS['_System_temp_files'] = array(); - } - } - - /** - * Get the path of the temporal directory set in the system - * by looking in its environments variables. - * Note: php.ini-recommended removes the "E" from the variables_order setting, - * making unavaible the $_ENV array, that s why we do tests with _ENV - * - * @static - * @return string The temporary directory on the system - */ - function tmpdir() - { - if (OS_WINDOWS) { - if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) { - return $var; - } - if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) { - return $var; - } - if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) { - return $var; - } - if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) { - return $var; - } - return getenv('SystemRoot') . '\temp'; - } - if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) { - return $var; - } - return realpath('/tmp'); - } - - /** - * The "which" command (show the full path of a command) - * - * @param string $program The command to search for - * @param mixed $fallback Value to return if $program is not found - * - * @return mixed A string with the full path or false if not found - * @static - * @author Stig Bakken - */ - function which($program, $fallback = false) - { - // enforce API - if (!is_string($program) || '' == $program) { - return $fallback; - } - - // full path given - if (basename($program) != $program) { - $path_elements[] = dirname($program); - $program = basename($program); - } else { - // Honor safe mode - if (!ini_get('safe_mode') || !$path = ini_get('safe_mode_exec_dir')) { - $path = getenv('PATH'); - if (!$path) { - $path = getenv('Path'); // some OSes are just stupid enough to do this - } - } - $path_elements = explode(PATH_SEPARATOR, $path); - } - - if (OS_WINDOWS) { - $exe_suffixes = getenv('PATHEXT') - ? explode(PATH_SEPARATOR, getenv('PATHEXT')) - : array('.exe','.bat','.cmd','.com'); - // allow passing a command.exe param - if (strpos($program, '.') !== false) { - array_unshift($exe_suffixes, ''); - } - // is_executable() is not available on windows for PHP4 - $pear_is_executable = (function_exists('is_executable')) ? 'is_executable' : 'is_file'; - } else { - $exe_suffixes = array(''); - $pear_is_executable = 'is_executable'; - } - - foreach ($exe_suffixes as $suff) { - foreach ($path_elements as $dir) { - $file = $dir . DIRECTORY_SEPARATOR . $program . $suff; - if (@$pear_is_executable($file)) { - return $file; - } - } - } - return $fallback; - } - - /** - * The "find" command - * - * Usage: - * - * System::find($dir); - * System::find("$dir -type d"); - * System::find("$dir -type f"); - * System::find("$dir -name *.php"); - * System::find("$dir -name *.php -name *.htm*"); - * System::find("$dir -maxdepth 1"); - * - * Params implmented: - * $dir -> Start the search at this directory - * -type d -> return only directories - * -type f -> return only files - * -maxdepth -> max depth of recursion - * -name -> search pattern (bash style). Multiple -name param allowed - * - * @param mixed Either array or string with the command line - * @return array Array of found files - * @static - * - */ - function find($args) - { - if (!is_array($args)) { - $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); - } - $dir = realpath(array_shift($args)); - if (!$dir) { - return array(); - } - $patterns = array(); - $depth = 0; - $do_files = $do_dirs = true; - $args_count = count($args); - for ($i = 0; $i < $args_count; $i++) { - switch ($args[$i]) { - case '-type': - if (in_array($args[$i+1], array('d', 'f'))) { - if ($args[$i+1] == 'd') { - $do_files = false; - } else { - $do_dirs = false; - } - } - $i++; - break; - case '-name': - $name = preg_quote($args[$i+1], '#'); - // our magic characters ? and * have just been escaped, - // so now we change the escaped versions to PCRE operators - $name = strtr($name, array('\?' => '.', '\*' => '.*')); - $patterns[] = '('.$name.')'; - $i++; - break; - case '-maxdepth': - $depth = $args[$i+1]; - break; - } - } - $path = System::_dirToStruct($dir, $depth, 0, true); - if ($do_files && $do_dirs) { - $files = array_merge($path['files'], $path['dirs']); - } elseif ($do_dirs) { - $files = $path['dirs']; - } else { - $files = $path['files']; - } - if (count($patterns)) { - $dsq = preg_quote(DIRECTORY_SEPARATOR, '#'); - $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#'; - $ret = array(); - $files_count = count($files); - for ($i = 0; $i < $files_count; $i++) { - // only search in the part of the file below the current directory - $filepart = basename($files[$i]); - if (preg_match($pattern, $filepart)) { - $ret[] = $files[$i]; - } - } - return $ret; - } - return $files; - } -} \ No newline at end of file diff --git a/3rdparty/XML/Parser.php b/3rdparty/XML/Parser.php deleted file mode 100644 index 04dd348753..0000000000 --- a/3rdparty/XML/Parser.php +++ /dev/null @@ -1,754 +0,0 @@ - - * @author Tomas V.V.Cox - * @author Stephan Schmidt - * @copyright 2002-2008 The PHP Group - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version CVS: $Id: Parser.php 302733 2010-08-24 01:09:09Z clockwerx $ - * @link http://pear.php.net/package/XML_Parser - */ - -/** - * uses PEAR's error handling - */ -require_once 'PEAR.php'; - -/** - * resource could not be created - */ -define('XML_PARSER_ERROR_NO_RESOURCE', 200); - -/** - * unsupported mode - */ -define('XML_PARSER_ERROR_UNSUPPORTED_MODE', 201); - -/** - * invalid encoding was given - */ -define('XML_PARSER_ERROR_INVALID_ENCODING', 202); - -/** - * specified file could not be read - */ -define('XML_PARSER_ERROR_FILE_NOT_READABLE', 203); - -/** - * invalid input - */ -define('XML_PARSER_ERROR_INVALID_INPUT', 204); - -/** - * remote file cannot be retrieved in safe mode - */ -define('XML_PARSER_ERROR_REMOTE', 205); - -/** - * XML Parser class. - * - * This is an XML parser based on PHP's "xml" extension, - * based on the bundled expat library. - * - * Notes: - * - It requires PHP 4.0.4pl1 or greater - * - From revision 1.17, the function names used by the 'func' mode - * are in the format "xmltag_$elem", for example: use "xmltag_name" - * to handle the tags of your xml file. - * - different parsing modes - * - * @category XML - * @package XML_Parser - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Stephan Schmidt - * @copyright 2002-2008 The PHP Group - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/XML_Parser - * @todo create XML_Parser_Namespace to parse documents with namespaces - * @todo create XML_Parser_Pull - * @todo Tests that need to be made: - * - mixing character encodings - * - a test using all expat handlers - * - options (folding, output charset) - */ -class XML_Parser extends PEAR -{ - // {{{ properties - - /** - * XML parser handle - * - * @var resource - * @see xml_parser_create() - */ - var $parser; - - /** - * File handle if parsing from a file - * - * @var resource - */ - var $fp; - - /** - * Whether to do case folding - * - * If set to true, all tag and attribute names will - * be converted to UPPER CASE. - * - * @var boolean - */ - var $folding = true; - - /** - * Mode of operation, one of "event" or "func" - * - * @var string - */ - var $mode; - - /** - * Mapping from expat handler function to class method. - * - * @var array - */ - var $handler = array( - 'character_data_handler' => 'cdataHandler', - 'default_handler' => 'defaultHandler', - 'processing_instruction_handler' => 'piHandler', - 'unparsed_entity_decl_handler' => 'unparsedHandler', - 'notation_decl_handler' => 'notationHandler', - 'external_entity_ref_handler' => 'entityrefHandler' - ); - - /** - * source encoding - * - * @var string - */ - var $srcenc; - - /** - * target encoding - * - * @var string - */ - var $tgtenc; - - /** - * handler object - * - * @var object - */ - var $_handlerObj; - - /** - * valid encodings - * - * @var array - */ - var $_validEncodings = array('ISO-8859-1', 'UTF-8', 'US-ASCII'); - - // }}} - // {{{ php5 constructor - - /** - * PHP5 constructor - * - * @param string $srcenc source charset encoding, use NULL (default) to use - * whatever the document specifies - * @param string $mode how this parser object should work, "event" for - * startelement/endelement-type events, "func" - * to have it call functions named after elements - * @param string $tgtenc a valid target encoding - */ - function __construct($srcenc = null, $mode = 'event', $tgtenc = null) - { - $this->PEAR('XML_Parser_Error'); - - $this->mode = $mode; - $this->srcenc = $srcenc; - $this->tgtenc = $tgtenc; - } - // }}} - - /** - * Sets the mode of the parser. - * - * Possible modes are: - * - func - * - event - * - * You can set the mode using the second parameter - * in the constructor. - * - * This method is only needed, when switching to a new - * mode at a later point. - * - * @param string $mode mode, either 'func' or 'event' - * - * @return boolean|object true on success, PEAR_Error otherwise - * @access public - */ - function setMode($mode) - { - if ($mode != 'func' && $mode != 'event') { - $this->raiseError('Unsupported mode given', - XML_PARSER_ERROR_UNSUPPORTED_MODE); - } - - $this->mode = $mode; - return true; - } - - /** - * Sets the object, that will handle the XML events - * - * This allows you to create a handler object independent of the - * parser object that you are using and easily switch the underlying - * parser. - * - * If no object will be set, XML_Parser assumes that you - * extend this class and handle the events in $this. - * - * @param object &$obj object to handle the events - * - * @return boolean will always return true - * @access public - * @since v1.2.0beta3 - */ - function setHandlerObj(&$obj) - { - $this->_handlerObj = &$obj; - return true; - } - - /** - * Init the element handlers - * - * @return mixed - * @access private - */ - function _initHandlers() - { - if (!is_resource($this->parser)) { - return false; - } - - if (!is_object($this->_handlerObj)) { - $this->_handlerObj = &$this; - } - switch ($this->mode) { - - case 'func': - xml_set_object($this->parser, $this->_handlerObj); - xml_set_element_handler($this->parser, - array(&$this, 'funcStartHandler'), array(&$this, 'funcEndHandler')); - break; - - case 'event': - xml_set_object($this->parser, $this->_handlerObj); - xml_set_element_handler($this->parser, 'startHandler', 'endHandler'); - break; - default: - return $this->raiseError('Unsupported mode given', - XML_PARSER_ERROR_UNSUPPORTED_MODE); - break; - } - - /** - * set additional handlers for character data, entities, etc. - */ - foreach ($this->handler as $xml_func => $method) { - if (method_exists($this->_handlerObj, $method)) { - $xml_func = 'xml_set_' . $xml_func; - $xml_func($this->parser, $method); - } - } - } - - // {{{ _create() - - /** - * create the XML parser resource - * - * Has been moved from the constructor to avoid - * problems with object references. - * - * Furthermore it allows us returning an error - * if something fails. - * - * NOTE: uses '@' error suppresion in this method - * - * @return bool|PEAR_Error true on success, PEAR_Error otherwise - * @access private - * @see xml_parser_create - */ - function _create() - { - if ($this->srcenc === null) { - $xp = @xml_parser_create(); - } else { - $xp = @xml_parser_create($this->srcenc); - } - if (is_resource($xp)) { - if ($this->tgtenc !== null) { - if (!@xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING, - $this->tgtenc) - ) { - return $this->raiseError('invalid target encoding', - XML_PARSER_ERROR_INVALID_ENCODING); - } - } - $this->parser = $xp; - $result = $this->_initHandlers($this->mode); - if (PEAR::isError($result)) { - return $result; - } - xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, $this->folding); - return true; - } - if (!in_array(strtoupper($this->srcenc), $this->_validEncodings)) { - return $this->raiseError('invalid source encoding', - XML_PARSER_ERROR_INVALID_ENCODING); - } - return $this->raiseError('Unable to create XML parser resource.', - XML_PARSER_ERROR_NO_RESOURCE); - } - - // }}} - // {{{ reset() - - /** - * Reset the parser. - * - * This allows you to use one parser instance - * to parse multiple XML documents. - * - * @access public - * @return boolean|object true on success, PEAR_Error otherwise - */ - function reset() - { - $result = $this->_create(); - if (PEAR::isError($result)) { - return $result; - } - return true; - } - - // }}} - // {{{ setInputFile() - - /** - * Sets the input xml file to be parsed - * - * @param string $file Filename (full path) - * - * @return resource fopen handle of the given file - * @access public - * @throws XML_Parser_Error - * @see setInput(), setInputString(), parse() - */ - function setInputFile($file) - { - /** - * check, if file is a remote file - */ - if (preg_match('/^(http|ftp):\/\//i', substr($file, 0, 10))) { - if (!ini_get('allow_url_fopen')) { - return $this-> - raiseError('Remote files cannot be parsed, as safe mode is enabled.', - XML_PARSER_ERROR_REMOTE); - } - } - - $fp = @fopen($file, 'rb'); - if (is_resource($fp)) { - $this->fp = $fp; - return $fp; - } - return $this->raiseError('File could not be opened.', - XML_PARSER_ERROR_FILE_NOT_READABLE); - } - - // }}} - // {{{ setInputString() - - /** - * XML_Parser::setInputString() - * - * Sets the xml input from a string - * - * @param string $data a string containing the XML document - * - * @return null - */ - function setInputString($data) - { - $this->fp = $data; - return null; - } - - // }}} - // {{{ setInput() - - /** - * Sets the file handle to use with parse(). - * - * You should use setInputFile() or setInputString() if you - * pass a string - * - * @param mixed $fp Can be either a resource returned from fopen(), - * a URL, a local filename or a string. - * - * @return mixed - * @access public - * @see parse() - * @uses setInputString(), setInputFile() - */ - function setInput($fp) - { - if (is_resource($fp)) { - $this->fp = $fp; - return true; - } elseif (preg_match('/^[a-z]+:\/\//i', substr($fp, 0, 10))) { - // see if it's an absolute URL (has a scheme at the beginning) - return $this->setInputFile($fp); - } elseif (file_exists($fp)) { - // see if it's a local file - return $this->setInputFile($fp); - } else { - // it must be a string - $this->fp = $fp; - return true; - } - - return $this->raiseError('Illegal input format', - XML_PARSER_ERROR_INVALID_INPUT); - } - - // }}} - // {{{ parse() - - /** - * Central parsing function. - * - * @return bool|PEAR_Error returns true on success, or a PEAR_Error otherwise - * @access public - */ - function parse() - { - /** - * reset the parser - */ - $result = $this->reset(); - if (PEAR::isError($result)) { - return $result; - } - // if $this->fp was fopened previously - if (is_resource($this->fp)) { - - while ($data = fread($this->fp, 4096)) { - if (!$this->_parseString($data, feof($this->fp))) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - } - } else { - // otherwise, $this->fp must be a string - if (!$this->_parseString($this->fp, true)) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - } - $this->free(); - - return true; - } - - /** - * XML_Parser::_parseString() - * - * @param string $data data - * @param bool $eof end-of-file flag - * - * @return bool - * @access private - * @see parseString() - **/ - function _parseString($data, $eof = false) - { - return xml_parse($this->parser, $data, $eof); - } - - // }}} - // {{{ parseString() - - /** - * XML_Parser::parseString() - * - * Parses a string. - * - * @param string $data XML data - * @param boolean $eof If set and TRUE, data is the last piece - * of data sent in this parser - * - * @return bool|PEAR_Error true on success or a PEAR Error - * @throws XML_Parser_Error - * @see _parseString() - */ - function parseString($data, $eof = false) - { - if (!isset($this->parser) || !is_resource($this->parser)) { - $this->reset(); - } - - if (!$this->_parseString($data, $eof)) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - - if ($eof === true) { - $this->free(); - } - return true; - } - - /** - * XML_Parser::free() - * - * Free the internal resources associated with the parser - * - * @return null - **/ - function free() - { - if (isset($this->parser) && is_resource($this->parser)) { - xml_parser_free($this->parser); - unset( $this->parser ); - } - if (isset($this->fp) && is_resource($this->fp)) { - fclose($this->fp); - } - unset($this->fp); - return null; - } - - /** - * XML_Parser::raiseError() - * - * Throws a XML_Parser_Error - * - * @param string $msg the error message - * @param integer $ecode the error message code - * - * @return XML_Parser_Error reference to the error object - **/ - static function &raiseError($message = null, - $code = 0, - $mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - $msg = !is_null($msg) ? $msg : $this->parser; - $err = new XML_Parser_Error($msg, $ecode); - return parent::raiseError($err); - } - - // }}} - // {{{ funcStartHandler() - - /** - * derives and calls the Start Handler function - * - * @param mixed $xp ?? - * @param mixed $elem ?? - * @param mixed $attribs ?? - * - * @return void - */ - function funcStartHandler($xp, $elem, $attribs) - { - $func = 'xmltag_' . $elem; - $func = str_replace(array('.', '-', ':'), '_', $func); - if (method_exists($this->_handlerObj, $func)) { - call_user_func(array(&$this->_handlerObj, $func), $xp, $elem, $attribs); - } elseif (method_exists($this->_handlerObj, 'xmltag')) { - call_user_func(array(&$this->_handlerObj, 'xmltag'), - $xp, $elem, $attribs); - } - } - - // }}} - // {{{ funcEndHandler() - - /** - * derives and calls the End Handler function - * - * @param mixed $xp ?? - * @param mixed $elem ?? - * - * @return void - */ - function funcEndHandler($xp, $elem) - { - $func = 'xmltag_' . $elem . '_'; - $func = str_replace(array('.', '-', ':'), '_', $func); - if (method_exists($this->_handlerObj, $func)) { - call_user_func(array(&$this->_handlerObj, $func), $xp, $elem); - } elseif (method_exists($this->_handlerObj, 'xmltag_')) { - call_user_func(array(&$this->_handlerObj, 'xmltag_'), $xp, $elem); - } - } - - // }}} - // {{{ startHandler() - - /** - * abstract method signature for Start Handler - * - * @param mixed $xp ?? - * @param mixed $elem ?? - * @param mixed &$attribs ?? - * - * @return null - * @abstract - */ - function startHandler($xp, $elem, &$attribs) - { - return null; - } - - // }}} - // {{{ endHandler() - - /** - * abstract method signature for End Handler - * - * @param mixed $xp ?? - * @param mixed $elem ?? - * - * @return null - * @abstract - */ - function endHandler($xp, $elem) - { - return null; - } - - - // }}}me -} - -/** - * error class, replaces PEAR_Error - * - * An instance of this class will be returned - * if an error occurs inside XML_Parser. - * - * There are three advantages over using the standard PEAR_Error: - * - All messages will be prefixed - * - check for XML_Parser error, using is_a( $error, 'XML_Parser_Error' ) - * - messages can be generated from the xml_parser resource - * - * @category XML - * @package XML_Parser - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Stephan Schmidt - * @copyright 2002-2008 The PHP Group - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/XML_Parser - * @see PEAR_Error - */ -class XML_Parser_Error extends PEAR_Error -{ - // {{{ properties - - /** - * prefix for all messages - * - * @var string - */ - var $error_message_prefix = 'XML_Parser: '; - - // }}} - // {{{ constructor() - /** - * construct a new error instance - * - * You may either pass a message or an xml_parser resource as first - * parameter. If a resource has been passed, the last error that - * happened will be retrieved and returned. - * - * @param string|resource $msgorparser message or parser resource - * @param integer $code error code - * @param integer $mode error handling - * @param integer $level error level - * - * @access public - * @todo PEAR CS - can't meet 85char line limit without arg refactoring - */ - function XML_Parser_Error($msgorparser = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) - { - if (is_resource($msgorparser)) { - $code = xml_get_error_code($msgorparser); - $msgorparser = sprintf('%s at XML input line %d:%d', - xml_error_string($code), - xml_get_current_line_number($msgorparser), - xml_get_current_column_number($msgorparser)); - } - $this->PEAR_Error($msgorparser, $code, $mode, $level); - } - // }}} -} -?> diff --git a/3rdparty/XML/Parser/Simple.php b/3rdparty/XML/Parser/Simple.php deleted file mode 100644 index 9ed0abfc6c..0000000000 --- a/3rdparty/XML/Parser/Simple.php +++ /dev/null @@ -1,326 +0,0 @@ - - * @copyright 2004-2008 Stephan Schmidt - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version CVS: $Id: Simple.php 265444 2008-08-24 21:48:21Z ashnazg $ - * @link http://pear.php.net/package/XML_Parser - */ - -/** - * built on XML_Parser - */ -require_once 'XML/Parser.php'; - -/** - * Simple XML parser class. - * - * This class is a simplified version of XML_Parser. - * In most XML applications the real action is executed, - * when a closing tag is found. - * - * XML_Parser_Simple allows you to just implement one callback - * for each tag that will receive the tag with its attributes - * and CData. - * - * - * require_once '../Parser/Simple.php'; - * - * class myParser extends XML_Parser_Simple - * { - * function myParser() - * { - * $this->XML_Parser_Simple(); - * } - * - * function handleElement($name, $attribs, $data) - * { - * printf('handle %s
    ', $name); - * } - * } - * - * $p = &new myParser(); - * - * $result = $p->setInputFile('myDoc.xml'); - * $result = $p->parse(); - *
    - * - * @category XML - * @package XML_Parser - * @author Stephan Schmidt - * @copyright 2004-2008 The PHP Group - * @license http://opensource.org/licenses/bsd-license New BSD License - * @version Release: @package_version@ - * @link http://pear.php.net/package/XML_Parser - */ -class XML_Parser_Simple extends XML_Parser -{ - /** - * element stack - * - * @access private - * @var array - */ - var $_elStack = array(); - - /** - * all character data - * - * @access private - * @var array - */ - var $_data = array(); - - /** - * element depth - * - * @access private - * @var integer - */ - var $_depth = 0; - - /** - * Mapping from expat handler function to class method. - * - * @var array - */ - var $handler = array( - 'default_handler' => 'defaultHandler', - 'processing_instruction_handler' => 'piHandler', - 'unparsed_entity_decl_handler' => 'unparsedHandler', - 'notation_decl_handler' => 'notationHandler', - 'external_entity_ref_handler' => 'entityrefHandler' - ); - - /** - * Creates an XML parser. - * - * This is needed for PHP4 compatibility, it will - * call the constructor, when a new instance is created. - * - * @param string $srcenc source charset encoding, use NULL (default) to use - * whatever the document specifies - * @param string $mode how this parser object should work, "event" for - * handleElement(), "func" to have it call functions - * named after elements (handleElement_$name()) - * @param string $tgtenc a valid target encoding - */ - function XML_Parser_Simple($srcenc = null, $mode = 'event', $tgtenc = null) - { - $this->XML_Parser($srcenc, $mode, $tgtenc); - } - - /** - * inits the handlers - * - * @return mixed - * @access private - */ - function _initHandlers() - { - if (!is_object($this->_handlerObj)) { - $this->_handlerObj = &$this; - } - - if ($this->mode != 'func' && $this->mode != 'event') { - return $this->raiseError('Unsupported mode given', - XML_PARSER_ERROR_UNSUPPORTED_MODE); - } - xml_set_object($this->parser, $this->_handlerObj); - - xml_set_element_handler($this->parser, array(&$this, 'startHandler'), - array(&$this, 'endHandler')); - xml_set_character_data_handler($this->parser, array(&$this, 'cdataHandler')); - - /** - * set additional handlers for character data, entities, etc. - */ - foreach ($this->handler as $xml_func => $method) { - if (method_exists($this->_handlerObj, $method)) { - $xml_func = 'xml_set_' . $xml_func; - $xml_func($this->parser, $method); - } - } - } - - /** - * Reset the parser. - * - * This allows you to use one parser instance - * to parse multiple XML documents. - * - * @access public - * @return boolean|object true on success, PEAR_Error otherwise - */ - function reset() - { - $this->_elStack = array(); - $this->_data = array(); - $this->_depth = 0; - - $result = $this->_create(); - if ($this->isError($result)) { - return $result; - } - return true; - } - - /** - * start handler - * - * Pushes attributes and tagname onto a stack - * - * @param resource $xp xml parser resource - * @param string $elem element name - * @param array &$attribs attributes - * - * @return mixed - * @access private - * @final - */ - function startHandler($xp, $elem, &$attribs) - { - array_push($this->_elStack, array( - 'name' => $elem, - 'attribs' => $attribs - )); - $this->_depth++; - $this->_data[$this->_depth] = ''; - } - - /** - * end handler - * - * Pulls attributes and tagname from a stack - * - * @param resource $xp xml parser resource - * @param string $elem element name - * - * @return mixed - * @access private - * @final - */ - function endHandler($xp, $elem) - { - $el = array_pop($this->_elStack); - $data = $this->_data[$this->_depth]; - $this->_depth--; - - switch ($this->mode) { - case 'event': - $this->_handlerObj->handleElement($el['name'], $el['attribs'], $data); - break; - case 'func': - $func = 'handleElement_' . $elem; - if (strchr($func, '.')) { - $func = str_replace('.', '_', $func); - } - if (method_exists($this->_handlerObj, $func)) { - call_user_func(array(&$this->_handlerObj, $func), - $el['name'], $el['attribs'], $data); - } - break; - } - } - - /** - * handle character data - * - * @param resource $xp xml parser resource - * @param string $data data - * - * @return void - * @access private - * @final - */ - function cdataHandler($xp, $data) - { - $this->_data[$this->_depth] .= $data; - } - - /** - * handle a tag - * - * Implement this in your parser - * - * @param string $name element name - * @param array $attribs attributes - * @param string $data character data - * - * @return void - * @access public - * @abstract - */ - function handleElement($name, $attribs, $data) - { - } - - /** - * get the current tag depth - * - * The root tag is in depth 0. - * - * @access public - * @return integer - */ - function getCurrentDepth() - { - return $this->_depth; - } - - /** - * add some string to the current ddata. - * - * This is commonly needed, when a document is parsed recursively. - * - * @param string $data data to add - * - * @return void - * @access public - */ - function addToData($data) - { - $this->_data[$this->_depth] .= $data; - } -} -?> diff --git a/3rdparty/aws-sdk/README.md b/3rdparty/aws-sdk/README.md deleted file mode 100644 index 7e55f76b3b..0000000000 --- a/3rdparty/aws-sdk/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# AWS SDK for PHP - -The AWS SDK for PHP enables developers to build solutions for Amazon Simple Storage Service (Amazon S3), -Amazon Elastic Compute Cloud (Amazon EC2), Amazon SimpleDB, and more. With the AWS SDK for PHP, developers -can get started in minutes with a single, downloadable package. - -The SDK features: - -* **AWS PHP Libraries:** Build PHP applications on top of APIs that take the complexity out of coding directly - against a web service interface. The toolkit provides APIs that hide much of the lower-level implementation. -* **Code Samples:** Practical examples for how to use the toolkit to build applications. -* **Documentation:** Complete SDK reference documentation with samples demonstrating how to use the SDK. -* **PEAR package:** The ability to install the AWS SDK for PHP as a PEAR package. -* **SDK Compatibility Test:** Includes both an HTML-based and a CLI-based SDK Compatibility Test that you can - run on your server to determine whether or not your PHP environment meets the minimum requirements. - -For more information about the AWS SDK for PHP, including a complete list of supported services, see -[aws.amazon.com/sdkforphp](http://aws.amazon.com/sdkforphp). - - -## Signing up for Amazon Web Services - -Before you can begin, you must sign up for each service you want to use. - -To sign up for a service: - -* Go to the home page for the service. You can find a list of services on - [aws.amazon.com/products](http://aws.amazon.com/products). -* Click the Sign Up button on the top right corner of the page. If you don't already have an AWS account, you - are prompted to create one as part of the sign up process. -* Follow the on-screen instructions. -* AWS sends you a confirmation e-mail after the sign-up process is complete. At any time, you can view your - current account activity and manage your account by going to [aws.amazon.com](http://aws.amazon.com) and - clicking "Your Account". - - -## Source -The source tree for includes the following files and directories: - -* `_compatibility_test` -- Includes both an HTML-based and a CLI-based SDK Compatibility Test that you can - run on your server to determine whether or not your PHP environment meets the minimum requirements. -* `_docs` -- Informational documents, the contents of which should be fairly self-explanatory. -* `_samples` -- Code samples that you can run out of the box. -* `extensions` -- Extra code that can be used to enhance usage of the SDK, but isn't a service class or a - third-party library. -* `lib` -- Contains any third-party libraries that the SDK depends on. The licenses for these projects will - always be Apache 2.0-compatible. -* `services` -- Contains the service-specific classes that communicate with AWS. These classes are always - prefixed with `Amazon`. -* `utilities` -- Contains any utility-type methods that the SDK uses. Includes extensions to built-in PHP - classes, as well as new functionality that is entirely custom. These classes are always prefixed with `CF`. -* `README` -- The document you're reading right now. -* `config-sample.inc.php` -- A sample configuration file that should be filled out and renamed to `config.inc.php`. -* `sdk.class.php` -- The SDK loader that you would include in your projects. Contains the base functionality - that the rest of the SDK depends on. - - -## Minimum Requirements in a nutshell - -* You are at least an intermediate-level PHP developer and have a basic understanding of object-oriented PHP. -* You have a valid AWS account, and you've already signed up for the services you want to use. -* The PHP interpreter, version 5.2 or newer. PHP 5.2.17 or 5.3.x is highly recommended for use with the AWS SDK for PHP. -* The cURL PHP extension (compiled with the [OpenSSL](http://openssl.org) libraries for HTTPS support). -* The ability to read from and write to the file system via [file_get_contents()](http://php.net/file_get_contents) and [file_put_contents()](http://php.net/file_put_contents). - -If you're not sure whether your PHP environment meets these requirements, run the -[SDK Compatibility Test](http://github.com/amazonwebservices/aws-sdk-for-php/tree/master/_compatibility_test/) script -included in the SDK download. - - -## Installation - -### Via GitHub - -[Git](http://git-scm.com) is an extremely fast, efficient, distributed version control system ideal for the -collaborative development of software. [GitHub](http://github.com/amazonwebservices) is the best way to -collaborate with others. Fork, send pull requests and manage all your public and private git repositories. -We believe that GitHub is the ideal service for working collaboratively with the open source PHP community. - -Git is primarily a command-line tool. GitHub provides instructions for installing Git on -[Mac OS X](http://help.github.com/mac-git-installation/), [Windows](http://help.github.com/win-git-installation/), -and [Linux](http://help.github.com/linux-git-installation/). If you're unfamiliar with Git, there are a variety -of resources on the net that will help you learn more: - -* [Git Immersion](http://gitimmersion.com) is a guided tour that walks through the fundamentals of Git, inspired - by the premise that to know a thing is to do it. -* The [PeepCode screencast on Git](https://peepcode.com/products/git) ($12) will teach you how to install and - use Git. You'll learn how to create a repository, use branches, and work with remote repositories. -* [Git Reference](http://gitref.org) is meant to be a quick reference for learning and remembering the most - important and commonly used Git commands. -* [Git Ready](http://gitready.com) provides a collection of Git tips and tricks. -* If you want to dig even further, I've [bookmarked other Git references](http://pinboard.in/u:skyzyx/t:git). - -If you're comfortable working with Git and/or GitHub, you can pull down the source code as follows: - - git clone git://github.com/amazonwebservices/aws-sdk-for-php.git AWSSDKforPHP - cd ./AWSSDKforPHP - -### Via PEAR - -[PEAR](http://pear.php.net) stands for the _PHP Extension and Application Repository_ and is a framework and -distribution system for reusable PHP components. It is the PHP equivalent to package management software such as -[MacPorts](http://macports.org) and [Homebrew](https://github.com/mxcl/homebrew) for Mac OS X, -[Yum](http://fedoraproject.org/wiki/Tools/yum) and [Apt](http://wiki.debian.org/Apt) for GNU/Linux, -[RubyGems](http://rubygems.org) for Ruby, [Easy Install](http://packages.python.org/distribute/easy_install.html) -for Python, [Maven](http://maven.apache.org) for Java, and [NPM](http://npm.mape.me) for Node.js. - -PEAR packages are very easy to install, and are available in your PHP environment path so that they are accessible -to any PHP project. PEAR packages are not specific to your project, but rather to the machine that they're -installed on. - -From the command-line, you can install the SDK with PEAR as follows: - - pear channel-discover pear.amazonwebservices.com - pear install aws/sdk - -You may need to use `sudo` for the above commands. Once the SDK has been installed via PEAR, you can load it into -your project with: - - require_once 'AWSSDKforPHP/sdk.class.php'; - -### Configuration - -1. Copy the contents of [config-sample.inc.php](https://github.com/amazonwebservices/aws-sdk-for-php/raw/master/config-sample.inc.php) - and add your credentials as instructed in the file. -2. Move your file to `~/.aws/sdk/config.inc.php`. -3. Make sure that `getenv('HOME')` points to your user directory. If not you'll need to set - `putenv('HOME=')`. - - -## Additional Information - -* AWS SDK for PHP: -* Documentation: -* License: -* Discuss: diff --git a/3rdparty/aws-sdk/_compatibility_test/README.md b/3rdparty/aws-sdk/_compatibility_test/README.md deleted file mode 100644 index 9e2f2d8940..0000000000 --- a/3rdparty/aws-sdk/_compatibility_test/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Compatibility Test - -## Via your web browser - -1. Upload `sdk_compatibility_test.php` to the web-accessible root of your website. -For example, if your website is `www.example.com`, upload it so that you can get -to it at `www.example.com/sdk_compatibility_test.php` - -2. Open your web browser and go to the page you just uploaded. - - -## Via the command line - -### Windows - -1. Upload `sdk_compatibility_test_cli.php` to your server via SFTP. - -2. SSH/RDP into the machine, and find the directory where you uploaded the test. - -3. Run the test, and review the results: - - php .\sdk_compatibility_test_cli.php - - -### Non-Windows (Mac or *nix) - -1. Upload `sdk_compatibility_test_cli.php` to your server via SFTP. - -2. SSH into the machine, and find the directory where you uploaded the test. - -3. Set the executable bit: - - chmod +x ./sdk_compatibility_test_cli.php - -4. Run the test, and review the results: - - ./sdk_compatibility_test_cli.php diff --git a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility.inc.php b/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility.inc.php deleted file mode 100644 index c17ec33d72..0000000000 --- a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility.inc.php +++ /dev/null @@ -1,75 +0,0 @@ -=')); -$simplexml_ok = extension_loaded('simplexml'); -$dom_ok = extension_loaded('dom'); -$json_ok = (extension_loaded('json') && function_exists('json_encode') && function_exists('json_decode')); -$spl_ok = extension_loaded('spl'); -$pcre_ok = extension_loaded('pcre'); -$curl_ok = false; -if (function_exists('curl_version')) -{ - $curl_version = curl_version(); - $curl_ok = (function_exists('curl_exec') && in_array('https', $curl_version['protocols'], true)); -} -$file_ok = (function_exists('file_get_contents') && function_exists('file_put_contents')); - -// Optional, but recommended -$openssl_ok = (extension_loaded('openssl') && function_exists('openssl_sign')); -$zlib_ok = extension_loaded('zlib'); - -// Optional -$apc_ok = extension_loaded('apc'); -$xcache_ok = extension_loaded('xcache'); -$memcached_ok = extension_loaded('memcached'); -$memcache_ok = extension_loaded('memcache'); -$mc_ok = ($memcache_ok || $memcached_ok); -$pdo_ok = extension_loaded('pdo'); -$pdo_sqlite_ok = extension_loaded('pdo_sqlite'); -$sqlite2_ok = extension_loaded('sqlite'); -$sqlite3_ok = extension_loaded('sqlite3'); -$sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok)); - -// Other -$int64_ok = (PHP_INT_MAX === 9223372036854775807); -$ini_memory_limit = get_ini('memory_limit'); -$ini_open_basedir = get_ini('open_basedir'); -$ini_safe_mode = get_ini('safe_mode'); -$ini_zend_enable_gc = get_ini('zend.enable_gc'); - -if ($php_ok && $int64_ok && $curl_ok && $simplexml_ok && $dom_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok && $openssl_ok && $zlib_ok && ($apc_ok || $xcache_ok || $mc_ok || $sqlite_ok)) -{ - $compatiblity = REQUIREMENTS_ALL_MET; -} -elseif ($php_ok && $curl_ok && $simplexml_ok && $dom_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok) -{ - $compatiblity = REQUIREMENTS_MIN_MET; -} -else -{ - $compatiblity = REQUIREMENTS_NOT_MET; -} - -function get_ini($config) -{ - $cfg_value = ini_get($config); - - if ($cfg_value === false || $cfg_value === '' || $cfg_value === 0) - { - return false; - } - elseif ($cfg_value === true || $cfg_value === '1' || $cfg_value === 1) - { - return true; - } -} - -function is_windows() -{ - return strtolower(substr(PHP_OS, 0, 3)) === 'win'; -} diff --git a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test.php b/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test.php deleted file mode 100644 index b36a38ab35..0000000000 --- a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test.php +++ /dev/null @@ -1,789 +0,0 @@ - - - - -AWS SDK for PHP: Environment Compatibility Test - - - - - - - - - - -
    -
    - -
    -

    SDK Compatibility Test

    - -

    Minimum Requirements

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TestShould BeWhat You Have
    PHP5.2 or newer
    cURL7.15.0 or newer, with SSL
    SimpleXMLEnabled
    DOMEnabled
    SPLEnabled
    JSONEnabled
    PCREEnabled
    File System Read/WriteEnabled
    - -

    Optional Extensions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TestWould Like To BeWhat You Have
    OpenSSLEnabled
    ZlibEnabled
    APCEnabled
    XCacheEnabled
    MemcacheEnabled
    MemcachedEnabled
    PDOEnabled
    PDO-SQLiteEnabled
    SQLite 2Enabled
    SQLite 3Enabled
    - -

    Settings for php.ini

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    TestWould Like To BeWhat You Have
    open_basediroff
    safe_modeoff
    zend.enable_gcon
    - -

    Other

    - - - - - - - - - - - - - - - -
    TestWould Like To BeWhat You Have
    Architecture64-bit - (why?) -
    - -
    -
    - - -
    -

    Bottom Line: Yes, you can!

    -

    Your PHP environment is ready to go, and can take advantage of all possible features!

    -
    -
    -

    What's Next?

    -

    You can download the latest version of the AWS SDK for PHP and install it by following the instructions. Also, check out our library of screencasts and tutorials.

    -

    Take the time to read "Getting Started" to make sure you're prepared to use the AWS SDK for PHP. No seriously, read it.

    -
    - -
    -

    Bottom Line: Yes, you can!

    -

    Your PHP environment is ready to go! There are a couple of minor features that you won't be able to take advantage of, but nothing that's a show-stopper.

    -
    -
    -

    What's Next?

    -

    You can download the latest version of the AWS SDK for PHP and install it by following the instructions. Also, check out our library of screencasts and tutorials.

    -

    Take the time to read "Getting Started" to make sure you're prepared to use the AWS SDK for PHP. No seriously, read it.

    -
    - -
    -

    Bottom Line: We're sorry…

    -

    Your PHP environment does not support the minimum requirements for the AWS SDK for PHP.

    -
    -
    -

    What's Next?

    -

    If you're using a shared hosting plan, it may be a good idea to contact your web host and ask them to install a more recent version of PHP and relevant extensions.

    -

    If you have control over your PHP environment, we recommended that you upgrade your PHP environment. Check out the "Set Up Your Environment" section of the Getting Started Guide for more information.

    -
    - - - = REQUIREMENTS_MIN_MET): ?> -
    -

    Recommended settings for config.inc.php

    -

    Based on your particular server configuration, the following settings are recommended.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Configuration SettingRecommended Value
    default_cache_configapcxcacheAny valid, server-writable file system path
    certificate_authoritytrueLoading...
    -
    -
    - - -
    -

    Give me the details!

    - = REQUIREMENTS_MIN_MET): ?> -
      -
    1. Your environment meets the minimum requirements for using the AWS SDK for PHP!
    2. - - -
    3. You're still running PHP . The PHP 5.2 family is no longer supported by the PHP team, and future versions of the AWS SDK for PHP will require PHP 5.3 or newer.
    4. - - - -
    5. The OpenSSL extension is installed. This will allow you to use CloudFront Private URLs and decrypt Microsoft® Windows® instance passwords.
    6. - - - -
    7. The Zlib extension is installed. The SDK will request gzipped data whenever possible.
    8. - - - -
    9. You're running on a 32-bit system. This means that PHP does not correctly handle files larger than 2GB (this is a well-known PHP issue). For more information, please see: PHP filesize: Return values.
    10. - -
    11. Note that PHP on Microsoft® Windows® does not support 64-bit integers at all, even if both the hardware and PHP are 64-bit.
    12. - - - - -
    13. You have open_basedir or safe_mode enabled in your php.ini file. Sometimes PHP behaves strangely when these settings are enabled. Disable them if you can.
    14. - - - -
    15. The PHP garbage collector (available in PHP 5.3+) is not enabled in your php.ini file. Enabling zend.enable_gc will provide better memory management in the PHP core.
    16. - - - The file system'; } - if ($apc_ok) { $storage_types[] = 'APC'; } - if ($xcache_ok) { $storage_types[] = 'XCache'; } - if ($sqlite_ok && $sqlite3_ok) { $storage_types[] = 'SQLite 3'; } - elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = 'SQLite 2'; } - if ($memcached_ok) { $storage_types[] = 'Memcached'; } - elseif ($memcache_ok) { $storage_types[] = 'Memcache'; } - ?> -
    17. Storage types available for response caching:
    18. -
    - - -

    NOTE: You're missing the OpenSSL extension, which means that you won't be able to take advantage of CloudFront Private URLs or decrypt Microsoft® Windows® instance passwords. You're also missing the Zlib extension, which means that the SDK will be unable to request gzipped data from Amazon and you won't be able to take advantage of compression with the response caching feature.

    - -

    NOTE: You're missing the Zlib extension, which means that the SDK will be unable to request gzipped data from Amazon and you won't be able to take advantage of compression with the response caching feature.

    - -

    NOTE: You're missing the OpenSSL extension, which means that you won't be able to take advantage of CloudFront Private URLs or decrypt Microsoft® Windows® instance passwords.

    - - - -
      - -
    1. PHP: You are running an unsupported version of PHP.
    2. - - - -
    3. cURL: The cURL extension is not available. Without cURL, the SDK cannot connect to — or authenticate with — Amazon's services.
    4. - - - -
    5. SimpleXML: The SimpleXML extension is not available. Without SimpleXML, the SDK cannot parse the XML responses from Amazon's services.
    6. - - - -
    7. DOM: The DOM extension is not available. Without DOM, the SDK cannot transliterate JSON responses from Amazon's services into the common SimpleXML-based pattern used throughout the SDK.
    8. - - - -
    9. SPL: Standard PHP Library support is not available. Without SPL support, the SDK cannot autoload the required PHP classes.
    10. - - - -
    11. JSON: JSON support is not available. AWS leverages JSON heavily in many of its services.
    12. - - - -
    13. PCRE: Your PHP installation doesn't support Perl-Compatible Regular Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via regular expressions.
    14. - - - -
    15. File System Read/Write: The file_get_contents() and/or file_put_contents() functions have been disabled. Without them, the SDK cannot read from, or write to, the file system.
    16. - -
    - -
    - -
    -

    NOTE: Passing this test does not guarantee that the AWS SDK for PHP will run on your web server — it only ensures that the requirements have been addressed.

    -
    -
    - -
    - - - - - - - diff --git a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php b/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php deleted file mode 100755 index a6632d8978..0000000000 --- a/3rdparty/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php +++ /dev/null @@ -1,186 +0,0 @@ -#! /usr/bin/env php -= REQUIREMENTS_MIN_MET) -{ - echo success('Your environment meets the minimum requirements for using the AWS SDK for PHP!') . PHP_EOL . PHP_EOL; - if (version_compare(PHP_VERSION, '5.3.0') < 0) { echo '* You\'re still running PHP ' . PHP_VERSION . '. The PHP 5.2 family is no longer supported' . PHP_EOL . ' by the PHP team, and future versions of the AWS SDK for PHP will *require*' . PHP_EOL . ' PHP 5.3 or newer.' . PHP_EOL . PHP_EOL; } - if ($openssl_ok) { echo '* The OpenSSL extension is installed. This will allow you to use CloudFront' . PHP_EOL . ' Private URLs and decrypt Windows instance passwords.' . PHP_EOL . PHP_EOL; } - if ($zlib_ok) { echo '* The Zlib extension is installed. The SDK will request gzipped data' . PHP_EOL . ' whenever possible.' . PHP_EOL . PHP_EOL; } - if (!$int64_ok) { echo '* You\'re running on a 32-bit system. This means that PHP does not correctly' . PHP_EOL . ' handle files larger than 2GB (this is a well-known PHP issue).' . PHP_EOL . PHP_EOL; } - if (!$int64_ok && is_windows()) { echo '* Note that PHP on Microsoft(R) Windows(R) does not support 64-bit integers' . PHP_EOL . ' at all, even if both the hardware and PHP are 64-bit. http://j.mp/php64win' . PHP_EOL . PHP_EOL; } - - if ($ini_open_basedir || $ini_safe_mode) { echo '* You have open_basedir or safe_mode enabled in your php.ini file. Sometimes' . PHP_EOL . ' PHP behaves strangely when these settings are enabled. Disable them if you can.' . PHP_EOL . PHP_EOL; } - if (!$ini_zend_enable_gc) { echo '* The PHP garbage collector (available in PHP 5.3+) is not enabled in your' . PHP_EOL . ' php.ini file. Enabling zend.enable_gc will provide better memory management' . PHP_EOL . ' in the PHP core.' . PHP_EOL . PHP_EOL; } - - $storage_types = array(); - if ($file_ok) { $storage_types[] = 'The file system'; } - if ($apc_ok) { $storage_types[] = 'APC'; } - if ($xcache_ok) { $storage_types[] = 'XCache'; } - if ($sqlite_ok && $sqlite3_ok) { $storage_types[] = 'SQLite 3'; } - elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = 'SQLite 2'; } - if ($memcached_ok) { $storage_types[] = 'Memcached'; } - elseif ($memcache_ok) { $storage_types[] = 'Memcache'; } - echo '* Storage types available for response caching:' . PHP_EOL . ' ' . implode(', ', $storage_types) . PHP_EOL . PHP_EOL; - - if (!$openssl_ok) { echo '* You\'re missing the OpenSSL extension, which means that you won\'t be able' . PHP_EOL . ' to take advantage of CloudFront Private URLs or Windows password decryption.' . PHP_EOL . PHP_EOL; } - if (!$zlib_ok) { echo '* You\'re missing the Zlib extension, which means that the SDK will be unable' . PHP_EOL . ' to request gzipped data from Amazon and you won\'t be able to take advantage' . PHP_EOL . ' of compression with the response caching feature.' . PHP_EOL . PHP_EOL; } -} -else -{ - if (!$php_ok) { echo '* ' . failure('PHP:') . ' You are running an unsupported version of PHP.' . PHP_EOL . PHP_EOL; } - if (!$curl_ok) { echo '* ' . failure('cURL:') . ' The cURL extension is not available. Without cURL, the SDK cannot' . PHP_EOL . ' connect to -- or authenticate with -- Amazon\'s services.' . PHP_EOL . PHP_EOL; } - if (!$simplexml_ok) { echo '* ' . failure('SimpleXML:') . ': The SimpleXML extension is not available. Without SimpleXML,' . PHP_EOL . ' the SDK cannot parse the XML responses from Amazon\'s services.' . PHP_EOL . PHP_EOL; } - if (!$dom_ok) { echo '* ' . failure('DOM:') . ': The DOM extension is not available. Without DOM, the SDK' . PHP_EOL . ' Without DOM, the SDK cannot transliterate JSON responses from Amazon\'s' . PHP_EOL . ' services into the common SimpleXML-based pattern used throughout the SDK.' . PHP_EOL . PHP_EOL; } - if (!$spl_ok) { echo '* ' . failure('SPL:') . ' Standard PHP Library support is not available. Without SPL support,' . PHP_EOL . ' the SDK cannot autoload the required PHP classes.' . PHP_EOL . PHP_EOL; } - if (!$json_ok) { echo '* ' . failure('JSON:') . ' JSON support is not available. AWS leverages JSON heavily in many' . PHP_EOL . ' of its services.' . PHP_EOL . PHP_EOL; } - if (!$pcre_ok) { echo '* ' . failure('PCRE:') . ' Your PHP installation doesn\'t support Perl-Compatible Regular' . PHP_EOL . ' Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via' . PHP_EOL . ' regular expressions.' . PHP_EOL . PHP_EOL; } - if (!$file_ok) { echo '* ' . failure('File System Read/Write:') . ' The file_get_contents() and/or file_put_contents()' . PHP_EOL . ' functions have been disabled. Without them, the SDK cannot read from,' . PHP_EOL . ' or write to, the file system.' . PHP_EOL . PHP_EOL; } -} - -echo '----------------------------------------' . PHP_EOL; -echo PHP_EOL; - -if ($compatiblity === REQUIREMENTS_ALL_MET) -{ - echo success('Bottom Line: Yes, you can!') . PHP_EOL; - echo PHP_EOL; - echo 'Your PHP environment is ready to go, and can take advantage of all possible features!' . PHP_EOL; - - echo PHP_EOL; - echo info('Recommended settings for config.inc.php') . PHP_EOL; - echo PHP_EOL; - - echo "CFCredentials::set(array(" . PHP_EOL; - echo " '@default' => array(" . PHP_EOL; - echo " 'key' => 'aws-key'," . PHP_EOL; - echo " 'secret' => 'aws-secret'," . PHP_EOL; - echo " 'default_cache_config' => "; - if ($apc_ok) echo success('\'apc\''); - elseif ($xcache_ok) echo success('\'xcache\''); - elseif ($file_ok) echo success('\'/path/to/cache/folder\''); - echo "," . PHP_EOL; - echo " 'certificate_authority' => " . success($ssl_result ? 'true' : 'false') . PHP_EOL; - echo " )" . PHP_EOL; - echo "));" . PHP_EOL; -} -elseif ($compatiblity === REQUIREMENTS_MIN_MET) -{ - echo success('Bottom Line: Yes, you can!') . PHP_EOL; - echo PHP_EOL; - echo 'Your PHP environment is ready to go! There are a couple of minor features that' . PHP_EOL . 'you won\'t be able to take advantage of, but nothing that\'s a show-stopper.' . PHP_EOL; - - echo PHP_EOL; - echo info('Recommended settings for config.inc.php') . PHP_EOL; - echo PHP_EOL; - - echo "CFCredentials::set(array(" . PHP_EOL; - echo " '@default' => array(" . PHP_EOL; - echo " 'key' => 'aws-key'," . PHP_EOL; - echo " 'secret' => 'aws-secret'," . PHP_EOL; - echo " 'default_cache_config' => "; - if ($apc_ok) echo success('\'apc\''); - elseif ($xcache_ok) echo success('\'xcache\''); - elseif ($file_ok) echo success('\'/path/to/cache/folder\''); - echo "," . PHP_EOL; - echo " 'certificate_authority' => " . ($ssl_result ? 'false' : 'true') . PHP_EOL; - echo " )" . PHP_EOL; - echo "));" . PHP_EOL; -} -else -{ - echo failure('Bottom Line: We\'re sorry...') . PHP_EOL; - echo 'Your PHP environment does not support the minimum requirements for the ' . PHP_EOL . 'AWS SDK for PHP.' . PHP_EOL; -} - -echo PHP_EOL; diff --git a/3rdparty/aws-sdk/_docs/CHANGELOG.md b/3rdparty/aws-sdk/_docs/CHANGELOG.md deleted file mode 100644 index 52db66f4f6..0000000000 --- a/3rdparty/aws-sdk/_docs/CHANGELOG.md +++ /dev/null @@ -1,1405 +0,0 @@ -# Changelog: 1.5.6.2 "Gershwin" -Code name for Apple's never-released successor to the never-released Copeland. - -Launched Tuesday, May 29th, 2012. - -## Services -### AmazonDynamoDB -- **Fixed:** STS credentials were not always being cached correctly. - ----- - -# Changelog: 1.5.6.1 "Gershwin" -Code name for Apple's never-released successor to the never-released Copeland. - -Launched Tuesday, May 24th, 2012. - -## Services -### AmazonDynamoDB -- **Fixed:** STS credentials were not always being cached correctly. - ----- - -# Changelog: 1.5.6 "Gershwin" -Code name for Apple's never-released successor to the never-released Copeland. - -Launched Tuesday, May 15th, 2012. - -## Services -### AmazonSES -- **New:** Support for domain verification has been added to the SDK, which enables customers to verify an entire email domain. -- **New:** Requests to this service are now signed with Signature V4. - ----- - -# Changelog: 1.5.5 "Fishhead" -Code name for the Apple II File Mangement Utility. - -Launched Wednesday, May 9, 2012. - -## Services -### AmazonCloudFormation -* **New:** Requests to this service are now signed with Signature V4. - -### AmazonCloudFront -* **New:** Updated the supported API version to `2012-03-15`. - -### AmazonDynamoDB -* **New:** Support for the US West (Northern California), US West (Oregon), Asia Pacific "Southeast" (Signapore) endpoints have been added. - -### AmazonElasticBeanstalk -* **New:** Support for the new Asia Pacific "Northeast" (Japan) endpoint has been added. - -### AmazonStorageGateway -* **New:** Support for the AWS Storage Gateway service has been added to the SDK. - ---- - -# Changelog: 1.5.4 "Enterprise" -Code name for Mac OS X Server 1.0 (Rhapsody CR1). - -Launched Thursday, April 19, 2012. - -## Bug fixes and enhancements -* [PHP SDK Bug - Memory leak](https://forums.aws.amazon.com/thread.jspa?threadID=72310) -* [Does update_object work in 1.5.3?](https://forums.aws.amazon.com/thread.jspa?threadID=89297) -* [The value of CURLOPT_SSL_VERIFYHOST](https://forums.aws.amazon.com/thread.jspa?threadID=86186) -* [PHP SDK BUG: s3.class.php Line 2396 on 1.5.2](https://forums.aws.amazon.com/thread.jspa?threadID=86779) -* [first create_bucket(), then get_bucket_list()](https://forums.aws.amazon.com/thread.jspa?messageID=318885) -* [Issue with AmazonS3::get_object_list() max-keys](https://forums.aws.amazon.com/thread.jspa?threadID=85878) -* [Correct the "Bottom line" minimum requirements check](https://github.com/amazonwebservices/aws-sdk-for-php/pull/23) -* [S3 PHP SDK: copy_object() fails to update the header](http://stackoverflow.com/questions/7677837/s3-php-sdk-copy-object-fails-to-update-the-header) -* [Adds the following utility methods to simplexml.class.php](https://github.com/amazonwebservices/aws-sdk-for-php/pull/22) -* [Adding the ability to name a 'rule' for Object Expiration (suggested tweak)](https://forums.aws.amazon.com/thread.jspa?messageID=328023) - -## Runtime -* **New:** Support for Signature Version 4 has been added to the SDK. Signature Version 4 is now the default authentication method for AWS Identity and Access Management, AWS Security Token Service and Amazon CloudSearch. - -## Services -### AmazonCloudFront -* **New:** Support for a Minimum TTL of zero has been added to the SDK. - -### AmazonCloudSearch -* **New:** Support for Amazon CloudSearch has been added to the SDK. This includes only the Configuration API. - -### AmazonDynamoDB -* **New:** Support for BatchWriteItem API has been added to the SDK. -* **New:** Support for the European (Ireland) endpoint has been added. -* **New:** Support for the Asia Pacific "Northeast" (Tokyo) endpoint has been added. -* **New:** Amazon DynamoDB Session Handler has been added to the SDK. -* **New:** A simplified interface for adding attributes has been added to the SDK. - -### AmazonEC2 -* **New:** The new "m1.medium" instance type is now supported. -* **New:** Amazon EBS support for Volume Status and Volume Attributes have been added to the SDK. -* **New:** Amazon EBS support for Conversion Tasks has been added to the SDK. -* **New:** Amazon EC2 support for the Report Instance Status feature has been added to the SDK. -* **New:** Amazon VPC support for Network Interfaces has been added to the SDK. -* **Fixed:** Various parameter fixes have been applied. - -### AmazonIAM -* **New:** Support for Password Policies and the ability to change passwords has been added to the SDK. - -### AmazonS3 -* **New:** Support for pre-signed URLs using temporary credentials has been added to the SDK. -* **New:** Support for setting a custom name to Lifecycle (i.e., Object Expiration) rules has been added to the SDK. -* **New:** Support for pre-signed URLs with https has been added to the SDK. -* **Fixed:** Resolved an issue where setting a custom XML parsing class was not being respected. -* **Fixed:** Resolved an issue where the `get_object_list()` method would return an incorrect number of entries. -* **Fixed:** Resolved an issue where `update_object()` was attempting to COPY instead of REPLACE. -* **Fixed:** Resolved an issue stemming from using path-style URLs, `create_bucket()` + `list_bucket()` and the EU-West region. -* **Fixed:** Resolved an issue where XML responses were not being parsed consistently. -* **Fixed:** Resolved an issue where Private Streaming URLs contained a double-encoded signature. -* **Fixed:** The `Expect: 100-continue` HTTP header is now only sent during `create_object()` and `upload_part()` requests. - -## Utilities -### CFRuntime -* **Fixed:** Resolved an issue where `CURLOPT_SSL_VERIFYHOST` was not set strictly enough. -* **Fixed:** The `Expect: 100-continue` HTTP header is no longer set on every request. - -### CFSimpleXML -* **New:** Support for `matches()`, `starts_with()` and `ends_with()` methods have been added to the SDK. (Thanks [Wil Moore III](https://github.com/wilmoore)!) - -## Compatibility Test -* **New:** SDK Compatibility Test pages are marked up as to not be indexed by search engines. (Thanks [Eric Caron](http://www.ericcaron.com)!) -* **Fixed:** Duplicate code between the CLI and web versions of the SDK has been refactored. (Thanks [Jimmy Berry](https://github.com/boombatower)!) - ---- - -# Changelog: 1.5.3 "Darwin" -UNIX foundation upon which Mac OS X, Apple TV, and iOS are based. - -Launched Wednesday, Tuesday, February 21, 2012. - -## Bug fixes and enhancements -* [Fixing Issue with set_distribution_config](https://github.com/amazonwebservices/aws-sdk-for-php/pull/20) - -## Services -### AmazonCloudFront -* **Fixed:** Resolved an issue where the `set_distribution_config()` method could fail to satisfy an API constraint when using a custom origin server. (Thanks [zoxa](https://github.com/zoxa)!) - -### AmazonSWF -* **New:** Support for the new Amazon Simple Workflow Service has been added to the SDK. - ----- - -# Changelog: 1.5.2 "Copland" -Code name for Apple's never-released successor to System 7. - -Launched Wednesday, Febraury 1, 2012. - -## Bug fixes and enhancements -* [SSL Cert on PHP SDK 1.5.0.1 ](https://forums.aws.amazon.com/thread.jspa?threadID=84947) -* [Stream Wrapper need a buffer !](https://forums.aws.amazon.com/thread.jspa?threadID=85436) -* [Fixing Issue with set_distribution_config](https://github.com/amazonwebservices/aws-sdk-for-php/pull/20) -* [[Bug] SDK Autoloader Interferes with PHPExcel Autoloader](https://forums.aws.amazon.com/thread.jspa?threadID=85239) -* [get_object query does not always return the same content type](https://forums.aws.amazon.com/thread.jspa?threadID=84148) -* [AWSSDKforPHP/authentication/swift_transport_esmtp_signature_handler.class.p ](https://forums.aws.amazon.com/thread.jspa?threadID=85087) - -## Runtime -* **New:** Updated the CA Root Certificates file to version 1.81. -* **Fixed:** Resolved an issue in the autoloader where the matching logic was too aggressive in certain cases, causing subsequent autoloaders to never trigger. - -## Services -### AmazonAS -* **New:** Support for Auto Scaling Resource Tagging has been added to the SDK. - -### AmazonS3 -* **Fixed:** Resolved an issue where `delete_all_objects()` and `delete_all_object_versions()` was being limited to 1000 items. -* **Fixed:** Resolved an issue where `delete_bucket()` would fail to delete a bucket with the "force" option enabled if the bucket contained more than 1000 items. -* **Fixed:** Resolved an issue where JSON documents stored in Amazon S3 would be parsed into a native PHP object when retrieved. - -## Utilities -### S3StreamWrapper -* **New:** Support for multiple stream wrappers (e.g., one per region) has been added to the SDK. -* **Fixed:** Writes to Amazon S3 are now buffered, resolving issues with pushing more than 8k of data at a time. - -### CFJSON -* **Fixed:** The JSON-to-XML conversion code is now substantially more robust and better handles encoded characters. - -### CacheCore -* **Changed:** Formerly, attempting to cache to a file system location that didn't exist or was not writable by the PHP process would fail silently. This behavior has been changed to throw a `CacheFile_Exception`. - ----- - -# Changelog: 1.5.1 "Blue" -Code name for Macintosh System 7. - -Launched Wednesday, January 18, 2012. - -## Bug fixes and enhancements -* [Documentation patch](https://github.com/amazonwebservices/aws-sdk-for-php/pull/13) -* [Removed duplicate comment line.](https://github.com/amazonwebservices/aws-sdk-for-php/pull/17) -* [CFRuntime credentials handling issue](https://forums.aws.amazon.com/thread.jspa?messageID=310388) -* [PHP 5.2 bug in AWS SDK for PHP 1.5.x](https://forums.aws.amazon.com/thread.jspa?messageID=311543) -* [[Bug] Custom Curl Opts Lost During Retry](https://forums.aws.amazon.com/thread.jspa?threadID=84835) -* [json_last_error doesn't exist before php v 5.3.0](https://github.com/amazonwebservices/aws-sdk-for-php/pull/12) -* [XML still being parsed when use_cache_flow is false](https://github.com/amazonwebservices/aws-sdk-for-php/pull/15) -* [Bug ssl_verification option not respected for AmazonS3 ](https://forums.aws.amazon.com/thread.jspa?threadID=83710) -* [[Bug] Compatibility test for Garbage Collector enabled should use ini_get](https://forums.aws.amazon.com/thread.jspa?threadID=84156) - -## Runtime -* **Fixed:** Corrected an issue where calling `AmazonS3->get_object()` would continue to parse the content if caching was being leveraged. (Thanks [Eric Caron](http://www.ericcaron.com)!) -* **Fixed:** The autoloader now returns `false` for any class it doesn't match, allowing subsequent autoloaders to catch the class name. (Thanks [Eric Caron](http://www.ericcaron.com)!) -* **Fixed:** An issue that caused CloudWatch to fail to decompress gzipped data correctly has been resolved. -* **Fixed:** Resolved an issue with passing explicit credentials without requiring a config file or a `CFCredentials` declaration. -* **Fixed:** Resolved an issue which causes custom cURL options to be unset from the payload when retrying. - -## Services -### AmazonAS -* **New:** Support for Amazon SNS notifications and Tagging have been added to the SDK. - -### AmazonCloudFront -* **Fixed:** Resolved an issue with disabling SSL verification. -* **Fixed:** Resolved an issue where `AmazonCloudFront` were throwing warnings in `E_STRICT` mode. - -### AmazonCloudWatch -* **Fixed:** Resolved an issue with decompressing gzipped data. - -### AmazonDynamoDB -* **New:** Support for Amazon DynamoDB has been added to the SDK. -* **New:** Amazon DynamoDB requires a default cache configuration to be set in the credential set, otherwise it will not function properly. - -### AmazonS3 -* **Fixed:** Resolved an issue with disabling SSL verification. -* **Fixed:** Resolved multiple documentation issues. (Thanks [Aizat Faiz](http://aizatto.com) and [Jason Ardell](http://ardell.posterous.com/)!) -* **Fixed:** Resolved an issue where `AmazonS3` were throwing warnings in `E_STRICT` mode. - -### AmazonSNS -* **New:** Support for Short Messaging Service (SMS) endpoints has been added to the SDK. -* **New:** Support for Subscription Attributes has been added to the SDK. - -## Utilities -### CFJSON -* **Fixed:** Support for the handling of JSON nulls in PHP 5.2 has been improved. (Thanks [David Chan](http://www.chandeeland.org)!) - -## Compatibility Test -* **Fixed:** The SDK compatibility test now uses `ini_get()` instead of `get_cfg_var()` and `get_cfg_ini()` for more accurate test results. - - ----- - -# Changelog: 1.5 "Allegro" -Code name for Mac OS 8.5. - -Launched Wednesday, December 14, 2011 - -## Credentials -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - The function signature of all service constructors has changed. Instead of passing a key and secret as the first and second parameters, the constructor now accepts a hash (associative array) containing `key` and `secret` keys. Please see the API reference documentation - -## Runtime -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - The function signature of all service constructors has changed. Instead of passing a key and secret as the first and second parameters, the constructor now accepts a hash (associative array) containing `key` and `secret` keys. If you are explicitly passing a key and secret to the constructor, you will need to change your code. If you are simply inheriting your default credentials from a config file, you don't need to make any changes beyond upgrading your config file to the new 1.5 format. Please see the API reference documentation for more information. -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - The method by which the `config.inc.php` file maintains its list of credentials has been re-factored and updated to support managing multiple sets of credentials in a single location (e.g., development, staging, production). -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - The `init()` method has been renamed to `factory()` to better reflect what it actually does. -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - The `adjust_offset()` method has been removed. Instead, please ensure that the machine's time is set correctly using an [NTP server](https://secure.wikimedia.org/wikipedia/en/wiki/Network_Time_Protocol). -* !! BACKWARDS-INCOMPATIBLE CHANGE !! - In version 1.4 we enabled a mode where -- for services that supported it -- a set of temporary credentials were fetched and cached before the first request. This functionality has been reverted. The use of short-term credentials must be explicitly enabled by instantiating the `AmazonSTS` class and passing those credentials into the service constructor. -* **New:** Improved the user directory lookup for the config file. -* **Changed:** Made `set_region()` an alias of `set_hostname()`. - -## Services -### AmazonAS -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonCloudFormation -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` -* **New:** Support for cost estimation of CloudFormation templates has been added to the SDK. - -### AmazonCloudWatch -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonEC2 -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` -* **New:** Support for 24x7 Reserved Instances has been added to the SDK. For more information, please see [New Amazon EC2 Reserved Instance Options Now Available](https://aws.amazon.com/about-aws/whats-new/2011/12/01/New-Amazon-EC2-Reserved-Instances-Options-Now-Available/). -* **New:** Support for VPC Spot Instances has been added to the SDK. For more information, please see [Announcing Amazon EC2 Spot Integration with Amazon VPC](https://aws.amazon.com/about-aws/whats-new/2011/10/11/announcing-amazon-ec2-spot-integration-with-amazon-vpc/). -* **New:** Support for VPC Everywhere has been added to the SDK. For more information, please see [Amazon VPC Generally Available in Multiple AZs in All Regions](https://aws.amazon.com/about-aws/whats-new/2011/08/03/Announcing-VPC-GA/). -* **New:** Instance Type-related constants have been added to the SDK: `INSTANCE_MICRO`, `INSTANCE_SMALL`, `INSTANCE_LARGE`, `INSTANCE_XLARGE`, `INSTANCE_HIGH_MEM_XLARGE`, `INSTANCE_HIGH_MEM_2XLARGE`, `INSTANCE_HIGH_MEM_4XLARGE`, `INSTANCE_HIGH_CPU_MEDIUM`, `INSTANCE_HIGH_CPU_XLARGE`, `INSTANCE_CLUSTER_4XLARGE`, `INSTANCE_CLUSTER_8XLARGE`, `INSTANCE_CLUSTER_GPU_XLARGE`. - -### AmazonElastiCache -* **New:** Support for US-West 1 (California), EU-West (Ireland), Asia Pacific Southeast (Singapore), and Asia Pacific Northeast (Tokyo) regions has been added to the SDK. For more information, please see [Amazon ElastiCache is now available in four additional AWS Regions and as a CloudFormation template](https://aws.amazon.com/about-aws/whats-new/2011/12/05/amazon-elasticache-new-regions/). -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO` - -### AmazonElasticBeanstalk -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA` - -### AmazonELB -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` -* **New:** Support for ELBs running in VPC has been added to the SDK. For more information, please see [Announcing Elastic Load Balancing in Amazon VPC](https://aws.amazon.com/about-aws/whats-new/2011/11/21/announcing-elastic-load-balancing-in-amazon-vpc/). - -### AmazonEMR -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` -* **New:** Support for EMR AMI Versioning, new Hadoop and Pig versions, and EMR running in VPC has been added to the SDK. For more information, please see [Amazon Elastic MapReduce Announces Support for New Hadoop and Pig Versions, AMI Versioning, and Amazon VPC](https://aws.amazon.com/about-aws/whats-new/2011/12/11/amazon-elastic-mapreduce-ami-versioning-vpc/). - -### AmazonIAM -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA` - -### AmazonImportExport -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA` - -### AmazonRDS -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonS3 -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` -* **New:** Support for an S3 Stream Wrapper has been added to the SDK. This enables users to read/write to Amazon S3 as though it were the local file system. -**Fixed:** The `get_object()` method no longer attempts to parse XML/JSON content. -**Fixed:** Simplified S3 region logic. Now uses fully-qualified domain names across the board. - -### AmazonSES -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA` - -### AmazonSDB -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonSNS -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonSQS -* **New:** Support for the South American (São Paulo) region has been added to the SDK. -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA`, `REGION_CALIFORNIA`, `REGION_OREGON`, `REGION_IRELAND`, `REGION_SINGAPORE`, `REGION_TOKYO`, `REGION_SAO_PAULO` - -### AmazonSTS -* **New:** Plain english aliases have been added to the SDK: `REGION_VIRGINA` - - ----- - -# Changelog: 1.4.8 "Zanarkand" - - -Launched Wednesday, December 7, 2011 - -## Services -### AmazonCloudFront -* **Fixed:** Merged in a pull request contributed by Ben Lumley: - -### AmazonEC2 -* **Fixed:** Resolved an issue where `set_region()` was not setting the correct endpoint for the region. - -### AmazonS3 -* **New:** Support for S3-side multi-object delete has been added to the SDK as the `delete_objects()` method. The implementations of `delete_all_objects()` and `delete_all_object_versions()` have been updated to use this new functionality. -* **Changed:** XML and JSON responses from `get_object()` are no longer parsed. The raw XML and JSON string content is now returned. - - ----- - -# Changelog: 1.4.7 "Yuna" - - -Launched Wednesday, November 9, 2011 - -## Service Classes -### AmazonAS -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonCloudFormation -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonCloudWatch -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. -* **New:** Support for the US GovCloud region has been added to the SDK. - -### AmazonEC2 -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. -* **New:** Support for the US GovCloud region has been added to the SDK. - -### AmazonELB -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonEMR -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonIAM -* **New:** Support for the US GovCloud region has been added to the SDK. - -### AmazonRDS -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonS3 -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. -* **Fixed:** Resolved an issue where certain bits of metadata were not maintained during a copy operation. -* **Fixed:** Resolved an issue where an unsuccessful lookup of an existing content-type would throw a warning. -* **Fixed:** Resolved an issue where an exception would be thrown when a filesize lookup was attempted on an object that didn't exist. - -### AmazonSDB -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonSNS -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - -### AmazonSQS -* **New:** Support for the US-West 2 (Oregon) region has been added to the SDK. - - ----- - -# Changelog: 1.4.6 "Xezat" - - -Launched Thursday, November 3, 2011 - -## Service Classes -### AmazonIAM -* **New:** Support for a virtual MFA device. A virtual MFA device uses a software application that can generate six-digit authentication codes that are Open AuTHentication Time-based One-Time Password (OATHTOTP)-compatible. The software application can run on any mobile hardware device, including a smartphone. - - ----- - -# Changelog: 1.4.5 "Weiss" - - -Launched Friday, October 21, 2011 - -## Service Classes -### AmazonSQS -* **New:** Support for delayed queues and batch operations has been added to the SDK. - - ----- - -# Changelog: 1.4.4 "Vaan" - - -Launched Tuesday, October 12, 2011 - -## Runtime -* **Fixed:** Resolved an issue where a segmentation fault is triggererd when there are multiple autoloaders in the stack and one of them doesn't return a value. - -## Service Classes -### AmazonS3 -* **New:** Support for server-side encryption has been added to the SDK. - - ----- - -# Changelog: 1.4.3 "Ultros" - - -Launched Friday, September 30, 2011 - -## Service Classes -### AmazonCloudFormation -* **New:** Support for new features in CloudFormation have been added to the SDK. - -### AmazonS3 -* **Fixed:** Setting the default cache configuration no longer causes authentication errors in `AmazonS3`. - - ----- - -# Changelog: 1.4.2.1 "Tiamat, Part II" - - -Launched Wednesday, September 7, 2011 - -## Utility Classes -### RequestCore -* **Fixed:** RequestCore has updated the `cacert.pem` file from Mozilla. This update revokes trust from the DigiNotar and Staat der Nederlanden root certificates. - - ----- - -# Changelog: 1.4.2 "Tiamat" - - -Launched Thursday, September 1, 2011 - -## Service Classes -### AmazonEC2 -* **Fixed:** Requests made to Amazon EC2 now use the correct API version (2011-07-15). - -### AmazonELB -* **New:** A pre-defined set of ciphers may now be used for SSL termination at the Elastic Load Balancer. -* **New:** Application servers can now accept secure communication from the corresponding Elastic Load Balancer. -* **New:** In cases where HTTPS is required for all traffic entering the back-end server, Elastic Load Balancing can now perform health checks using HTTPS. -* **New:** White list of public keys can now be associated with back-end servers. Elastic Load Balancing authenticates back-end servers with the public keys in the white list and communicates only with back-end servers that pass this authentication check. - -## Utility Classes -### RequestCore -* **Fixed:** RequestCore has updated the `cacert.pem` file from Mozilla. This update revokes trust from the DigiNotar root certificate. - - ----- - -# Changelog: 1.4.1 "Sephiroth" - - -Launched Tuesday, August 23, 2011 - -## Service Classes -### AmazonElastiCache -* **New:** Support for Amazon ElastiCache has been added to the SDK. - -### AmazonEMR -* **New:** Support for Hadoop Bootstrap Actions has been added to the SDK. -* **New:** Support for Amazon Elastic MapReduce on Spot Instances has been added to the SDK. -* **New:** Support for Termination Protection has been added to the SDK. -* **Changed:** For the add_instance_groups() method, the $instance_groups and $job_flow_id parameters have been reversed. - -## Utility Classes -### CFHadoopBootstrap -* **New:** The `CFHadoopBootstrap` class has been added to the SDK. Simplifies the process of working with Hadoop system and daemon configurations in Amazon EMR. -* **New:** This class extends from the `CFHadoopBase` class. - - ----- - -# Changelog: 1.4 "Rikku" - - -Launched Wednesday, August 3, 2011 - -## Bug fixes and enhancements - -## Service Classes -### AmazonEC2 -* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. - -### AmazonS3 -* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. - -### AmazonSNS -* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. - -### AmazonSQS -* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. - -### AmazonSTS -* **New:** Support for the Amazon Secure Token Service (STS) has been added to the SDK. - -## Utility Classes -### CFRuntime -* **New:** The following anonymous datapoints are now collected in aggregate so that we can make more informed decisions about future SDK features: `memory_limit`, `date.timezone`, `open_basedir`, `safe_mode`, `zend.enable_gc`. - -## Compatibility Test -* **New:** Support for verifying the installed SSL certificate has been added to the compatibility test. -* **New:** Support for verifying the status of `open_basedir` and `safe_mode` has been added to the compatibility test. -* **New:** Support for verifying the status of the PHP 5.3 garbage collector has been added to the compatibility test. -* **New:** The compatibility test now recommends optimal values for the `AWS_CERTIFICATE_AUTHORITY` and `AWS_DEFAULT_CACHE_CONFIG` configuration options based on the system's configuration. - - ----- - -# Changelog: 1.3.7 "Quistis" - - -Launched Monday, July 25, 2011 - -## Bug fixes and enhancements -* Addressed minor bug fixes reported via the feedback form in the API Reference. - -## Service Classes -### AmazonAS -* **Changed:** Introduced backwards-incompatible changes to the put_scheduled_update_group_action() method. - - ----- - -# Changelog: 1.3.6 "Penelo" - - -Launched Tuesday, July 12, 2011 - -## Bug fixes and enhancements -* [[Bug Report] rawurlencode error when using SES and curlopts](https://forums.aws.amazon.com/thread.jspa?threadID=68484) - -## Service Classes -### AmazonCloudFormation -* **New:** Support for the `list_stacks()` method has been added to the SDK. - -### AmazonElasticBeanstalk -* **New:** Support for the `swap_environment_cnames()` method has been added to the SDK. - -### AmazonS3 -* **Fixed:** Additional information about maximum open connections has been added to the `create_mpu_object()` method. - -## Compatibility Test -* **New:** Now tests whether the system is 64- or 32-bit. - - ----- - -# Changelog: 1.3.5 "Occuria" - - -Launched Tuesday, June 21, 2011 - -## Service Classes -### AmazonS3 -* **New:** Support for S3 copy part has been added to the SDK. - - ----- - -# Changelog: 1.3.4 "Nero" - - -Launched Tuesday, June 7, 2011 - -## Bug fixes and enhancements -* [Bug in PHP SDK](https://forums.aws.amazon.com/thread.jspa?threadID=67502) -* [cURL error: SSL certificate problem (60) with aws-sdk-for-php 1.3.3](https://forums.aws.amazon.com/thread.jspa?threadID=68349) - - -## Service Classes -### AmazonEC2 -* **New:** Support for Local Availability Zone Pricing has been added to the SDK. - -### AmazonELB -* **New:** Elastic Load Balancing provides a special Amazon EC2 security group that you can use to ensure that a back-end Amazon EC2 instance receives traffic only from its load balancer. - -### AmazonRDS -* **New:** Support for Oracle databases has been added to the SDK. - - -## Utility Classes -### CFArray -* **New:** Added the init() method which simplifies the process of instantiating and chaining a class. -* **New:** Added support for associative arrays to `each()`, `map()` and `filter()`. - -### CFRequest -* **New:** Now supports the `AWS_CERTIFICATE_AUTHORITY` configuration option. - - ----- - -# Changelog: 1.3.3 "Moogle" - - -Launched Tuesday, May 10, 2011 - -## Bug fixes and enhancements -* [Bug in AmazonCloudFront::get_private_object_url](https://forums.aws.amazon.com/thread.jspa?threadID=64004) -* [SDK 1.3.2 - Call to undefined function json_last_error()](https://forums.aws.amazon.com/thread.jspa?threadID=64767) -* [CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir](https://forums.aws.amazon.com/thread.jspa?threadID=61333) - - -## Service Classes -### AmazonCloudFront -* **Fixed:** Resolved an issue where the expires value for `get_private_object_url()` only accepted a string instead of a string or integer. - -### AmazonCloudWatch -* **New:** Support for CloudWatch custom user metrics has been added to the SDK. - - -## Extensions -### S3BrowserUpload -* **New:** Added the `S3BrowserUpload` class to the SDK. This class assists in generating the correct HTML/XHTML markup for uploading files to S3 via an HTML
    element. - - -## Utility Classes -### CFArray -* **New:** Added the `init()` method which simplifies the process of instantiating and chaining a class. - -### CFHadoopBase -* **New:** The `CFHadoopBase` class has been extracted out of `CFHadoopStep` as a shared library. - -### CFHadoopStep -* **New:** The `CFHadoopBase` class has been extracted out of `CFHadoopStep` as a shared library. -* **New:** This class now extends from the `CFHadoopBase` class. - -### CFJSON -* **Fixed:** Resolved an issue where a PHP 5.3-specific function was being used. - -### CFPolicy -* **New:** Added the init() method which simplifies the process of instantiating and chaining a class. - -### CFSimpleXML -* **New:** Added the init() method which simplifies the process of instantiating and chaining a class. - -### RequestCore -* **Fixed:** Improvements to running in PHP environments with open_basedir enabled. -* **Fixed:** RequestCore now uses an up-to-date `cacert.pem` file from Mozilla instead of the Certificate Authority that libcurl or libopenssl was compiled with, which should resolve certain issues with making SSL connections to AWS services. - - ----- - -# Changelog: 1.3.2 "Luna" - - -Launched Tuesday, April 5, 2011 - -## New Features & Highlights (Summary) -* Support for Dedicated Instances within a Virtual Private Cloud on single-tenant hardware has been added to the SDK. -* Bug fixes and enhancements: - * [AmazonCloudWatch get_metric_statistics returns gzipped body](https://forums.aws.amazon.com/thread.jspa?threadID=62625) - - -## Service Classes -### AmazonCloudWatch -* **Fixed:** Worked around an issue where when CloudWatch sends back `Content-Encoding: gzip`, it really means `deflate`. When CloudWatch sends back `Content-Encoding: deflate`, it really means the data isn't encoded at all. - -### AmazonEC2 -* **New:** Support for Dedicated Instances within a Virtual Private Cloud on single-tenant hardware has been added to the SDK. - - ----- - -# Changelog: 1.3.1 "Kraken" - - -Launched Friday, March 25, 2011 - -## New Features & Highlights (Summary) -* Fixed issues with Signature v3 authentication (SES). -* Added gzip decoding. -* Added support for converting data to more alternate formats. -* Bug fixes and enhancements: - * [Cannot send email](https://forums.aws.amazon.com/thread.jspa?threadID=62833) - * [AmazonCloudWatch get_metric_statistics returns gzipped body](https://forums.aws.amazon.com/thread.jspa?threadID=62625) - - -## Utility Classes -### CFArray -* **New:** The `to_json()` and `to_yaml()` methoda have been added to the class. - -### CFGzipDecode -* **New:** Handles a variety of primary and edge cases around gzip/deflate decoding in PHP. - -### CFRuntime -* **New:** Gzip decoding has been added to the SDK. -* **Fixed:** The previous release contained a regression in the Signature v3 support that affected AmazonSES. This has been resolved. -* **Fixed:** Completed support for Signature v3 over HTTP connections. - -### CFSimpleXML -* **New:** The `to_stdClass()` and `to_yaml()` methoda have been added to the class. - - ----- - -# Changelog: 1.3 "Jecht" - - -Launched Tuesday, March 15, 2011 - -## New Features & Highlights (Summary) -* Support for VPC Internet Access has been added to the SDK. -* Bug fixes and enhancements: - * [AmazonEC2::register_image issue](https://forums.aws.amazon.com/thread.jspa?threadID=52499) - * [Automatic Parseing of XML objects](https://forums.aws.amazon.com/thread.jspa?threadID=61882) - -## Service Classes -### AmazonEC2 -* **New:** Support for VPC Internet Access has been added to the SDK. -* **Fixed:** The `$image_location` parameter in the `register_image()` method is no longer required. This is a backwards-incompatible change. - -### AmazonS3 -* **Fixed:** Resolved an issue in `get_object()` where using the `lastmodified` and `etag` parameters required both to be set before taking effect. They can now be set independently from each other. - - -## Utility classes -### CFArray -* **Changed:** The `reduce()` method has been renamed to `filter()`. `reduce()` is now simply an alias for `filter()`. - -### CFJSON -* **New:** Simplifies the task of normalizing XML and JSON responses as `CFSimpleXML` objects. - -### CFRuntime -* **New:** Preliminary support for Signature v3 over HTTP has been added to the SDK. This is useful for debugging Signature v3 issues over non-HTTPS connections. -* **Changed:** Classes that use the shared authentication method (i.e., NOT `AmazonS3` or `AmazonCloudFront`) will automatically convert JSON service responses into a `CFSimpleXML` object. -* **Changed:** Formerly, the SDK would attempt to sniff the content to determine the type. Now, the SDK will check the HTTP response headers for `text/xml`, `application/xml` or `application/json` to determine whether or not to parse the content. If the HTTP response headers are not available, the SDK will still attempt content sniffing. - -### CFSimpleXML -* **New:** The `to_json()` method has been added to the class. - -### CFUtilities -* **New:** The `is_json()` method has been added to the class. - - ----- - -# Changelog: 1.2.6 "Ifrit" - - -Launched Wednesday, March 2, 2011 - -## New Features & Highlights (Summary) -* **New:** Support for the new Asia Pacific "Northeast" (Japan) endpoint has been added for all relevant services. -* **New:** Support for registering callback functions for read/write streams has been added to the SDK. Includes a runnable sample. -* **Fixed:** Improvements to avoid triggering warnings when PHP is in Safe Mode. - - -## Service Classes -### AmazonAS -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonCloudFormation -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonCloudWatch -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonEC2 -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonELB -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonRDS -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonS3 -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. -* **New:** Added support for `ap-northeast-1` as a location constraint when creating a new bucket. - -### AmazonSDB -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonSNS -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -### AmazonSQS -* **New:** Added a new _class_ constant: `REGION_APAC_NE1`. - -## Utility classes -### CFRuntime -* **New:** Support for registering callback functions for read/write streams has been added to the SDK. -* **New:** Future-proofed for future regional endpoints. - -### RequestCore -* **New:** Support for registering callback functions for read/write streams has been added to the SDK. -* **Fixed:** Improvements to avoid triggering warnings when PHP is in Safe Mode. - -## Samples -* **New:** A sample demonstrating how to add a command-line progress bar for S3 transfers has been added to the SDK. - - ----- - -# Changelog: 1.2.5 "Heidegger" - - -Launched Thursday, February 24, 2011 - -## New Features & Highlights (Summary) -* Support for AWS CloudFormation has been added to the SDK. -* Bug fixes and enhancements: - * [PHP API change_content_type() broken](https://forums.aws.amazon.com/thread.jspa?threadID=59532) - * [Bug setting OriginAccessIdentity for a Cloudfront distribution config](https://forums.aws.amazon.com/thread.jspa?threadID=60989) - -## Service Classes -### AmazonCloudFormation -* **New:** Support for AWS CloudFormation has been added to the SDK. - -### AmazonCloudFront -* **Fixed:** Issues around `update_xml_config()` have been resolved. - -### AmazonS3 -* **Fixed:** Issues around `change_content_type()` have been resolved. - - ----- - -# Changelog: 1.2.4 "Goltanna" - - -Launched Wednesday, February 16, 2011 - -## New Features & Highlights (Summary) -* Support for IAM account aliases and server certificates has been added to the SDK. -* Support for Amazon S3 Website Configuration has been added to the SDK. -* Documentation updates for Amazon RDS and AWS Import/Export. -* Updated all documentation blocks to adhere to the PHPDoc format. This enables a greater number of tools to take advantage of the SDK documentation. -* Rolled out a major update to the SDK API Reference. - -## Service Classes -### AmazonIAM -* **New:** Support for IAM account aliases and server certificates has been added to the SDK. - -### AmazonImportExport -* **New:** Documentation has been updated to note the new US West region support. - -### AmazonRDS -* **New:** Documentation has been updated to note the new support for MySQL 5.5. - -### AmazonS3 -* **New:** Support for Amazon S3 Website Configuration has been added to the SDK. - - ----- - -# Changelog: 1.2.3 "Fayth" - - -Launched Tuesday, January 25, 2010 - -## New Features & Highlights (Summary) -* Support for Amazon Simple Email Service has been added to the SDK. - -## Service Classes -### AmazonSES -* **New:** Support for Amazon Simple Email Service has been added to the SDK. - - ----- - -# Changelog: 1.2.2 "Esper" - - -Launched Tuesday, January 18, 2011 - -## New Features & Highlights (Summary) -* Support for Amazon Elastic Beanstalk has been added to the SDK. -* Bug fixes and enhancements: - * [AWS PHP S3 Library is not working out of the box](https://forums.aws.amazon.com/thread.jspa?threadID=55174) - * [Problem with create_mpu_object() and streaming_read_callback() in S3](https://forums.aws.amazon.com/thread.jspa?threadID=54541) - * [Integrated Uranium235's GitHub contributions](https://github.com/Uranium235/aws-sdk-for-php/compare/Streaming) - -## Service Classes -### AmazonElasticBeanstalk -* **New:** Support for AWS Elastic Beanstalk has been added to the SDK. - -### AmazonS3 -* **Fixed:** Major improvements to transferring data over streams. - -## Utility classes -###RequestCore -* **New:** Upgraded to version 1.4. -* **Fixed:** Major improvements to transferring data over streams. - - ----- - -# Changelog: 1.2.1 "Dio" - - -Launched Friday, January 14, 2011 - - -## New Features & Highlights (Summary) -* Support for S3 Response Headers has been added to the SDK. -* Bug fixes and enhancements: - * [copy_object failed between regions](https://forums.aws.amazon.com/thread.jspa?threadID=56893) - * [Possible S3 bug with multiple buckets?](https://forums.aws.amazon.com/thread.jspa?threadID=56561) - -## Service Classes -### AmazonS3 -* **New:** Support for S3 Response Headers has been added to the SDK. -* **New:** Documentation for Amazon S3 has been updated to include large object support details. -* **New:** The `abort_multipart_uploads_by_date()` method has been added to the SDK, which aborts multipart uploads that were initiated before a specific date. -* **Fixed:** Resolved an issue where the resource prefix wasn't being reset correctly. - -## Utility classes -### CFArray -* **New:** Instantiating the class without passing an array will use an empty array instead. -* **New:** Added the `compress()` method which removes null values from the array. -* **New:** Added the `reindex()` method which reindexes all array elements starting at zero. - -## Compatibility Test -* **New:** The command-line compatibility test now color-codes the responses. - - ----- - -# Changelog: 1.2 "Cloud" - - -Launched Friday, December 3, 2010 - - -## New Features & Highlights (Summary) -* Support for Amazon AutoScaling, Amazon Elastic MapReduce, and Amazon Import/Export Service has been added to the SDK. -* Support for metric alarms has been added to Amazon CloudWatch. -* Support for batch deletion has been added to Amazon SimpleDB. -* Bug fixes and enhancements: - * [EU Region DNS problem](https://forums.aws.amazon.com/thread.jspa?threadID=53028) - * [[SimpleDB] Conditional PUT](https://forums.aws.amazon.com/thread.jspa?threadID=55884) - * [Suggestions for the PHP SDK](https://forums.aws.amazon.com/thread.jspa?threadID=55210) - * [Updating a distribution config](https://forums.aws.amazon.com/thread.jspa?threadID=54888) - * [Problem with curlopt parameter in S3](https://forums.aws.amazon.com/thread.jspa?threadID=54532) - * [AmazonS3::get_object_list() doesn't consider max-keys option](https://forums.aws.amazon.com/thread.jspa?threadID=55169) - -## Base/Runtime class -* **New:** Added support for an alternate approach to instantiating classes which allows for method chaining (PHP 5.3+). -* **Changed:** Moved `CHANGELOG.md`, `CONTRIBUTORS.md`, `LICENSE.md` and `NOTICE.md` into a new `_docs` folder. -* **Changed:** Renamed the `samples` directory to `_samples`. -* **Changed:** Changed the permissions for the SDK files from `0755` to `0644`. -* **Fixed:** Resolved an issue where attempting to merge cURL options would fail. - -## Service Classes -### AmazonAS -* **New:** Support for the Amazon AutoScaling Service has been added to the SDK. - -### AmazonCloudFront -* **Fixed:** Resolved an issue where the incorrect formatting of an XML element prevented the ability to update the list of trusted signers. - -### AmazonCloudWatch -* **New:** Support for the Amazon CloudWatch `2010-08-01` service release expands Amazon's cloud monitoring offerings with custom alarms. -* **Changed:** The changes made to the `get_metric_statistics()` method are backwards-incompatible with the previous release. The `Namespace` and `Period` parameters are now required and the parameter order has changed. - -### AmazonEMR -* **New:** Support for the Amazon Elastic MapReduce Service has been added to the SDK. - -### AmazonImportExport -* **New:** Support for the Amazon Import/Export Service has been added to the SDK. - -### AmazonS3 -* **Fixed:** Resolved an issue in the `create_bucket()` method that caused the regional endpoint to be reset to US-Standard. -* **Fixed:** Resolved an issue in the `get_object_list()` method where the `max-keys` parameter was ignored. - -### AmazonSDB -* **New:** Support for `BatchDeleteAttributes` has been added to the SDK. -* **Fixed:** Resolved an issue where the `Expected` condition was not respected by `put_attributes()` or `delete_attributes()`. - - -## Utility classes -### CFComplexType -* **New:** You can now assign a `member` parameter to prefix all list identifiers. -* **Changed:** The `option_group()` method is now `public` instead of `private`. -* **Changed:** Rewrote the `to_query_string()` method to avoid the use of PHP's `http_build_query()` function because it uses `urlencode()` internally instead of `rawurlencode()`. - -### CFHadoopStep -* **New:** Simplifies the process of working with Hadoop steps in Amazon EMR. - -### CFManifest -* **New:** Simplifies the process of constructing YAML manifest documents for Amazon Import/Export Service. - -### CFStepConfig -* **New:** Simplifies the process of working with step configuration in Amazon EMR. - - -## Third-party Libraries -### CacheCore -* **Changed:** The `generate_timestamp()` method is now `protected` instead of `private`. - - ----- - -# Changelog: 1.1 "Barret" - - -Launched Wednesday, November 10, 2010 - - -## New Features & Highlights (Summary) -* Support for Amazon ELB, Amazon RDS and Amazon VPC has been added to the SDK. -* Support for the Amazon S3 multipart upload feature has been added to the SDK. This feature enables developers upload large objects in a series of requests for improved upload reliability. -* Support for the Amazon CloudFront custom origin (2010-11-01 release) feature has been added to the SDK. This feature enables developers to use custom domains as sources for Amazon CloudFront distributions. -* The `AmazonS3` class now supports reading from and writing to open file resources in addition to the already-supported file system paths. -* You can now seek to a specific byte-position within a file or file resource and begin streaming from that point when uploading or downloading objects. -* The methods `get_bucket_filesize()`, `get_object_list()`, `delete_all_objects()` and `delete_all_object_versions()` are no longer limited to 1000 entries and will work correctly for all entries. -* Requests that have errors at the cURL level now throw exceptions containing the error message and error code returned by cURL. -* Bug fixes and enhancements: - * [Bug in Samples](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52748) - * [EU Region DNS problem](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=53028) - * [AmazonS3 get_bucket_object_count](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52976) - * [S3: get_object_list() fatal error](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=53418) - * [S3 get_object_metadata() problems](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=54244) - * [Bug in authenticate in sdk.class.php](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=53117) - * [How to use Prefix with "get_object_list"?](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52987) - * [SignatureDoesNotMatch with utf-8 in SimpleDB](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52798) - * [Suggestion for the PHP SDK concerning streaming](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52787) - * [get_bucket_filesize only returns filesize for first 1000 objects](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=53786) - - -## Base/Runtime class -* **Changed:** Port numbers other than 80 and 443 are now part of the signature. -* **Changed:** When putting UTF-8 characters via HTTP `POST`, a `SignatureDoesNotMatch` error would be returned. This was resolved by specifying the character set in the `Content-Type` header. - - -## Service Classes -### AmazonCloudFront -* **New:** Support for the Amazon CloudFront non-S3 origin feature (2010-11-01 release) has been added to the SDK. This feature enables developers to use non-S3 domains as sources for Amazon CloudFront distributions. - -### AmazonEC2 -* **New:** Support for Amazon Virtual Private Cloud has been added to the SDK. - -### AmazonELB -* **New:** Support for Amazon Elastic Load Balancing Service has been added to the SDK. - -### AmazonIAM -* **Fixed:** Removed `set_region()` as IAM only supports a single endpoint. - -### AmazonRDS -* **New:** Support for Amazon Relational Database Service has been added to the SDK. - -### AmazonS3 -* **New:** Support for the Amazon S3 multipart upload feature has been added to the SDK. This feature enables developers upload large objects in a series of requests for improved upload reliability. -* **New:** The `fileUpload` and `fileDownload` options now support reading from and writing to open file resources in addition to the already-supported file system paths. -* **Fixed:** In Amazon S3, requests directly to the eu-west endpoint must use the path-style URI. The set_region() method now takes this into account. -* **Fixed:** As of version 1.0.1, CFSimpleXML extends SimpleXMLIterator instead of SimpleXMLElement. This prevented the `__call()` magic method from firing when `get_object_list()` was used. -* **Fixed:** The `preauth` option for the `get_object_list()` method has been removed from the documentation as it is not supported. -* **Fixed:** The methods `get_bucket_filesize()`, `get_object_list()`, `delete_all_objects()` and `delete_all_object_versions()` are no longer limited to 1000 entries and will work correctly for all entries. -* **Fixed:** Using `delete_bucket()` to force-delete a bucket now works correctly for buckets with more than 1000 versions. -* **Fixed:** The response from the `get_object_metadata()` method now includes all supported HTTP headers, including metadata stored in `x-amz-meta-` headers. -* **Fixed:** Previously, if the `get_object_metadata()` method was called on a non-existant object, metadata for the alphabetically-next object would be returned. - -### AmazonSQS -* **New:** The `get_queue_arn()` method has been added to the `AmazonSQS` class, which converts a queue URI to a queue ARN. - - -## Utility classes -### CFSimpleXML -* **New:** Added `to_string()` and `to_array()` methods. - - -## Third-party Libraries -### RequestCore -* **New:** Upgraded to version 1.3. -* **New:** Added `set_seek_position()` for seeking to a byte-position in a file or file resource before starting an upload. -* **New:** Added support for reading from and writing to open file resources. -* **Fixed:** Improved the reporting for cURL errors. - - -## Compatibility Test -* **Fixed:** Fixed the links to the Getting Started Guide. - - ----- - -# Changelog: 1.0.1 "Aeris" - - -Launched Tuesday, October 12, 2010 - - -## New Features & Highlights (Summary) -* Improved support for running XPath queries against the service response bodies. -* Added support for request retries and exponential backoff. -* Added support for HTTP request/response header logging. -* Bug fixes and enhancements: - * [Bug in Samples](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52748) - * [Can't set ACL on object using the SDK](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52305) - * [Range requests for S3 - status codes 200, 206](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52738) - * [S3 change_storage_redundancy() function clears public-read ACL](http://developer.amazonwebservices.com/connect/thread.jspa?threadID=52652) - - -## Base/Runtime class -* **New:** Added support for request retries and exponential backoff for all `500` and `503` HTTP status codes. -* **New:** Added the `enable_debug_mode()` method to enable HTTP request/response header logging to `STDERR`. - - -## Service Classes -### AmazonS3 -* **Fixed:** Lots of tweaks to the documentation. -* **Fixed:** The `change_content_type()`, `change_storage_redundancy()`, `set_object_acl()`, and `update_object()` methods now respect the existing content-type, storage redundancy, and ACL settings when updating. -* **New:** Added the `get_object_metadata()` method has been added as a singular interface for obtaining all available metadata for an object. - - -## Utility Classes -### CFArray -* **New:** Added the `each()` method which accepts a callback function to execute for each entry in the array. Works similarly to [jQuery's each()](http://api.jquery.com/each). -* **New:** Added the `map()` method which accepts a callback function to execute for each entry in the array. Works similarly to [jQuery's map()](http://api.jquery.com/map). -* **New:** Added the `reduce()` method which accepts a callback function to execute for each entry in the array. Works similarly to [DomCrawler reduce()](http://github.com/symfony/symfony/blob/master/src/Symfony/Component/DomCrawler/Crawler.php) from the [Symfony 2](http://symfony-reloaded.org) Preview Release. -* **New:** Added the `first()` and `last()` methods to return the first and last nodes in the array, respectively. - -### CFInfo -* **New:** Retrieves information about the current installation of the AWS SDK for PHP. - -### CFSimpleXML -* **New:** Added the `query()` method, which allows for XPath queries while the results are wrapped in a `CFArray` response. -* **New:** Added the `parent()` method, which allows for traversing back up the document tree. -* **New:** Added the `stringify()` method, which typecasts the value as a string. -* **New:** Added the `is()` and `contains()` methods, which allow for testing whether the XML value is or contains a given value, respectively. -* **Changed:** Now extends the `SimpleXMLIterator` class, which in-turn extends the `SimpleXMLElement` class. This adds new iterator methods to the `CFSimpleXML` class. - - -## Third-party Libraries -### CacheCore -* **New:** Upgraded to version 1.2. -* **New:** Added a static `init` method that allows for chainable cache initialization (5.3+). - -### RequestCore -* **New:** Added `206` as a successful status code (i.e., Range GET). - - -## Compatibility Test -* **Fixed:** Some of the links in the compatibility test were missing. These have been fixed. - - ----- - -# Changelog: AWS SDK for PHP 1.0 - -Launched Tuesday, September 28, 2010 - -This is a complete list of changes since we forked from the CloudFusion 2.5.x trunk build. - - -## New Features & Highlights (Summary) -* The new file to include is `sdk.class.php` rather than `cloudfusion.class.php`. -* Because of the increased reliance on [JSON](http://json.org) across AWS services, the minimum supported version is now PHP 5.2 ([Released in November 2006](http://www.php.net/ChangeLog-5.php#5.2.0); Justified by these [WordPress usage statistics](http://wpdevel.wordpress.com/2010/07/09/suggest-topics-for-the-july-15-2010-dev/comment-page-1/#comment-8542) and the fact that [PHP 5.2 has been end-of-life'd](http://www.php.net/archive/2010.php#id2010-07-22-1) in favor of 5.3). -* Up-to-date service support for [EC2](http://aws.amazon.com/ec2), [S3](http://aws.amazon.com/s3), [SQS](http://aws.amazon.com/sqs), [SimpleDB](http://aws.amazon.com/simpledb), [CloudWatch](http://aws.amazon.com/cloudwatch), and [CloudFront](http://aws.amazon.com/cloudfront). -* Added service support for [SNS](http://aws.amazon.com/sns). -* Limited testing for third-party API-compatible services such as [Eucalyptus](http://open.eucalyptus.com), [Walrus](http://open.eucalyptus.com) and [Google Storage](http://sandbox.google.com/storage). -* Improved the consistency of setting complex data types across services. (Required some backwards-incompatible changes.) -* Added new APIs and syntactic sugar for SimpleXML responses, batch requests and response caching. -* Moved away from _global_ constants in favor of _class_ constants. -* Minor, but notable improvements to the monkey patching support. -* Added a complete list of bug fix and patch contributors. Give credit where credit is due. ;) - -**Note: ALL backwards-incompatible changes are noted below. Please review the changes if you are upgrading.** We're making a small number of backwards-incompatible changes in order to improve the consistency across services. We're making these changes _now_ so that we can ensure that future versions will always be backwards-compatible with the next major version change. - - -## File structure -The package file structure has been refined in a few ways: - -* All service-specific classes are inside the `/services/` directory. -* All utility-specific classes are inside the `/utilities/` directory. -* All third-party classes are inside the `/lib/` directory. - - -## Base/Runtime class -* **Fixed:** Resolved issues: [#206](http://code.google.com/p/tarzan-aws/issues/detail?id=206). -* **New:** The following global constants have been added: `CFRUNTIME_NAME`, `CFRUNTIME_VERSION`, `CFRUNTIME_BUILD`, `CFRUNTIME_URL`, and `CFRUNTIME_USERAGENT` -* **New:** Now supports camelCase versions of the snake_case method names. (e.g. `getObjectList()` will get translated to `get_object_list()` behind the scenes.) -* **New:** Added `set_resource_prefix()` and `allow_hostname_override()` (in addition to `set_hostname()`) to support third-party, API-compatible services. -* **New:** Added new caching APIs: `cache()` and `delete_cache()`, which work differently from the methods they replace. See docs for more information. -* **New:** Added new batch request APIs, `batch()` and `CFBatchRequest` which are intended to replace the old `returnCurlHandle` optional parameter. -* **New:** Will look for the `config.inc.php` file first in the same directory (`./config.inc.php`), and then fallback to `~/.aws/sdk/config.inc.php`. -* **Changed:** Renamed the `CloudFusion` base class to `CFRuntime`. -* **Changed:** `CloudFusion_Exception` has been renamed as `CFRuntime_Exception`. -* **Changed:** Renamed the `CloudFusion::$enable_ssl` property to `CFRuntime::$use_ssl`. -* **Changed:** Renamed the `CloudFusion::$set_proxy` property to `CFRuntime::$proxy`. -* **Changed:** `CFRuntime::disable_ssl()` no longer takes any parameters. Once SSL is off, it is always off for that class instance. -* **Changed:** All date-related constants are now class constants of the `CFUtilities` class (e.g. `CFUtilities::DATE_FORMAT_ISO8601`). - * Use `CFUtilities::konst()` if you're extending classes and need to do something such as `$this->util::DATE_FORMAT_ISO8601` but keep getting the `T_PAAMAYIM_NEKUDOTAYIMM` error. -* **Changed:** All `x-cloudfusion-` and `x-tarzan-` HTTP headers are now `x-aws-`. -* **Changed:** `CloudFusion::autoloader()` is now in its own separate class: `CFLoader::autoloader()`. This prevents it from being incorrectly inherited by extending classes. -* **Changed:** `RequestCore`, `ResponseCore` and `SimpleXMLElement` are now extended by `CFRequest`, `CFResponse` and `CFSimpleXML`, respectively. These new classes are now used by default. -* **Changed:** Changes to monkey patching: - * You must now extend `CFRequest` instead of `RequestCore`, and then pass that class name to `set_request_class()`. - * You must now extend `CFResponse` instead of `ResponseCore`, and then pass that class name to `set_response_class()`. - * You can now monkey patch `CFSimpleXML` (extended from `SimpleXMLElement`) with `set_parser_class()`. - * You can now monkey patch `CFBatchRequest` with `set_batch_class()`. - * No changes for monkey patching `CFUtilities` with `set_utilities_class()`. -* **Removed:** Removed ALL existing _global_ constants and replaced them with _class_ constants. -* **Removed:** Removed `cache_response()` and `delete_cache_response()`. - - -## Service classes - -### AmazonCloudFront -* **Fixed:** Resolved issues: [#124](http://code.google.com/p/tarzan-aws/issues/detail?id=124), [#225](http://code.google.com/p/tarzan-aws/issues/detail?id=225), [#229](http://code.google.com/p/tarzan-aws/issues/detail?id=229), [#232](http://code.google.com/p/tarzan-aws/issues/detail?id=232), [#239](http://code.google.com/p/tarzan-aws/issues/detail?id=239). -* **Fixed:** Fixed an issue where `AmazonCloudFront` sent a `RequestCore` user agent in requests. -* **New:** Class is now up-to-date with the [2010-07-15](http://docs.amazonwebservices.com/AmazonCloudFront/2010-07-15/APIReference/) API release. -* **New:** Added _class_ constants for deployment states: `STATE_INPROGRESS` and `STATE_DEPLOYED`. -* **New:** Now supports streaming distributions. -* **New:** Now supports HTTPS (as well as HTTPS-only) access. -* **New:** Now supports Origin Access Identities. Added `create_oai()`, `list_oais()`, `get_oai()`, `delete_oai()`, `generate_oai_xml()` and `update_oai_xml()`. -* **New:** Now supports private (signed) URLs. Added `get_private_object_url()`. -* **New:** Now supports default root objects. -* **New:** Now supports invalidation. -* **New:** Added `get_distribution_list()`, `get_streaming_distribution_list()` and `get_oai_list()` which return simplified arrays of identifiers. -* **Changed:** Replaced all of the remaining `CDN_*` constants with _class_ constants. - -### AmazonCloudWatch -* **New:** Added new _class_ constants: `DEFAULT_URL`, `REGION_US_E1`, `REGION_US_W1`, `REGION_EU_W1`, and `REGION_APAC_SE1`. -* **New:** Now supports the _Northern California_, _European_ and _Asia-Pacific_ regions. -* **New:** The _global_ `CW_DEFAULT_URL` constant has been replaced by `AmazonCloudFront::DEFAULT_URL`. - -### AmazonEC2 -* **Fixed:** Resolved issues: [#124](http://code.google.com/p/tarzan-aws/issues/detail?id=124), [#131](http://code.google.com/p/tarzan-aws/issues/detail?id=131), [#138](http://code.google.com/p/tarzan-aws/issues/detail?id=138), [#139](http://code.google.com/p/tarzan-aws/issues/detail?id=139), [#154](http://code.google.com/p/tarzan-aws/issues/detail?id=154), [#173](http://code.google.com/p/tarzan-aws/issues/detail?id=173), [#200](http://code.google.com/p/tarzan-aws/issues/detail?id=200), [#233](http://code.google.com/p/tarzan-aws/issues/detail?id=233). -* **New:** Class is now up-to-date with the [2010-06-15](http://docs.amazonwebservices.com/AWSEC2/2010-06-15/APIReference/) API release. -* **New:** Now supports [Paid AMIs](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=865&categoryID=87). -* **New:** Now supports [Multiple instance types](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=992&categoryID=87). -* **New:** Now supports [Elastic IPs](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1344&categoryID=87). -* **New:** Now supports [Availability Zones](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1344&categoryID=87). -* **New:** Now supports [Elastic Block Store](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1665&categoryID=87). -* **New:** Now supports [Windows instances](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1765&categoryID=87). -* **New:** Now supports the [European region](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1926&categoryID=87). -* **New:** Now supports the _Northern California_ and _Asia-Pacific_ regions. -* **New:** Now supports [Reserved instances](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2213&categoryID=87). -* **New:** Now supports [Shared snapshots](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2843&categoryID=87). -* **New:** Now supports [EBS AMIs](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3105&categoryID=87). -* **New:** Now supports [Spot instances](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3215&categoryID=87). -* **New:** Now supports [Cluster Compute Instances](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3965&categoryID=87). -* **New:** Now supports [Placement Groups](http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3965&categoryID=87). -* **New:** Added new _class_ constants for regions: `REGION_US_E1`, `REGION_US_W1`, `REGION_EU_W1`, `REGION_APAC_SE1`. -* **New:** Added new _class_ constants for run-state codes: `STATE_PENDING`, `STATE_RUNNING`, `STATE_SHUTTING_DOWN`, `STATE_TERMINATED`, `STATE_STOPPING`, `STATE_STOPPED`. -* **New:** Added support for decrypting the Administrator password for Microsoft Windows instances. -* **New:** Instead of needing to pass `Parameter.0`, `Parameter.1`, ...`Parameter.n` individually to certain methods, you can now reliably pass a string for a single value or an indexed array for a list of values. -* **New:** Limited tested has been done with the Eucalyptus EC2-clone. -* **Changed:** The `$account_id` parameter has been removed from the constructor. -* **Changed:** The _global_ `EC2_LOCATION_US` and `EC2_LOCATION_EU` constants have been replaced. -* **Changed:** The `set_locale()` method has been renamed to `set_region()`. It accepts any of the region constants. - -### AmazonIAM -* **New:** Up-to-date with the [2010-03-31](http://docs.amazonwebservices.com/sns/2010-03-31/api/) API release. - -### AmazonS3 -* **Fixed:** Resolved issues: [#31](http://code.google.com/p/tarzan-aws/issues/detail?id=31), [#72](http://code.google.com/p/tarzan-aws/issues/detail?id=72), [#123](http://code.google.com/p/tarzan-aws/issues/detail?id=123), [#156](http://code.google.com/p/tarzan-aws/issues/detail?id=156), [#199](http://code.google.com/p/tarzan-aws/issues/detail?id=199), [#201](http://code.google.com/p/tarzan-aws/issues/detail?id=201), [#203](http://code.google.com/p/tarzan-aws/issues/detail?id=203), [#207](http://code.google.com/p/tarzan-aws/issues/detail?id=207), [#208](http://code.google.com/p/tarzan-aws/issues/detail?id=208), [#209](http://code.google.com/p/tarzan-aws/issues/detail?id=209), [#210](http://code.google.com/p/tarzan-aws/issues/detail?id=210), [#212](http://code.google.com/p/tarzan-aws/issues/detail?id=212), [#216](http://code.google.com/p/tarzan-aws/issues/detail?id=216), [#217](http://code.google.com/p/tarzan-aws/issues/detail?id=217), [#226](http://code.google.com/p/tarzan-aws/issues/detail?id=226), [#228](http://code.google.com/p/tarzan-aws/issues/detail?id=228), [#234](http://code.google.com/p/tarzan-aws/issues/detail?id=234), [#235](http://code.google.com/p/tarzan-aws/issues/detail?id=235). -* **Fixed:** Fixed an issue where `AmazonS3` sent a `RequestCore` user agent in requests. -* **New:** Now supports the _Northern California_ and _Asia-Pacific_ regions. -* **New:** Now supports the new _EU (Ireland)_ REST endpoint. -* **New:** Now supports MFA Delete. -* **New:** Now supports Conditional Copy. -* **New:** Now supports Reduced Redundancy Storage (RRS). Added `change_storage_redundancy()`. -* **New:** Now supports Object Versioning. Added `enable_versioning()`, `disable_versioning`, `get_versioning_status()`, and `list_bucket_object_versions()`. -* **New:** Now supports Bucket Policies. Added `set_bucket_policy()`, `get_bucket_policy()`, and `delete_bucket_policy()`. -* **New:** Now supports Bucket Notifications. Added `create_bucket_notification()`, `get_bucket_notifications()`, and `delete_bucket_notification()`. -* **New:** Added _class_ constants for regions: `REGION_US_E1`, `REGION_US_W1`, `REGION_EU_W1`, `REGION_APAC_SE1`. -* **New:** Added _class_ constants for storage types: `STORAGE_STANDARD` and `STORAGE_REDUCED`. -* **New:** Enhanced `create_object()` with the ability to upload a file from the file system. -* **New:** Enhanced `get_object()` with the ability to download a file to the file system. -* **New:** Enhanced `get_bucket_list()` and `get_object_list()` with performance improvements. -* **New:** Enhanced all GET operations with the ability to generate pre-authenticated URLs. This is the same feature as `get_object_url()` has had, applied to all GET operations. -* **New:** Limited testing with Walrus, the Eucalyptus S3-clone. -* **New:** Limited testing with Google Storage. -* **Changed:** Replaced all of the remaining `S3_*` constants with _class_ constants: `self::ACL_*`, `self::GRANT_*`, `self::USERS_*`, and `self::PCRE_ALL`. -* **Changed:** Changed the function signature for `create_object()`. The filename is now passed as the second parameter, while the remaining options are now passed as the third parameter. This behavior now matches all of the other object-related methods. -* **Changed:** Changed the function signature for `head_object()`, `delete_object()`, and `get_object_acl()`. The methods now accept optional parameters as the third parameter instead of simply `returnCurlHandle`. -* **Changed:** Changed the function signature for `get_object_url()` and `get_torrent_url()`. Instead of passing a number of seconds until the URL expires, you now pass a string that `strtotime()` understands (including `60 seconds`). -* **Changed:** Changed the function signature for `get_object_url()`. Instead of passing a boolean value for `$torrent`, the last parameter is now an `$opt` variable which allows you to set `torrent` and `method` parameters. -* **Changed:** Changed how `returnCurlHandle` is used. Instead of passing `true` as the last parameter to most methods, you now need to explicitly set `array('returnCurlHandle' => true)`. This behavior is consistent with the implementation in other classes. -* **Changed:** Optional parameter names changed in `list_objects()`: `maxKeys` is now `max-keys`. -* **Changed:** `get_bucket_locale()` is now called `get_bucket_region()`, and returns the response body as a _string_ for easier comparison with class constants. -* **Changed:** `get_bucket_size()` is now called `get_bucket_object_count()`. Everything else about it is identical. -* **Changed:** `head_bucket()` is now called `get_bucket_headers()`. Everything else about it is identical. -* **Changed:** `head_object()` is now called `get_object_headers()`. Everything else about it is identical. -* **Changed:** `create_bucket()` has two backward-incompatible changes: - * Method now **requires** the region (formerly _locale_) to be set. - * Method takes an `$acl` parameter so that the ACL can be set directly when creating a new bucket. -* **Changed:** Bucket names are now validated. Creating a new bucket now requires the more stringent DNS-valid guidelines, while the process of reading existing buckets follows the looser path-style guidelines. This change also means that the reading of path-style bucket names is now supported, when previously they weren’t. -* **Removed:** Removed `store_remote_file()` because its intended usage repeatedly confused users, and had potential for misuse. If you were using it to upload from the local file system, you should be using `create_object` instead. -* **Removed:** Removed `copy_bucket()`, `replace_bucket()`, `duplicate_object()`, `move_object()`, and `rename_object()` because only a small number of users used them, and they weren't very robust anyway. -* **Removed:** Removed `get_bucket()` because it was just an alias for `list_objects()` anyway. Use the latter from now on -- it's identical. - -### AmazonSDB -* **Fixed:** Resolved issues: [#205](http://code.google.com/p/tarzan-aws/issues/detail?id=205). -* **New:** Class is now up-to-date with the [2009-04-15](http://docs.amazonwebservices.com/AmazonSimpleDB/2009-04-15/DeveloperGuide/) API release. -* **Changed:** Changed the function signatures for `get_attributes()` and `delete_attributes()` to improve consistency. - -### AmazonSNS -* **New:** Up-to-date with the [2010-03-31](http://docs.amazonwebservices.com/sns/2010-03-31/api/) API release. - -### AmazonSQS -* **Fixed:** Resolved issues: [#137](http://code.google.com/p/tarzan-aws/issues/detail?id=137), [#213](http://code.google.com/p/tarzan-aws/issues/detail?id=213), [#219](http://code.google.com/p/tarzan-aws/issues/detail?id=219), [#220](http://code.google.com/p/tarzan-aws/issues/detail?id=220), [#221](http://code.google.com/p/tarzan-aws/issues/detail?id=221), [#222](http://code.google.com/p/tarzan-aws/issues/detail?id=222). -* **Fixed:** In CloudFusion 2.5, neither `add_permission()` nor `remove_permission()` were functional. They are now working. -* **New:** Now supports the _Northern California_ and _Asia-Pacific_ regions. -* **New:** Now supports the new _US-East (N. Virginia)_ endpoint. -* **New:** Now supports the new _EU (Ireland)_ endpoint. -* **New:** Added new _class_ constants for regions: `REGION_US_E1`, `REGION_US_W1`, `REGION_EU_W1`, and `REGION_APAC_SE1`. -* **Changed:** Because we now support multiple region endpoints, queue names alone are no longer sufficient for referencing your queues. As such, you must now use a full-queue URL instead of just the queue name. -* **Changed:** The _global_ `SQS_LOCATION_US` and `SQS_LOCATION_EU` constants have been replaced. -* **Changed:** Renamed `set_locale()` as `set_region()`. It accepts any of the region constants. -* **Changed:** Changed the function signature for `list_queues()`. See the updated API reference. -* **Changed:** Changed the function signature for `set_queue_attributes()`. See the updated API reference. -* **Changed:** Changed how `returnCurlHandle` is used. Instead of passing `true` as the last parameter to most methods, you now need to explicitly set `array('returnCurlHandle' => true)`. This behavior is consistent with the implementation in other classes. -* **Changed:** Function signature changed in `get_queue_attributes()`. The `$attribute_name` parameter is now passed as a value in the `$opt` parameter. - -### AmazonSQSQueue -* **Removed:** `AmazonSQSQueue` was a simple wrapper around the AmazonSDB class. It generally failed as an object-centric approach to working with SQS, and as such, has been eliminated. Use the `AmazonSQS` class instead. - - -## Utility Classes -### CFArray -* **New:** Extends `ArrayObject`. -* **New:** Simplified typecasting of SimpleXML nodes to native types (e.g. integers, strings). - -### CFBatchRequest -* **New:** Provides a higher-level API for executing batch requests. - -### CFComplexType -* **New:** Used internally by several classes to handle various complex data-types (e.g. single or multiple values, `Key.x.Subkey.y.Value` combinations). -* **New:** Introduces a way to convert between JSON, YAML, and the PHP equivalent of Lists and Maps (nested associative arrays). - -### CFRequest -* **New:** Sets some project-specific settings and passes them to the lower-level RequestCore. - -### CFResponse -* **New:** No additional changes from the base `ResponseCore` class. - -### CFPolicy -* **New:** Used for constructing Base64-encoded, JSON policy documents to be passed around to other methods. - -### CFSimpleXML -* **New:** Extends `SimpleXMLElement`. -* **New:** Simplified node retrieval. All SimpleXML-based objects (e.g. `$response->body`) now have magic methods that allow you to quickly retrieve nodes with the same name - * e.g. `$response->body->Name()` will return an array of all SimpleXML nodes that match the `//Name` XPath expression. - -### CFUtilities -* **Fixed:** `to_query_string()` now explicitly passes a `&` character to `http_build_query()` to avoid configuration issues with MAMP/WAMP/XAMP installations. -* **Fixed:** `convert_response_to_array()` has been fixed to correctly return an all-array response under both PHP 5.2 and 5.3. Previously, PHP 5.3 returned a mix of `array`s and `stdClass` objects. -* **New:** Added `konst()` to retrieve the value of a class constant, while avoiding the `T_PAAMAYIM_NEKUDOTAYIM` error. Misspelled because `const` is a reserved word. -* **New:** Added `is_base64()` to determine whether or not a string is Base64-encoded data. -* **New:** Added `decode_uhex()` to decode `\uXXXX` entities back into their unicode equivalents. -* **Changed:** Changed `size_readable()`. Now supports units up to exabytes. -* **Changed:** Moved the `DATE_FORMAT_*` _global_ constants into this class as _class_ constants. -* **Removed:** Removed `json_encode_php51()` now that the minimum required version is PHP 5.2 (which includes the JSON extension by default). -* **Removed:** Removed `hex_to_base64()`. - - -## Third-party Libraries -### CacheCore -* **New:** Upgraded to version 1.1.1. -* **New:** Now supports both the [memcache](http://php.net/memcache) extension, but also the newer, faster [memcached](http://php.net/memcached) extension. Prefers `memcached` if both are installed. -* **Deprecated:** Support for MySQL and PostgreSQL as storage mechanisms has been **deprecated**. Since they're using PDO, they'll continue to function (as we're maintaining SQLite support via PDO), but we recommend migrating to using APC, XCache, Memcache or SQLite if you'd like to continue using response caching. -* New BSD licensed -* - -### RequestCore -* **New:** Upgraded to version 1.2. -* **New:** Now supports streaming up and down. -* **New:** Now supports "rolling" requests for better scalability. -* New BSD licensed -* diff --git a/3rdparty/aws-sdk/_docs/CONTRIBUTORS.md b/3rdparty/aws-sdk/_docs/CONTRIBUTORS.md deleted file mode 100644 index 3523bf6723..0000000000 --- a/3rdparty/aws-sdk/_docs/CONTRIBUTORS.md +++ /dev/null @@ -1,64 +0,0 @@ -# Contributors - -## AWS SDK for PHP Contributors - -Contributions were provided under the Apache 2.0 License, as appropriate. - -The following people have provided ideas, support and bug fixes: - -* [arech8](http://developer.amazonwebservices.com/connect/profile.jspa?userID=154435) (bug fixes) -* [Aizat Faiz](http://aizatto.com) (bug fixes) -* [Ben Lumley](http://github.com/benlumley) (bug fixes) -* [David Chan](http://www.chandeeland.org) (bug fixes) -* [Eric Caron](http://www.ericcaron.com) (bug fixes) -* [Jason Ardell](http://ardell.posterous.com/) (bug fixes) -* [Jeremy Archuleta](http://code.google.com/u/jeremy.archuleta/) (bug fixes) -* [Jimmy Berry](http://blog.boombatower.com/) (bug fixes, patches) -* [Paul Voegler](mailto:voegler@gmx.de) (bug fixes, bug reports, patches) -* [Peter Bowen](http://github.com/pzb) (feedback, bug reports) -* [zoxa](https://github.com/zoxa) (bug fixes) - - -## CloudFusion/CacheCore/RequestCore Contributors - -Contributions were provided under the New BSD License, as appropriate. - -The following people have provided ideas, support and bug fixes: - -* [Aaron Collegeman](http://blog.aaroncollegeman.com) (bug fixes) -* [Alex Schenkel](http://code.google.com/u/alex.schenkel/) (bug fixes) -* [Andrzej Bednarczyk](http://kreo-consulting.com) (bug fixes) -* [bprater](http://code.google.com/u/bprater/) (bug fixes) -* [castoware](http://code.google.com/u/castoware/) (bug fixes) -* [Chris Chen](http://github.com/chrischen) (bug fixes, patches, support) -* [Chris Mytton](http://hecticjeff.net) (bug fixes) -* [evgen.dm](http://code.google.com/u/evgen.dm/) (bug fixes) -* [gafitescu](http://code.google.com/u/gafitescu/) (bug fixes) -* [Gary Richardson](http://code.google.com/u/gary.richardson/) (bug fixes) -* [Gil Hildebrand](http://squidoo.com) (bug fixes) -* [Guilherme Blanco](http://blog.bisna.com) (bug fixes) -* [hammjazz](http://code.google.com/u/hammjazz/) (bug fixes) -* [HelloBunty](http://code.google.com/u/HelloBunty/) (bug fixes) -* [inputrequired](http://code.google.com/u/inputrequired/) (bug fixes) -* [Ivo Beckers](http://infopractica.nl) (bug fixes) -* [Jason Litka](http://jasonlitka.com) (bug fixes, patches) -* [Jeremy Archuleta](http://code.google.com/u/jeremy.archuleta/) (bug fixes) -* [John Beales](http://johnbeales.com) (bug fixes) -* [John Parker](http://code.google.com/u/john3parker/) (bug fixes) -* [Jon Cianciullo](http://code.google.com/u/jon.cianciullo/) (bug fixes) -* [kris0476](http://code.google.com/u/kris0476/) (bug fixes) -* [Matt Terenzio](http://jour.nali.st/blog) (bug fixes, patches) -* [Mike Jetter](http://mbjetter.com) (bug fixes) -* [Morten Blinksbjerg Nielsen](http://mbn.dk) (bug fixes) -* [nathell](http://code.google.com/u/nathell/) (bug fixes) -* [nickgsuperstar](http://code.google.com/u/nickgsuperstar/) (bug fixes) -* [ofpichon](http://code.google.com/u/ofpichon/) (bug fixes) -* [Otavio Ferreira](http://otaviofff.me) (bug fixes) -* [Paul Voegler](mailto:voegler@gmx.de) (bug fixes, bug reports, patches) -* [Steve Brozosky](http://code.google.com/u/@UBZWSlJVBxhHXAN1/) (bug fixes) -* [Steve Chu](http://stevechu.org) (bug fixes) -* [tommusic](http://code.google.com/u/tommusic/) (bug fixes) -* [Tyler Hall](http://clickontyler.com) (bug fixes) -* [webcentrica.co.uk](http://code.google.com/u/@VhBQQldUBBBEXAF1/) (bug fixes) -* [worden341](http://github.com/worden341) (bug fixes) -* [yakkyjunk](http://code.google.com/u/yakkyjunk/) (bug fixes) diff --git a/3rdparty/aws-sdk/_docs/DYNAMODBSESSIONHANDLER.html b/3rdparty/aws-sdk/_docs/DYNAMODBSESSIONHANDLER.html deleted file mode 100644 index 8b1545db50..0000000000 --- a/3rdparty/aws-sdk/_docs/DYNAMODBSESSIONHANDLER.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - README - - - -

    DynamoDB Session Handler

    -

    The DynamoDB Session Handler is a custom session handler for PHP that allows Amazon DynamoDB to be used as a session store while still using PHP’s native session functions.

    - -

    What issues does this address?

    -

    The native PHP session handler stores sessions on the local file system. This is unreliable in distributed web applications, because the user may be routed to servers that do not contain the session data. To solve this problem, PHP developers have implemented custom solutions for storing user session data using databases, shared file systems, Memcache servers, tamper-proof cookies, etc., by taking advantage of the interface provided by PHP via the session_set_save_handler() function. Unfortunately, most of these solutions require a lot of configuration or prior knowledge about the storage mechanism in order to setup. Some of them also require the provisioning or management of additional servers.

    - -

    Proposed solution

    -

    The DynamoDB Session Handler uses Amazon DynamoDB as a session store, which alleviates many of the problems with existing solutions. There are no additional servers to manage, and there is very little configuration required. The Amazon DynamoDB is also fundamentally designed for low latency (the data is even stored on SSDs), so the performance impact is much smaller when compared to other databases. Since the Session Handler is designed to be a drop in replacement for the default PHP session handler, it also implements session locking in a familiar way.

    - -

    How do I use it?

    -

    The first step is to instantiate the Amazon DynamoDB client and register the session handler.

    -
    require_once 'AWSSDKforPHP/sdk.class.php';
    -
    -// Instantiate the Amazon DynamoDB client.
    -// REMEMBER: You need to set 'default_cache_config' in your config.inc.php.
    -$dynamodb = new AmazonDynamoDB();
    -
    -// Register the DynamoDB Session Handler.
    -$handler = $dynamodb->register_session_handler(array(
    -    'table_name' => 'my-sessions-table'
    -));
    -

    Before you can use the session handler, you need to create a table to store the sessions in. This can be done through the AWS Console for Amazon DynamoDB, or using the session handler class (which you must configure with the table name like in the example above).

    -
    // Create a table for session storage with default settings.
    -$handler->create_sessions_table();
    -

    If you create the table via the AWS Console, you need to make sure the primary key is a string. By default the DynamoDB Session Handler looks for a key named "id", so if you name the key something else, you will need to specify that when you configure the session handler (see the Configuration section below).

    -

    Once the session handler is registered with a valid table, you can write to (and read from) the session using the standard $_SESSION superglobal.

    -
    // Start the session. This will acquire a lock if session locking is enabled.
    -session_start();
    -
    -// Alter the session data.
    -$_SESSION['username'] = 'jeremy';
    -$_SESSION['role'] = 'admin';
    -
    -// Close and write to the session.
    -// REMEMBER: You should close the session ASAP to release the session lock.
    -session_write_close();
    - -

    Removing expired sessions

    -

    The session handler ties into PHP's native session garbage collection functionality, so expired sessions will be deleted periodically and automatically based on how you configure PHP to do the garbage collection. See the PHP manual for the following PHP INI settings: session.gc_probability, session.gc_divisor, and session.gc_maxlifetime. You may also manually call the DynamoDBSessionHandler::garbage_collect() to clean up the expired sessions.

    - -

    Configuring the DynamoDB Session Handler

    -

    You may configure the behavior of the session handler using a the following settings:

    -
    -
    table_name
    -
    The name of the DynamoDB table in which to store sessions.
    - -
    hash_key
    -
    The name of the primary hash key in the DynamoDB sessions table.
    - -
    session_lifetime
    -
    The lifetime of an inactive session before it should be garbage collected. If 0 is used, then the actual lifetime value that will be used is ini_get('session.gc_maxlifetime').
    - -
    consistent_reads
    -
    Whether or not the session handler should do consistent reads from DynamoDB.
    - -
    session_locking
    -
    Whether or not the session handler should do session locking (see the Session locking section for more information).
    - -
    max_lock_wait_time
    -
    Maximum time, in seconds, that the session handler should take to acquire a lock before giving up. Only used if session_locking is true.
    - -
    min_lock_retry_utime
    -
    Minimum time, in microseconds, that the session handler should wait to retry acquiring a lock. Only used if session_locking is true.
    - -
    max_lock_retry_utime
    -
    Maximum time, in microseconds, that the session handler should wait to retry acquiring a lock. Only used if session_locking is true.
    -
    - -

    To configure the Session Handle, you must pass the configuration data into the constructor. (Note: The values used below are actually the default settings.)

    -
    $dynamodb = new AmazonDynamoDB();
    -$handler = $dynamodb->register_session_handler(array(
    -    'table_name'           => 'sessions',
    -    'hash_key'             => 'id',
    -    'session_lifetime'     => 0,
    -    'consistent_reads'     => true,
    -    'session_locking'      => true,
    -    'max_lock_wait_time'   => 15,
    -    'min_lock_retry_utime' => 5000,
    -    'max_lock_retry_utime' => 50000,
    -));
    - -

    Session locking

    -

    The default session handler for PHP locks sessions using a pessimistic locking algorithm. If a request (process) opens a session for reading using the session_start() function, it first acquires a lock. The lock is closed when that request writes back to the session, either when the request is complete, or via the session_write_close() function. Since the DynamoDB Session Handler is meant to be a drop in replacement for the default session handler, it also implements the same locking scheme. However, this can be slow, undesirable, and costly when multiple, simultaneous requests from the same user occur, particularly with ajax requests or HTML iframes. In some cases, you may not want or need the session to be locked. After evaluating whether or not your application actually requires session locking, you may turn off locking when you configure the session handler by setting session_locking to false.

    - -

    Pricing

    -

    Aside from nominal data storage and data transfer fees, the costs associated with using Amazon DynamoDB are calculated based on provisioned throughput capacity and item size (see the Amazon DynamoDB pricing details). Throughput is measured in units of Read Capacity and Write Capacity. Ultimately, the throughput and costs required for your sessions table is going to be based on your website traffic, but the following is a list of the capacity units required for each session-related operation:

    -
      -
    • Reading via session_start() -

      With locking enabled: 1 unit of Write Capacity + 1 unit of Write Capacity for each time it must retry acquiring the lock

      -

      With locking disabed: 1 unit of Read Capacity (or 0.5 units of Read Capacity if consistent reads are disabled)

      -
    • -
    • Writing via session_write_close() -

      1 unit of Write Capacity

      -
    • -
    • Deleting via session_destroy() -

      1 unit of Write Capacity

      -
    • -
    • Garbage Collecting via DyanamoDBSessionHandler::garbage_collect() -

      0.5 units of Read Capacity per KB of data in the sessions table + 1 unit of Write Capacity per expired item

      -
    • -
    - -

    More information

    -

    For more information on the Amazon DynamoDB service please visit the Amazon DynamoDB homepage.

    - - - diff --git a/3rdparty/aws-sdk/_docs/KNOWNISSUES.md b/3rdparty/aws-sdk/_docs/KNOWNISSUES.md deleted file mode 100644 index 9773c3932b..0000000000 --- a/3rdparty/aws-sdk/_docs/KNOWNISSUES.md +++ /dev/null @@ -1,65 +0,0 @@ -# Known Issues - -## 2GB limit for 32-bit stacks; all Windows stacks. - -Because PHP's integer type is signed and many platforms use 32-bit integers, the AWS SDK for PHP does not correctly -handle files larger than 2GB on a 32-bit stack (where "stack" includes CPU, OS, web server, and PHP binary). This is a -[well-known PHP issue]. In the case of Microsoft® Windows®, there are no official builds of PHP that support 64-bit -integers. - -The recommended solution is to use a 64-bit Linux stack, such as the [64-bit Amazon Linux AMI] with the latest version of -PHP installed. - -For more information, please see: [PHP filesize: Return values]. A workaround is suggested in -`AmazonS3::create_mpu_object()` [with files bigger than 2GB]. - - [well-known PHP issue]: http://www.google.com/search?q=php+2gb+32-bit - [64-bit Amazon Linux AMI]: http://aws.amazon.com/amazon-linux-ami/ - [PHP filesize: Return values]: http://docs.php.net/manual/en/function.filesize.php#refsect1-function.filesize-returnvalues - [with files bigger than 2GB]: https://forums.aws.amazon.com/thread.jspa?messageID=215487#215487 - - -## Amazon S3 Buckets containing periods - -Amazon S3's SSL certificate covers domains that match `*.s3.amazonaws.com`. When buckets (e.g., `my-bucket`) are accessed -using DNS-style addressing (e.g., `my-bucket.s3.amazonaws.com`), those SSL/HTTPS connections are covered by the certificate. - -However, when a bucket name contains one or more periods (e.g., `s3.my-domain.com`) and is accessed using DNS-style -addressing (e.g., `s3.my-domain.com.s3.amazonaws.com`), that SSL/HTTPS connection will fail because the certificate -doesn't match. - -The most secure workaround is to change the bucket name to one that does not contain periods. Less secure workarounds -are to use `disable_ssl()` or `disable_ssl_verification()`. Because of the security implications, calling either of -these methods will throw a warning. You can avoid the warning by adjusting your `error_reporting()` settings. - - -## Expiring request signatures - -When leveraging `AmazonS3::create_mpu_object()`, it's possible that later parts of the multipart upload will fail if -the upload takes more than 15 minutes. - - -## Too many open file connections - -When leveraging `AmazonS3::create_mpu_object()`, it's possible that the SDK will attempt to open too many file resources -at once. Because the file connection limit is not available to the PHP environment, the SDK is unable to automatically -adjust the number of connections it attempts to open. - -A workaround is to increase the part size so that fewer file connections are opened. - - -## Exceptionally large batch requests - -When leveraging the batch request feature to execute multiple requests in parallel, it's possible that the SDK will -throw a fatal exception if a particular batch pool is exceptionally large and a service gets overloaded with requests. - -This seems to be most common when attempting to send a large number of emails with the SES service. - - -## Long-running processes using SSL leak memory - -When making requests with the SDK over SSL during long-running processes, there will be a gradual memory leak that can -eventually cause a crash. The leak occurs within the PHP bindings for cURL when attempting to verify the peer during an -SSL handshake. See for details about the bug. - -A workaround is to disable SSL for requests executed in long-running processes. diff --git a/3rdparty/aws-sdk/_docs/LICENSE.md b/3rdparty/aws-sdk/_docs/LICENSE.md deleted file mode 100644 index 853ab3bae8..0000000000 --- a/3rdparty/aws-sdk/_docs/LICENSE.md +++ /dev/null @@ -1,151 +0,0 @@ -# Apache License -Version 2.0, January 2004 - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - -## 1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 -through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the -License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled -by, or are under common control with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract -or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial -ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software -source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, -including but not limited to compiled object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, -as indicated by a copyright notice that is included in or attached to the work (an example is provided in the -Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) -the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not -include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any -modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to -Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to -submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its representatives, including but not -limited to communication on electronic mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but -excluding communication that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been -received by Licensor and subsequently incorporated within the Work. - - -## 2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - - -## 3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such -license applies only to those patent claims licensable by such Contributor that are necessarily infringed by -their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such -Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim -or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work -constitutes direct or contributory patent infringement, then any patent licenses granted to You under this -License for that Work shall terminate as of the date such litigation is filed. - - -## 4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You meet the following conditions: - - 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and - - 2. You must cause any modified files to carry prominent notices stating that You changed the files; and - - 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, - trademark, and attribution notices from the Source form of the Work, excluding those notices that do - not pertain to any part of the Derivative Works; and - - 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that - You distribute must include a readable copy of the attribution notices contained within such NOTICE - file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed as part of the Derivative Works; within - the Source form or documentation, if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party notices normally appear. The - contents of the NOTICE file are for informational purposes only and do not modify the License. You may - add Your own attribution notices within Derivative Works that You distribute, alongside or as an - addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be - construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license -terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative -Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the -conditions stated in this License. - - -## 5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by -You to the Licensor shall be under the terms and conditions of this License, without any additional terms or -conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate -license agreement you may have executed with Licensor regarding such Contributions. - - -## 6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, service marks, or product names of -the Licensor, except as required for reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - - -## 7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor -provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express -or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, -MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - - -## 8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless -required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any -Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential -damages of any character arising as a result of this License or out of the use or inability to use the Work -(including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has been advised of the possibility -of such damages. - - -## 9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, -acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole -responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold -each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability. - - -END OF TERMS AND CONDITIONS diff --git a/3rdparty/aws-sdk/_docs/NOTICE.md b/3rdparty/aws-sdk/_docs/NOTICE.md deleted file mode 100644 index 780c2e4c9d..0000000000 --- a/3rdparty/aws-sdk/_docs/NOTICE.md +++ /dev/null @@ -1,444 +0,0 @@ -# AWS SDK for PHP - -Based on [CloudFusion](http://getcloudfusion.com). Includes other third-party software. - -See below for complete copyright and licensing notices. - - -## AWS SDK for PHP - - - -Copyright 2010-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"). -You may not use this file except in compliance with the License. -A copy of the License is located at - - - -or in the "license" file accompanying this file. This file is distributed -on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied. See the License for the specific language governing -permissions and limitations under the License. - - -## CloudFusion - - - -* Copyright 2005-2010 [Ryan Parman](http://ryanparman.com) -* Copyright 2007-2010 [Foleeo Inc.](http://warpshare.com) -* Copyright 2007-2010 "CONTRIBUTORS" (see [CONTRIBUTORS.md](CONTRIBUTORS.md) for a list) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the organization nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - - - -## CacheCore - - - -* Copyright 2007-2010 [Ryan Parman](http://ryanparman.com) -* Copyright 2007-2010 [Foleeo Inc.](http://warpshare.com) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the organization nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - - - -## RequestCore - - - -* Copyright 2007-2010 [Ryan Parman](http://ryanparman.com) -* Copyright 2007-2010 [Foleeo Inc.](http://warpshare.com) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the organization nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - - - -## SimplePie - - - -* Copyright 2004-2010 [Ryan Parman](http://ryanparman.com) -* Copyright 2005-2010 [Geoffrey Sneddon](http://gsnedders.com) -* Copyright 2008-2011 [Ryan McCue](http://ryanmccue.info) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the organization nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - - - -## Reqwest - - - -* Copyright 2011 [Dustin Diaz](http://dustindiaz.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - - -## Human readable file sizes - - - -* Copyright 2004-2010 [Aidan Lister](http://aidanlister.com) -* Copyright 2007-2010 [Ryan Parman](http://ryanparman.com) - -Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. The name "PHP" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact group@php.net. - - 4. Products derived from this software may not be called "PHP", nor - may "PHP" appear in their name, without prior written permission - from group@php.net. You may indicate that your software works in - conjunction with PHP by saying "Foo for PHP" instead of calling - it "PHP Foo" or "phpfoo" - - 5. The PHP Group may publish revised and/or new versions of the - license from time to time. Each version will be given a - distinguishing version number. - Once covered code has been published under a particular version - of the license, you may always continue to use it under the terms - of that version. You may also choose to use such covered code - under the terms of any subsequent version of the license - published by the PHP Group. No one other than the PHP Group has - the right to modify the terms applicable to covered code created - under this License. - - 6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes PHP software, freely available from - ". - -THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND -ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP -DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - - - - -## Snippets from PHP.net documentation - -* `CFUtilities::is_base64()` - Copyright 2008 "debug" - -Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. The name "PHP" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact group@php.net. - - 4. Products derived from this software may not be called "PHP", nor - may "PHP" appear in their name, without prior written permission - from group@php.net. You may indicate that your software works in - conjunction with PHP by saying "Foo for PHP" instead of calling - it "PHP Foo" or "phpfoo" - - 5. The PHP Group may publish revised and/or new versions of the - license from time to time. Each version will be given a - distinguishing version number. - Once covered code has been published under a particular version - of the license, you may always continue to use it under the terms - of that version. You may also choose to use such covered code - under the terms of any subsequent version of the license - published by the PHP Group. No one other than the PHP Group has - the right to modify the terms applicable to covered code created - under this License. - - 6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes PHP software, freely available from - ". - -THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND -ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP -DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - - - - -## phunction PHP framework - - - -* Copyright 2010 [Alix Axel](mailto:alix-axel@users.sf.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - - -## Symfony YAML Component - - - -Copyright 2008-2009 [Fabien Potencier](http://fabien.potencier.org) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - - -## PEAR Console_ProgressBar - - - -Copyright 2003-2007 [Stefan Walk](http://pear.php.net/user/et) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - - -## Mozilla Certificate Authority - -* -* - -The contents of this file are subject to the Mozilla Public License Version -1.1 (the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at -http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the -License. - -The Original Code is the Netscape security libraries. - -The Initial Developer of the Original Code is Netscape Communications -Corporation. Portions created by the Initial Developer are Copyright -(C) 1994-2000 the Initial Developer. All Rights Reserved. - - - - -## array-to-domdocument - - - -* Copyright 2010-2011 [Omer Hassan](https://code.google.com/u/113495690012051782542/) -* Portions copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - diff --git a/3rdparty/aws-sdk/_docs/STREAMWRAPPER_README.html b/3rdparty/aws-sdk/_docs/STREAMWRAPPER_README.html deleted file mode 100644 index 5d91068aa2..0000000000 --- a/3rdparty/aws-sdk/_docs/STREAMWRAPPER_README.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - README - - - -

    S3 Stream Wrapper

    -

    The S3 Stream Wrapper is a stream wrapper interface for PHP that provides access to Amazon S3 using PHP’s standard File System API functions.

    - -

    What issues does this address?

    -

    There are a large number of existing applications, code snippets and other bits of PHP that are designed to read and write from the local file system as part of their normal operations. Many of these apps could benefit from moving into the cloud, but doing so would require rewriting a substantial amount of code.

    -

    What if we could simplify this process so that the updates required to make an existing application cloud-backed would be very minimal?

    - -

    Proposed solution

    -

    PHP provides an interface for solving this exact kind of problem, called the Stream Wrapper interface. By writing a class that implements this interface and registering it as a handler we can reduce both the amount of rewriting that needs to be done for existing applications, as well as substantially lower the learning curve for reading and writing from Amazon S3.

    - -

    How do I use it?

    -

    After including the AWS SDK for PHP in your project, use the AmazonS3::register_stream_wrapper() method to register s3:// as a supported stream wrapper for Amazon S3. It's that simple. Amazon S3 file patterns take the following form: s3://bucket/object.

    - -
    require_once 'AWSSDKforPHP/sdk.class.php';
    -
    -$s3 = new AmazonS3();
    -$s3->register_stream_wrapper();
    -
    -$directory = 's3://my-new-bucket';
    -$filename = $directory . '/put.txt';
    -$contents = '';
    -
    -if (mkdir($directory))
    -{
    -    if (file_put_contents($filename, 'This is some sample data.'))
    -    {
    -        $handle = fopen($filename, 'rb+');
    -        $contents = stream_get_contents($handle);
    -        fclose($handle);
    -    }
    -
    -    rmdir($directory);
    -}
    -
    -echo $contents;
    - -

    You may also pass a different protocol name as a parameter to AmazonS3::register_stream_wrapper() if you want to use something besides s3://. Using this technique you can create more than one stream wrapper with different configurations (e.g. for different regions). To do that you just need to create separate instances of the AmazonS3 class, configure them, and then register a stream wrapper for each of them with different protocol names.

    - -
    require_once 'AWSSDKforPHP/sdk.class.php';
    -
    -$s3east = new AmazonS3();
    -$s3east->set_region(AmazonS3::REGION_US_E1);
    -$s3east->register_stream_wrapper('s3east');
    -mkdir('s3east://my-easterly-bucket');
    -
    -$s3west = new AmazonS3();
    -$s3west->set_region(AmazonS3::REGION_US_W1);
    -$s3west->register_stream_wrapper('s3west');
    -mkdir('s3west://my-westerly-bucket');
    - -

    Tests and usage examples

    -

    We are also including tests written in the PHPT format. Not only do these tests show how the software can be used, but any tests submitted back to us should be in this format. These tests will likely fail for you unless you change the bucket names to be globally unique across S3. You can run the tests with pear.

    -
    cd S3StreamWrapper/tests;
    -pear run-tests;
    -

    If you have PHPUnit 3.6+ and Xdebug installed, you can generate a code coverage report as follows:

    -
    cd S3StreamWrapper/tests && \
    -phpunit --colors --coverage-html ./_coverage_report . && \
    -open ./_coverage_report/index.html;
    - -

    Notes and Known Issues

    -
      -
    • stream_lock() and stream_cast() are not currently implemented, and likely won't be.

    • -
    • Strangely touch() doesn’t seem to work. I think this is because of an issue with my implementation of url_stat(), but I can’t find any information on the magical combination of parameters that will make this work.

    • -
    • Using fopen() will always open in rb+ mode. Amazon S3 as a service doesn’t support anything else.

    • -
    • Because of the way that PHP interacts with the StreamWrapper interface, it’s difficult to optimize for batch requests under the hood. If you need to push or pull data from several objects, you may find that using batch requests with the standard interface has better latency.

    • -
    • rmdir() does not do a force-delete, so you will need to iterate over the files to delete them one-by-one.

    • -
    • realpath(), glob(), chmod(), chown(), chgrp(), tempnam() and a few other functions don’t support the StreamWrapper interface at the PHP-level because they're designed to work with the (no/low-latency) local file system.

    • -
    • Support for ftruncate() does not exist in any current release of PHP, but is implemented on the PHP trunk for a future release. http://bugs.php.net/53888.

    • -
    • Since Amazon S3 doesn’t support appending data, it is best to avoid functions that expect or rely on that functionality (e.g. fputcsv()).

    • -
    - -

    Successfully tested with

    - - -

    Known issues with

    - - -

    A future version may provide S3-specific implementations of some of these functions (e.g., s3chmod(), s3glob(), s3touch()).

    - - diff --git a/3rdparty/aws-sdk/_docs/WHERE_IS_THE_API_REFERENCE.md b/3rdparty/aws-sdk/_docs/WHERE_IS_THE_API_REFERENCE.md deleted file mode 100644 index 7ad235576b..0000000000 --- a/3rdparty/aws-sdk/_docs/WHERE_IS_THE_API_REFERENCE.md +++ /dev/null @@ -1,2 +0,0 @@ -You can find the API Reference at: -http://docs.amazonwebservices.com/AWSSDKforPHP/latest/ diff --git a/3rdparty/aws-sdk/authentication/signable.interface.php b/3rdparty/aws-sdk/authentication/signable.interface.php deleted file mode 100644 index 5316d16a81..0000000000 --- a/3rdparty/aws-sdk/authentication/signable.interface.php +++ /dev/null @@ -1,48 +0,0 @@ - class. - * - * @param string $endpoint (Required) The endpoint to direct the request to. - * @param string $operation (Required) The operation to execute as a result of this request. - * @param array $payload (Required) The options to use as part of the payload in the request. - * @param CFCredential $credentials (Required) The credentials to use for signing and making requests. - * @return void - */ - public function __construct($endpoint, $operation, $payload, CFCredential $credentials) - { - parent::__construct($endpoint, $operation, $payload, $credentials); - } - - /** - * Generates a cURL handle with all of the required authentication bits set. - * - * @return resource A cURL handle ready for executing. - */ - public function authenticate() - { - // Determine signing values - $current_time = time(); - $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, $current_time); - $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time); - $query = array(); - - // Do we have an authentication token? - if ($this->auth_token) - { - $headers['X-Amz-Security-Token'] = $this->auth_token; - $query['SecurityToken'] = $this->auth_token; - } - - // Only add it if it exists. - if ($this->api_version) - { - $query['Version'] = $this->api_version; - } - - $query['Action'] = $this->operation; - $query['AWSAccessKeyId'] = $this->key; - $query['SignatureMethod'] = 'HmacSHA256'; - $query['SignatureVersion'] = 2; - $query['Timestamp'] = $timestamp; - - // Merge in any options that were passed in - if (is_array($this->payload)) - { - $query = array_merge($query, $this->payload); - } - - // Do a case-sensitive, natural order sort on the array keys. - uksort($query, 'strcmp'); - - // Create the string that needs to be hashed. - $canonical_query_string = $this->util->to_signable_string($query); - - // Remove the default scheme from the domain. - $domain = str_replace(array('http://', 'https://'), '', $this->endpoint); - - // Parse our request. - $parsed_url = parse_url('http://' . $domain); - - // Set the proper host header. - if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443) - { - $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port']; - } - else - { - $host_header = strtolower($parsed_url['host']); - } - - // Set the proper request URI. - $request_uri = isset($parsed_url['path']) ? $parsed_url['path'] : '/'; - - // Prepare the string to sign - $this->string_to_sign = "POST\n$host_header\n$request_uri\n$canonical_query_string"; - - // Hash the AWS secret key and generate a signature for the request. - $query['Signature'] = base64_encode(hash_hmac('sha256', $this->string_to_sign, $this->secret_key, true)); - - // Generate the querystring from $query - $this->querystring = $this->util->to_query_string($query); - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Compose the request. - $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain; - $request_url .= !isset($parsed_url['path']) ? '/' : ''; - - // Instantiate the request class - $request = new $this->request_class($request_url, $this->proxy, $helpers, $this->credentials); - $request->set_method('POST'); - $request->set_body($this->querystring); - $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Sort headers - uksort($headers, 'strnatcasecmp'); - - // Add headers to request and compute the string to sign - foreach ($headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - // Add the header if it has a value - if ($header_value !== '') - { - $request->add_header($header_key, $header_value); - } - } - - return $request; - } -} diff --git a/3rdparty/aws-sdk/authentication/signature_v3json.class.php b/3rdparty/aws-sdk/authentication/signature_v3json.class.php deleted file mode 100644 index d07f554d1f..0000000000 --- a/3rdparty/aws-sdk/authentication/signature_v3json.class.php +++ /dev/null @@ -1,235 +0,0 @@ - class. - * - * @param string $endpoint (Required) The endpoint to direct the request to. - * @param string $operation (Required) The operation to execute as a result of this request. - * @param array $payload (Required) The options to use as part of the payload in the request. - * @param CFCredential $credentials (Required) The credentials to use for signing and making requests. - * @return void - */ - public function __construct($endpoint, $operation, $payload, CFCredential $credentials) - { - parent::__construct($endpoint, $operation, $payload, $credentials); - } - - /** - * Generates a cURL handle with all of the required authentication bits set. - * - * @return resource A cURL handle ready for executing. - */ - public function authenticate() - { - // Determine signing values - $current_time = time(); - $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, $current_time); - $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time); - $nonce = $this->util->generate_guid(); - $curlopts = array(); - $signed_headers = array(); - $return_curl_handle = false; - $x_amz_target = null; - $query = array('body' => $this->payload); - - // Do we have an authentication token? - if ($this->auth_token) - { - $headers['X-Amz-Security-Token'] = $this->auth_token; - $query['SecurityToken'] = $this->auth_token; - } - - // Manage the key-value pairs that are used in the query. - if (stripos($this->operation, 'x-amz-target') !== false) - { - $x_amz_target = trim(str_ireplace('x-amz-target:', '', $this->operation)); - } - else - { - $query['Action'] = $this->operation; - } - - // Only add it if it exists. - if ($this->api_version) - { - $query['Version'] = $this->api_version; - } - - $curlopts = array(); - - // Set custom CURLOPT settings - if (is_array($this->payload) && isset($this->payload['curlopts'])) - { - $curlopts = $this->payload['curlopts']; - unset($this->payload['curlopts']); - } - - // Merge in any options that were passed in - if (is_array($this->payload)) - { - $query = array_merge($query, $this->payload); - } - - $return_curl_handle = isset($query['returnCurlHandle']) ? $query['returnCurlHandle'] : false; - unset($query['returnCurlHandle']); - - // Do a case-sensitive, natural order sort on the array keys. - uksort($query, 'strcmp'); - - // Normalize JSON input - if (isset($query['body']) && $query['body'] === '[]') - { - $query['body'] = '{}'; - } - - // Create the string that needs to be hashed. - $canonical_query_string = $this->util->encode_signature2($query['body']); - - // Remove the default scheme from the domain. - $domain = str_replace(array('http://', 'https://'), '', $this->endpoint); - - // Parse our request. - $parsed_url = parse_url('http://' . $domain); - - // Set the proper host header. - if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443) - { - $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port']; - } - else - { - $host_header = strtolower($parsed_url['host']); - } - - // Set the proper request URI. - $request_uri = isset($parsed_url['path']) ? $parsed_url['path'] : '/'; - - // Generate the querystring from $query - $this->querystring = $this->util->to_query_string($query); - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Compose the request. - $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain; - $request_url .= !isset($parsed_url['path']) ? '/' : ''; - - // Instantiate the request class - $request = new $this->request_class($request_url, $this->proxy, $helpers, $this->credentials); - $request->set_method('POST'); - //$request->set_body($this->querystring); - //$headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; - - // Signing using X-Amz-Target is handled differently. - $headers['X-Amz-Target'] = $x_amz_target; - $headers['Content-Type'] = 'application/x-amz-json-1.0'; - $request->set_body($query['body']); - $this->querystring = $query['body']; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Add authentication headers - // $headers['X-Amz-Nonce'] = $nonce; - $headers['Date'] = $date; - $headers['Content-Length'] = strlen($this->querystring); - $headers['Content-MD5'] = $this->util->hex_to_base64(md5($this->querystring)); - $headers['Host'] = $host_header; - - // Sort headers - uksort($headers, 'strnatcasecmp'); - - // Prepare the string to sign (HTTP) - $this->string_to_sign = "POST\n$request_uri\n\n"; - - // Add headers to request and compute the string to sign - foreach ($headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - // Add the header if it has a value - if ($header_value !== '') - { - $request->add_header($header_key, $header_value); - } - - // Generate the string to sign - if ( - substr(strtolower($header_key), 0, 8) === 'content-' || - strtolower($header_key) === 'date' || - strtolower($header_key) === 'expires' || - strtolower($header_key) === 'host' || - substr(strtolower($header_key), 0, 6) === 'x-amz-' - ) - { - $this->string_to_sign .= strtolower($header_key) . ':' . $header_value . "\n"; - $signed_headers[] = $header_key; - } - } - - $this->string_to_sign .= "\n"; - - if (isset($query['body']) && $query['body'] !== '') - { - $this->string_to_sign .= $query['body']; - } - - // Convert from string-to-sign to bytes-to-sign - $bytes_to_sign = hash('sha256', $this->string_to_sign, true); - - // Hash the AWS secret key and generate a signature for the request. - $signature = base64_encode(hash_hmac('sha256', $bytes_to_sign, $this->secret_key, true)); - - $headers['X-Amzn-Authorization'] = 'AWS3' - . ' AWSAccessKeyId=' . $this->key - . ',Algorithm=HmacSHA256' - . ',SignedHeaders=' . implode(';', $signed_headers) - . ',Signature=' . $signature; - - $request->add_header('X-Amzn-Authorization', $headers['X-Amzn-Authorization']); - $request->request_headers = $headers; - - return $request; - } -} diff --git a/3rdparty/aws-sdk/authentication/signature_v3query.class.php b/3rdparty/aws-sdk/authentication/signature_v3query.class.php deleted file mode 100644 index 04565f928e..0000000000 --- a/3rdparty/aws-sdk/authentication/signature_v3query.class.php +++ /dev/null @@ -1,192 +0,0 @@ - class. - * - * @param string $endpoint (Required) The endpoint to direct the request to. - * @param string $operation (Required) The operation to execute as a result of this request. - * @param array $payload (Required) The options to use as part of the payload in the request. - * @param CFCredential $credentials (Required) The credentials to use for signing and making requests. - * @return void - */ - public function __construct($endpoint, $operation, $payload, CFCredential $credentials) - { - parent::__construct($endpoint, $operation, $payload, $credentials); - } - - /** - * Generates a cURL handle with all of the required authentication bits set. - * - * @return resource A cURL handle ready for executing. - */ - public function authenticate() - { - // Determine signing values - $current_time = time(); - $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, $current_time); - $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time); - $nonce = $this->util->generate_guid(); - $curlopts = array(); - $signed_headers = array(); - - // Do we have an authentication token? - if ($this->auth_token) - { - $headers['X-Amz-Security-Token'] = $this->auth_token; - $query['SecurityToken'] = $this->auth_token; - } - - $query['Action'] = $this->operation; - $query['Version'] = $this->api_version; - - // Set custom CURLOPT settings - if (is_array($this->payload) && isset($this->payload['curlopts'])) - { - $curlopts = $this->payload['curlopts']; - unset($this->payload['curlopts']); - } - - // Merge in any options that were passed in - if (is_array($this->payload)) - { - $query = array_merge($query, $this->payload); - } - - $return_curl_handle = isset($query['returnCurlHandle']) ? $query['returnCurlHandle'] : false; - unset($query['returnCurlHandle']); - - // Do a case-sensitive, natural order sort on the array keys. - uksort($query, 'strcmp'); - $canonical_query_string = $this->util->to_signable_string($query); - - // Remove the default scheme from the domain. - $domain = str_replace(array('http://', 'https://'), '', $this->endpoint); - - // Parse our request. - $parsed_url = parse_url('http://' . $domain); - - // Set the proper host header. - if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443) - { - $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port']; - } - else - { - $host_header = strtolower($parsed_url['host']); - } - - // Set the proper request URI. - $request_uri = isset($parsed_url['path']) ? $parsed_url['path'] : '/'; - - // Generate the querystring from $query - $this->querystring = $this->util->to_query_string($query); - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Compose the request. - $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain; - $request_url .= !isset($parsed_url['path']) ? '/' : ''; - - // Instantiate the request class - $request = new $this->request_class($request_url, $this->proxy, $helpers, $this->credentials); - $request->set_method('POST'); - $request->set_body($this->querystring); - $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Add authentication headers - $headers['X-Amz-Nonce'] = $nonce; - $headers['Date'] = $date; - $headers['Content-Length'] = strlen($this->querystring); - $headers['Content-MD5'] = $this->util->hex_to_base64(md5($this->querystring)); - $headers['Host'] = $host_header; - - // Sort headers - uksort($headers, 'strnatcasecmp'); - - // Prepare the string to sign (HTTPS) - $this->string_to_sign = $date . $nonce; - - // Add headers to request and compute the string to sign - foreach ($headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - // Add the header if it has a value - if ($header_value !== '') - { - $request->add_header($header_key, $header_value); - } - - // Generate the string to sign - if ( - substr(strtolower($header_key), 0, 8) === 'content-' || - strtolower($header_key) === 'date' || - strtolower($header_key) === 'expires' || - strtolower($header_key) === 'host' || - substr(strtolower($header_key), 0, 6) === 'x-amz-' - ) - { - $signed_headers[] = $header_key; - } - } - - // Hash the AWS secret key and generate a signature for the request. - $signature = base64_encode(hash_hmac('sha256', $this->string_to_sign, $this->secret_key, true)); - - $headers['X-Amzn-Authorization'] = 'AWS3-HTTPS' - . ' AWSAccessKeyId=' . $this->key - . ',Algorithm=HmacSHA256' - . ',SignedHeaders=' . implode(';', $signed_headers) - . ',Signature=' . $signature; - - $request->add_header('X-Amzn-Authorization', $headers['X-Amzn-Authorization']); - $request->request_headers = $headers; - - return $request; - } -} diff --git a/3rdparty/aws-sdk/authentication/signature_v4json.class.php b/3rdparty/aws-sdk/authentication/signature_v4json.class.php deleted file mode 100644 index d3ab07ad8b..0000000000 --- a/3rdparty/aws-sdk/authentication/signature_v4json.class.php +++ /dev/null @@ -1,353 +0,0 @@ - class. - * - * @param string $endpoint (Required) The endpoint to direct the request to. - * @param string $operation (Required) The operation to execute as a result of this request. - * @param array $payload (Required) The options to use as part of the payload in the request. - * @param CFCredential $credentials (Required) The credentials to use for signing and making requests. - * @return void - */ - public function __construct($endpoint, $operation, $payload, CFCredential $credentials) - { - parent::__construct($endpoint, $operation, $payload, $credentials); - } - - /** - * Generates a cURL handle with all of the required authentication bits set. - * - * @return resource A cURL handle ready for executing. - */ - public function authenticate() - { - // Determine signing values - $current_time = time(); - $timestamp = gmdate(CFUtilities::DATE_FORMAT_SIGV4, $current_time); - - // Initialize - $x_amz_target = null; - - $this->headers = array(); - $this->signed_headers = array(); - $this->canonical_headers = array(); - $this->query = array(); - - // Prepare JSON structure - $decoded = json_decode($this->payload, true); - $data = (array) (is_array($decoded) ? $decoded : $this->payload); - unset($data['curlopts']); - unset($data['returnCurlHandle']); - $this->body = json_encode($data); - if ($this->body === '' || $this->body === '[]') - { - $this->body = '{}'; - } - - // Do we have an authentication token? - if ($this->auth_token) - { - $this->headers['X-Amz-Security-Token'] = $this->auth_token; - $this->query['SecurityToken'] = $this->auth_token; - } - - // Manage the key-value pairs that are used in the query. - if (stripos($this->operation, 'x-amz-target') !== false) - { - $x_amz_target = trim(str_ireplace('x-amz-target:', '', $this->operation)); - } - else - { - $this->query['Action'] = $this->operation; - } - - // Only add it if it exists. - if ($this->api_version) - { - $this->query['Version'] = $this->api_version; - } - - // Do a case-sensitive, natural order sort on the array keys. - uksort($this->query, 'strcmp'); - - // Remove the default scheme from the domain. - $domain = str_replace(array('http://', 'https://'), '', $this->endpoint); - - // Parse our request. - $parsed_url = parse_url('http://' . $domain); - - // Set the proper host header. - if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443) - { - $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port']; - } - else - { - $host_header = strtolower($parsed_url['host']); - } - - // Generate the querystring from $this->query - $this->querystring = $this->util->to_query_string($this->query); - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Compose the request. - $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain; - $request_url .= !isset($parsed_url['path']) ? '/' : ''; - - // Instantiate the request class - $request = new $this->request_class($request_url, $this->proxy, $helpers, $this->credentials); - $request->set_method('POST'); - $request->set_body($this->body); - $this->querystring = $this->body; - $this->headers['Content-Type'] = 'application/x-amz-json-1.1'; - $this->headers['X-Amz-Target'] = $x_amz_target; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Add authentication headers - $this->headers['X-Amz-Date'] = $timestamp; - $this->headers['Content-Length'] = strlen($this->querystring); - $this->headers['Host'] = $host_header; - - // Sort headers - uksort($this->headers, 'strnatcasecmp'); - - // Add headers to request and compute the string to sign - foreach ($this->headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - $request->add_header($header_key, $header_value); - $this->canonical_headers[] = strtolower($header_key) . ':' . $header_value; - - $this->signed_headers[] = strtolower($header_key); - } - - $this->headers['Authorization'] = $this->authorization($timestamp); - $request->add_header('Authorization', $this->headers['Authorization']); - $request->request_headers = $this->headers; - - return $request; - } - - /** - * Generates the authorization string to use for the request. - * - * @param string $datetime (Required) The current timestamp. - * @return string The authorization string. - */ - protected function authorization($datetime) - { - $access_key_id = $this->key; - - $parts = array(); - $parts[] = "AWS4-HMAC-SHA256 Credential=${access_key_id}/" . $this->credential_string($datetime); - $parts[] = 'SignedHeaders=' . implode(';', $this->signed_headers); - $parts[] = 'Signature=' . $this->hex16($this->signature($datetime)); - - return implode(',', $parts); - } - - /** - * Calculate the signature. - * - * @param string $datetime (Required) The current timestamp. - * @return string The signature. - */ - protected function signature($datetime) - { - $k_date = $this->hmac('AWS4' . $this->secret_key, substr($datetime, 0, 8)); - $k_region = $this->hmac($k_date, $this->region()); - $k_service = $this->hmac($k_region, $this->service()); - $k_credentials = $this->hmac($k_service, 'aws4_request'); - $signature = $this->hmac($k_credentials, $this->string_to_sign($datetime)); - - return $signature; - } - - /** - * Calculate the string to sign. - * - * @param string $datetime (Required) The current timestamp. - * @return string The string to sign. - */ - protected function string_to_sign($datetime) - { - $parts = array(); - $parts[] = 'AWS4-HMAC-SHA256'; - $parts[] = $datetime; - $parts[] = $this->credential_string($datetime); - $parts[] = $this->hex16($this->hash($this->canonical_request())); - - $this->string_to_sign = implode("\n", $parts); - - return $this->string_to_sign; - } - - /** - * Generates the credential string to use for signing. - * - * @param string $datetime (Required) The current timestamp. - * @return string The credential string. - */ - protected function credential_string($datetime) - { - $parts = array(); - $parts[] = substr($datetime, 0, 8); - $parts[] = $this->region(); - $parts[] = $this->service(); - $parts[] = 'aws4_request'; - - return implode('/', $parts); - } - - /** - * Calculate the canonical request. - * - * @return string The canonical request. - */ - protected function canonical_request() - { - $parts = array(); - $parts[] = 'POST'; - $parts[] = $this->canonical_uri(); - $parts[] = ''; // $parts[] = $this->canonical_querystring(); - $parts[] = implode("\n", $this->canonical_headers) . "\n"; - $parts[] = implode(';', $this->signed_headers); - $parts[] = $this->hex16($this->hash($this->body)); - - $this->canonical_request = implode("\n", $parts); - - return $this->canonical_request; - } - - /** - * The region ID to use in the signature. - * - * @return return The region ID. - */ - protected function region() - { - $pieces = explode('.', $this->endpoint); - - // Handle cases with single/no region (i.e. service.region.amazonaws.com vs. service.amazonaws.com) - if (count($pieces < 4)) - { - return 'us-east-1'; - } - - return $pieces[1]; - } - - /** - * The service ID to use in the signature. - * - * @return return The service ID. - */ - protected function service() - { - $pieces = explode('.', $this->endpoint); - return $pieces[0]; - } - - /** - * The request URI path. - * - * @return string The request URI path. - */ - protected function canonical_uri() - { - return '/'; - } - - /** - * The canonical query string. - * - * @return string The canonical query string. - */ - protected function canonical_querystring() - { - if (!isset($this->canonical_querystring)) - { - $this->canonical_querystring = $this->util->to_signable_string($this->query); - } - - return $this->canonical_querystring; - } - - /** - * Hex16-pack the data. - * - * @param string $value (Required) The data to hex16 pack. - * @return string The hex16-packed data. - */ - protected function hex16($value) - { - $result = unpack('H*', $value); - return reset($result); - } - - /** - * Applies HMAC SHA-256 encryption to the string, salted by the key. - * - * @return string Raw HMAC SHA-256 hashed string. - */ - protected function hmac($key, $string) - { - return hash_hmac('sha256', $string, $key, true); - } - - /** - * SHA-256 hashes the string. - * - * @return string Raw SHA-256 hashed string. - */ - protected function hash($string) - { - return hash('sha256', $string, true); - } -} diff --git a/3rdparty/aws-sdk/authentication/signature_v4query.class.php b/3rdparty/aws-sdk/authentication/signature_v4query.class.php deleted file mode 100644 index bd5a3fbf5b..0000000000 --- a/3rdparty/aws-sdk/authentication/signature_v4query.class.php +++ /dev/null @@ -1,345 +0,0 @@ - class. - * - * @param string $endpoint (Required) The endpoint to direct the request to. - * @param string $operation (Required) The operation to execute as a result of this request. - * @param array $payload (Required) The options to use as part of the payload in the request. - * @param CFCredential $credentials (Required) The credentials to use for signing and making requests. - * @return void - */ - public function __construct($endpoint, $operation, $payload, CFCredential $credentials) - { - parent::__construct($endpoint, $operation, $payload, $credentials); - } - - /** - * Generates a cURL handle with all of the required authentication bits set. - * - * @return resource A cURL handle ready for executing. - */ - public function authenticate() - { - // Determine signing values - $current_time = time(); - $timestamp = gmdate(CFUtilities::DATE_FORMAT_SIGV4, $current_time); - - // Initialize - $x_amz_target = null; - - $this->headers = array(); - $this->signed_headers = array(); - $this->canonical_headers = array(); - $this->query = array('body' => is_array($this->payload) ? $this->payload : array()); - - // Do we have an authentication token? - if ($this->auth_token) - { - $this->headers['X-Amz-Security-Token'] = $this->auth_token; - $this->query['body']['SecurityToken'] = $this->auth_token; - } - - // Manage the key-value pairs that are used in the query. - if (stripos($this->operation, 'x-amz-target') !== false) - { - $x_amz_target = trim(str_ireplace('x-amz-target:', '', $this->operation)); - } - else - { - $this->query['body']['Action'] = $this->operation; - } - - // Only add it if it exists. - if ($this->api_version) - { - $this->query['body']['Version'] = $this->api_version; - } - - // Do a case-sensitive, natural order sort on the array keys. - uksort($this->query['body'], 'strcmp'); - - // Remove the default scheme from the domain. - $domain = str_replace(array('http://', 'https://'), '', $this->endpoint); - - // Parse our request. - $parsed_url = parse_url('http://' . $domain); - - // Set the proper host header. - if (isset($parsed_url['port']) && (integer) $parsed_url['port'] !== 80 && (integer) $parsed_url['port'] !== 443) - { - $host_header = strtolower($parsed_url['host']) . ':' . $parsed_url['port']; - } - else - { - $host_header = strtolower($parsed_url['host']); - } - - // Generate the querystring from $this->query - $this->querystring = $this->util->to_query_string($this->query); - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Compose the request. - $request_url = ($this->use_ssl ? 'https://' : 'http://') . $domain; - $request_url .= !isset($parsed_url['path']) ? '/' : ''; - - // Instantiate the request class - $request = new $this->request_class($request_url, $this->proxy, $helpers, $this->credentials); - $request->set_method('POST'); - $request->set_body($this->canonical_querystring()); - $this->querystring = $this->canonical_querystring(); - - $this->headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; - $this->headers['X-Amz-Target'] = $x_amz_target; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Add authentication headers - $this->headers['X-Amz-Date'] = $timestamp; - $this->headers['Content-Length'] = strlen($this->querystring); - $this->headers['Content-MD5'] = $this->util->hex_to_base64(md5($this->querystring)); - $this->headers['Host'] = $host_header; - - // Sort headers - uksort($this->headers, 'strnatcasecmp'); - - // Add headers to request and compute the string to sign - foreach ($this->headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - $request->add_header($header_key, $header_value); - $this->canonical_headers[] = strtolower($header_key) . ':' . $header_value; - - $this->signed_headers[] = strtolower($header_key); - } - - $this->headers['Authorization'] = $this->authorization($timestamp); - - $request->add_header('Authorization', $this->headers['Authorization']); - $request->request_headers = $this->headers; - - return $request; - } - - /** - * Generates the authorization string to use for the request. - * - * @param string $datetime (Required) The current timestamp. - * @return string The authorization string. - */ - protected function authorization($datetime) - { - $access_key_id = $this->key; - - $parts = array(); - $parts[] = "AWS4-HMAC-SHA256 Credential=${access_key_id}/" . $this->credential_string($datetime); - $parts[] = 'SignedHeaders=' . implode(';', $this->signed_headers); - $parts[] = 'Signature=' . $this->hex16($this->signature($datetime)); - - return implode(',', $parts); - } - - /** - * Calculate the signature. - * - * @param string $datetime (Required) The current timestamp. - * @return string The signature. - */ - protected function signature($datetime) - { - $k_date = $this->hmac('AWS4' . $this->secret_key, substr($datetime, 0, 8)); - $k_region = $this->hmac($k_date, $this->region()); - $k_service = $this->hmac($k_region, $this->service()); - $k_credentials = $this->hmac($k_service, 'aws4_request'); - $signature = $this->hmac($k_credentials, $this->string_to_sign($datetime)); - - return $signature; - } - - /** - * Calculate the string to sign. - * - * @param string $datetime (Required) The current timestamp. - * @return string The string to sign. - */ - protected function string_to_sign($datetime) - { - $parts = array(); - $parts[] = 'AWS4-HMAC-SHA256'; - $parts[] = $datetime; - $parts[] = $this->credential_string($datetime); - $parts[] = $this->hex16($this->hash($this->canonical_request())); - - $this->string_to_sign = implode("\n", $parts); - - return $this->string_to_sign; - } - - /** - * Generates the credential string to use for signing. - * - * @param string $datetime (Required) The current timestamp. - * @return string The credential string. - */ - protected function credential_string($datetime) - { - $parts = array(); - $parts[] = substr($datetime, 0, 8); - $parts[] = $this->region(); - $parts[] = $this->service(); - $parts[] = 'aws4_request'; - - return implode('/', $parts); - } - - /** - * Calculate the canonical request. - * - * @return string The canonical request. - */ - protected function canonical_request() - { - $parts = array(); - $parts[] = 'POST'; - $parts[] = $this->canonical_uri(); - $parts[] = ''; // $parts[] = $this->canonical_querystring(); - $parts[] = implode("\n", $this->canonical_headers) . "\n"; - $parts[] = implode(';', $this->signed_headers); - $parts[] = $this->hex16($this->hash($this->canonical_querystring())); - - $this->canonical_request = implode("\n", $parts); - - return $this->canonical_request; - } - - /** - * The region ID to use in the signature. - * - * @return return The region ID. - */ - protected function region() - { - $pieces = explode('.', $this->endpoint); - - // Handle cases with single/no region (i.e. service.region.amazonaws.com vs. service.amazonaws.com) - if (count($pieces < 4)) - { - return 'us-east-1'; - } - - return $pieces[1]; - } - - /** - * The service ID to use in the signature. - * - * @return return The service ID. - */ - protected function service() - { - $pieces = explode('.', $this->endpoint); - return ($pieces[0] === 'email') ? 'ses' : $pieces[0]; - } - - /** - * The request URI path. - * - * @return string The request URI path. - */ - protected function canonical_uri() - { - return '/'; - } - - /** - * The canonical query string. - * - * @return string The canonical query string. - */ - protected function canonical_querystring() - { - if (!isset($this->canonical_querystring)) - { - $this->canonical_querystring = $this->util->to_signable_string($this->query['body']); - } - - return $this->canonical_querystring; - } - - /** - * Hex16-pack the data. - * - * @param string $value (Required) The data to hex16 pack. - * @return string The hex16-packed data. - */ - protected function hex16($value) - { - $result = unpack('H*', $value); - return reset($result); - } - - /** - * Applies HMAC SHA-256 encryption to the string, salted by the key. - * - * @return string Raw HMAC SHA-256 hashed string. - */ - protected function hmac($key, $string) - { - return hash_hmac('sha256', $string, $key, true); - } - - /** - * SHA-256 hashes the string. - * - * @return string Raw SHA-256 hashed string. - */ - protected function hash($string) - { - return hash('sha256', $string, true); - } -} diff --git a/3rdparty/aws-sdk/authentication/signer.abstract.php b/3rdparty/aws-sdk/authentication/signer.abstract.php deleted file mode 100644 index f6bf7912f7..0000000000 --- a/3rdparty/aws-sdk/authentication/signer.abstract.php +++ /dev/null @@ -1,68 +0,0 @@ -endpoint = $endpoint; - $this->operation = $operation; - $this->payload = $payload; - $this->credentials = $credentials; - } -} diff --git a/3rdparty/aws-sdk/lib/cachecore/LICENSE b/3rdparty/aws-sdk/lib/cachecore/LICENSE deleted file mode 100755 index 49b38bd620..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other materials - provided with the distribution. - - * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS -AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/3rdparty/aws-sdk/lib/cachecore/README b/3rdparty/aws-sdk/lib/cachecore/README deleted file mode 100755 index 07e00267cb..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/README +++ /dev/null @@ -1 +0,0 @@ -A simple caching system for PHP5 that provides a single interface for a variety of storage types. diff --git a/3rdparty/aws-sdk/lib/cachecore/_sql/README b/3rdparty/aws-sdk/lib/cachecore/_sql/README deleted file mode 100755 index e25d53d120..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/_sql/README +++ /dev/null @@ -1,5 +0,0 @@ -The .sql files in this directory contain the code to create the tables for database caching. - -If you're not using database caching, you can safely ignore these. - -If you ARE using database caching, simply load the correct *.sql file into your database to set up the required tables. diff --git a/3rdparty/aws-sdk/lib/cachecore/_sql/mysql.sql b/3rdparty/aws-sdk/lib/cachecore/_sql/mysql.sql deleted file mode 100755 index 2efee3a732..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/_sql/mysql.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE `cache` ( - `id` char(40) NOT NULL default '', - `expires` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, - `data` longtext, - PRIMARY KEY (`id`), - UNIQUE KEY `id` (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 \ No newline at end of file diff --git a/3rdparty/aws-sdk/lib/cachecore/_sql/pgsql.sql b/3rdparty/aws-sdk/lib/cachecore/_sql/pgsql.sql deleted file mode 100755 index f2bdd86a52..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/_sql/pgsql.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE "cache" ( - expires timestamp without time zone NOT NULL, - id character(40) NOT NULL, - data text NOT NULL -) -WITH (OIDS=TRUE); \ No newline at end of file diff --git a/3rdparty/aws-sdk/lib/cachecore/_sql/sqlite3.sql b/3rdparty/aws-sdk/lib/cachecore/_sql/sqlite3.sql deleted file mode 100755 index 590f45e4ff..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/_sql/sqlite3.sql +++ /dev/null @@ -1,2 +0,0 @@ -CREATE TABLE cache (id TEXT, expires NUMERIC, data BLOB); -CREATE UNIQUE INDEX idx ON cache(id ASC); \ No newline at end of file diff --git a/3rdparty/aws-sdk/lib/cachecore/cacheapc.class.php b/3rdparty/aws-sdk/lib/cachecore/cacheapc.class.php deleted file mode 100755 index 59f5e88f39..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cacheapc.class.php +++ /dev/null @@ -1,126 +0,0 @@ -. Adheres - * to the ICacheCore interface. - * - * @version 2012.04.17 - * @copyright 2006-2012 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2012 Amazon.com, Inc. or its affiliates. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - * @link http://php.net/apc APC - */ -class CacheAPC extends CacheCore implements ICacheCore -{ - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of this class. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public function __construct($name, $location = null, $expires = 0, $gzip = true) - { - parent::__construct($name, null, $expires, $gzip); - $this->id = $this->name; - } - - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return apc_add($this->id, $data, $this->expires); - } - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read() - { - if ($data = apc_fetch($this->id)) - { - $data = $this->gzip ? gzuncompress($data) : $data; - return unserialize($data); - } - - return false; - } - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return apc_store($this->id, $data, $this->expires); - } - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete() - { - return apc_delete($this->id); - } - - /** - * Implemented here, but always returns `false`. APC manages its own expirations. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired() - { - return false; - } - - /** - * Implemented here, but always returns `false`. APC manages its own expirations. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp() - { - return false; - } - - /** - * Implemented here, but always returns `false`. APC manages its own expirations. - * - * @return boolean Whether the operation was successful. - */ - public function reset() - { - return false; - } -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CacheAPC_Exception extends CacheCore_Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/cachecore.class.php b/3rdparty/aws-sdk/lib/cachecore/cachecore.class.php deleted file mode 100755 index 1670d31640..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cachecore.class.php +++ /dev/null @@ -1,160 +0,0 @@ -name = $name; - $this->location = $location; - $this->expires = $expires; - $this->gzip = $gzip; - - return $this; - } - - /** - * Allows for chaining from the constructor. Requires PHP 5.3 or newer. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public static function init($name, $location = null, $expires = 0, $gzip = true) - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) - { - throw new Exception('PHP 5.3 or newer is required to use CacheCore::init().'); - } - - $self = get_called_class(); - return new $self($name, $location, $expires, $gzip); - } - - /** - * Set the number of seconds until a cache expires. - * - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @return $this - */ - public function expire_in($seconds) - { - $this->expires = $seconds; - return $this; - } - - /** - * Provides a simple, straightforward cache-logic mechanism. Useful for non-complex response caches. - * - * @param string|function $callback (Required) The name of the function to fire when we need to fetch new data to cache. - * @param array params (Optional) Parameters to pass into the callback function, as an array. - * @return array The cached data being requested. - */ - public function response_manager($callback, $params = null) - { - // Automatically handle $params values. - $params = is_array($params) ? $params : array($params); - - if ($data = $this->read()) - { - if ($this->is_expired()) - { - if ($data = call_user_func_array($callback, $params)) - { - $this->update($data); - } - else - { - $this->reset(); - $data = $this->read(); - } - } - } - else - { - if ($data = call_user_func_array($callback, $params)) - { - $this->create($data); - } - } - - return $data; - } -} - - -/*%******************************************************************************************%*/ -// CORE DEPENDENCIES - -// Include the ICacheCore interface. -if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php')) -{ - include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'icachecore.interface.php'; -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CacheCore_Exception extends Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/cachefile.class.php b/3rdparty/aws-sdk/lib/cachecore/cachefile.class.php deleted file mode 100755 index 3df240151f..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cachefile.class.php +++ /dev/null @@ -1,189 +0,0 @@ -. Adheres - * to the ICacheCore interface. - * - * @version 2012.04.17 - * @copyright 2006-2012 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2012 Amazon.com, Inc. or its affiliates. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - */ -class CacheFile extends CacheCore implements ICacheCore -{ - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of this class. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public function __construct($name, $location = null, $expires = 0, $gzip = true) - { - parent::__construct($name, $location, $expires, $gzip); - $this->id = $this->location . '/' . $this->name . '.cache'; - } - - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data) - { - if (file_exists($this->id)) - { - return false; - } - elseif (realpath($this->location) && file_exists($this->location) && is_writeable($this->location)) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return (bool) file_put_contents($this->id, $data); - } - elseif (realpath($this->location) && file_exists($this->location)) - { - throw new CacheFile_Exception('The file system location "' . $this->location . '" is not writable. Check the file system permissions for this directory.'); - } - else - { - throw new CacheFile_Exception('The file system location "' . $this->location . '" does not exist. Create the directory, or double-check any relative paths that may have been set.'); - } - - return false; - } - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read() - { - if (file_exists($this->id) && is_readable($this->id)) - { - $data = file_get_contents($this->id); - $data = $this->gzip ? gzuncompress($data) : $data; - $data = unserialize($data); - - if ($data === false) - { - /* - This should only happen when someone changes the gzip settings and there is - existing data or someone has been mucking about in the cache folder manually. - Delete the bad entry since the file cache doesn't clean up after itself and - then return false so fresh data will be retrieved. - */ - $this->delete(); - return false; - } - - return $data; - } - - return false; - } - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data) - { - if (file_exists($this->id) && is_writeable($this->id)) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return (bool) file_put_contents($this->id, $data); - } - else - { - throw new CacheFile_Exception('The file system location is not writeable. Check your file system permissions and ensure that the cache directory exists.'); - } - - return false; - } - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete() - { - if (file_exists($this->id)) - { - return unlink($this->id); - } - - return false; - } - - /** - * Checks whether the cache object is expired or not. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired() - { - if ($this->timestamp() + $this->expires < time()) - { - return true; - } - - return false; - } - - /** - * Retrieves the timestamp of the cache. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp() - { - clearstatcache(); - - if (file_exists($this->id)) - { - $this->timestamp = filemtime($this->id); - return $this->timestamp; - } - - return false; - } - - /** - * Resets the freshness of the cache. - * - * @return boolean Whether the operation was successful. - */ - public function reset() - { - if (file_exists($this->id)) - { - return touch($this->id); - } - - return false; - } -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CacheFile_Exception extends CacheCore_Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/cachemc.class.php b/3rdparty/aws-sdk/lib/cachecore/cachemc.class.php deleted file mode 100755 index 5b0f8a9306..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cachemc.class.php +++ /dev/null @@ -1,183 +0,0 @@ -. Adheres - * to the ICacheCore interface. - * - * @version 2012.04.17 - * @copyright 2006-2012 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2012 Amazon.com, Inc. or its affiliates. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - * @link http://php.net/memcache Memcache - * @link http://php.net/memcached Memcached - */ -class CacheMC extends CacheCore implements ICacheCore -{ - /** - * Holds the Memcache object. - */ - var $memcache = null; - - /** - * Whether the Memcached extension is being used (as opposed to Memcache). - */ - var $is_memcached = false; - - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of this class. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public function __construct($name, $location = null, $expires = 0, $gzip = true) - { - parent::__construct($name, null, $expires, $gzip); - $this->id = $this->name; - - // Prefer Memcached over Memcache. - if (class_exists('Memcached')) - { - $this->memcache = new Memcached(); - $this->is_memcached = true; - } - elseif (class_exists('Memcache')) - { - $this->memcache = new Memcache(); - } - else - { - return false; - } - - // Enable compression, if available - if ($this->gzip) - { - if ($this->is_memcached) - { - $this->memcache->setOption(Memcached::OPT_COMPRESSION, true); - } - else - { - $this->gzip = MEMCACHE_COMPRESSED; - } - } - - // Process Memcached servers. - if (isset($location) && sizeof($location) > 0) - { - foreach ($location as $loc) - { - if (isset($loc['port']) && !empty($loc['port'])) - { - $this->memcache->addServer($loc['host'], $loc['port']); - } - else - { - $this->memcache->addServer($loc['host'], 11211); - } - } - } - - return $this; - } - - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data) - { - if ($this->is_memcached) - { - return $this->memcache->set($this->id, $data, $this->expires); - } - return $this->memcache->set($this->id, $data, $this->gzip, $this->expires); - } - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read() - { - if ($this->is_memcached) - { - return $this->memcache->get($this->id); - } - return $this->memcache->get($this->id, $this->gzip); - } - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data) - { - if ($this->is_memcached) - { - return $this->memcache->replace($this->id, $data, $this->expires); - } - return $this->memcache->replace($this->id, $data, $this->gzip, $this->expires); - } - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete() - { - return $this->memcache->delete($this->id); - } - - /** - * Implemented here, but always returns `false`. Memcache manages its own expirations. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired() - { - return false; - } - - /** - * Implemented here, but always returns `false`. Memcache manages its own expirations. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp() - { - return false; - } - - /** - * Implemented here, but always returns `false`. Memcache manages its own expirations. - * - * @return boolean Whether the operation was successful. - */ - public function reset() - { - return false; - } -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CacheMC_Exception extends CacheCore_Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/cachepdo.class.php b/3rdparty/aws-sdk/lib/cachecore/cachepdo.class.php deleted file mode 100755 index 5716021d8f..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cachepdo.class.php +++ /dev/null @@ -1,297 +0,0 @@ -. Adheres - * to the ICacheCore interface. - * - * @version 2012.04.17 - * @copyright 2006-2012 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2012 Amazon.com, Inc. or its affiliates. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - * @link http://php.net/pdo PDO - */ -class CachePDO extends CacheCore implements ICacheCore -{ - /** - * Reference to the PDO connection object. - */ - var $pdo = null; - - /** - * Holds the parsed URL components. - */ - var $dsn = null; - - /** - * Holds the PDO-friendly version of the connection string. - */ - var $dsn_string = null; - - /** - * Holds the prepared statement for creating an entry. - */ - var $create = null; - - /** - * Holds the prepared statement for reading an entry. - */ - var $read = null; - - /** - * Holds the prepared statement for updating an entry. - */ - var $update = null; - - /** - * Holds the prepared statement for resetting the expiry of an entry. - */ - var $reset = null; - - /** - * Holds the prepared statement for deleting an entry. - */ - var $delete = null; - - /** - * Holds the response of the read so we only need to fetch it once instead of doing - * multiple queries. - */ - var $store_read = null; - - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of this class. - * - * Tested with [MySQL 5.0.x](http://mysql.com), [PostgreSQL](http://postgresql.com), and - * [SQLite 3.x](http://sqlite.org). SQLite 2.x is assumed to work. No other PDO-supported databases have - * been tested (e.g. Oracle, Microsoft SQL Server, IBM DB2, ODBC, Sybase, Firebird). Feel free to send - * patches for additional database support. - * - * See for more information. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public function __construct($name, $location = null, $expires = 0, $gzip = true) - { - // Make sure the name is no longer than 40 characters. - $name = sha1($name); - - // Call parent constructor and set id. - parent::__construct($name, $location, $expires, $gzip); - $this->id = $this->name; - $options = array(); - - // Check if the location contains :// (e.g. mysql://user:pass@hostname:port/table) - if (stripos($location, '://') === false) - { - // No? Just pass it through. - $this->dsn = parse_url($location); - $this->dsn_string = $location; - } - else - { - // Yes? Parse and set the DSN - $this->dsn = parse_url($location); - $this->dsn_string = $this->dsn['scheme'] . ':host=' . $this->dsn['host'] . ((isset($this->dsn['port'])) ? ';port=' . $this->dsn['port'] : '') . ';dbname=' . substr($this->dsn['path'], 1); - } - - // Make sure that user/pass are defined. - $user = isset($this->dsn['user']) ? $this->dsn['user'] : null; - $pass = isset($this->dsn['pass']) ? $this->dsn['pass'] : null; - - // Set persistence for databases that support it. - switch ($this->dsn['scheme']) - { - case 'mysql': // MySQL - case 'pgsql': // PostgreSQL - $options[PDO::ATTR_PERSISTENT] = true; - break; - } - - // Instantiate a new PDO object with a persistent connection. - $this->pdo = new PDO($this->dsn_string, $user, $pass, $options); - - // Define prepared statements for improved performance. - $this->create = $this->pdo->prepare("INSERT INTO cache (id, expires, data) VALUES (:id, :expires, :data)"); - $this->read = $this->pdo->prepare("SELECT id, expires, data FROM cache WHERE id = :id"); - $this->reset = $this->pdo->prepare("UPDATE cache SET expires = :expires WHERE id = :id"); - $this->delete = $this->pdo->prepare("DELETE FROM cache WHERE id = :id"); - } - - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - $this->create->bindParam(':id', $this->id); - $this->create->bindParam(':data', $data); - $this->create->bindParam(':expires', $this->generate_timestamp()); - - return (bool) $this->create->execute(); - } - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read() - { - if (!$this->store_read) - { - $this->read->bindParam(':id', $this->id); - $this->read->execute(); - $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC); - } - - if ($this->store_read) - { - $data = $this->store_read['data']; - $data = $this->gzip ? gzuncompress($data) : $data; - - return unserialize($data); - } - - return false; - } - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data) - { - $this->delete(); - return $this->create($data); - } - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete() - { - $this->delete->bindParam(':id', $this->id); - return $this->delete->execute(); - } - - /** - * Checks whether the cache object is expired or not. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired() - { - if ($this->timestamp() + $this->expires < time()) - { - return true; - } - - return false; - } - - /** - * Retrieves the timestamp of the cache. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp() - { - if (!$this->store_read) - { - $this->read->bindParam(':id', $this->id); - $this->read->execute(); - $this->store_read = $this->read->fetch(PDO::FETCH_ASSOC); - } - - if ($this->store_read) - { - $value = $this->store_read['expires']; - - // If 'expires' isn't yet an integer, convert it into one. - if (!is_numeric($value)) - { - $value = strtotime($value); - } - - $this->timestamp = date('U', $value); - return $this->timestamp; - } - - return false; - } - - /** - * Resets the freshness of the cache. - * - * @return boolean Whether the operation was successful. - */ - public function reset() - { - $this->reset->bindParam(':id', $this->id); - $this->reset->bindParam(':expires', $this->generate_timestamp()); - return (bool) $this->reset->execute(); - } - - /** - * Returns a list of supported PDO database drivers. Identical to . - * - * @return array The list of supported database drivers. - * @link http://php.net/pdo.getavailabledrivers PHP Method - */ - public function get_drivers() - { - return PDO::getAvailableDrivers(); - } - - /** - * Returns a timestamp value apropriate to the current database type. - * - * @return mixed Timestamp for MySQL and PostgreSQL, integer value for SQLite. - */ - protected function generate_timestamp() - { - // Define 'expires' settings differently. - switch ($this->dsn['scheme']) - { - // These support timestamps. - case 'mysql': // MySQL - case 'pgsql': // PostgreSQL - $expires = date(DATE_FORMAT_MYSQL, time()); - break; - - // These support integers. - case 'sqlite': // SQLite 3 - case 'sqlite2': // SQLite 2 - $expires = time(); - break; - } - - return $expires; - } -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CachePDO_Exception extends CacheCore_Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/cachexcache.class.php b/3rdparty/aws-sdk/lib/cachecore/cachexcache.class.php deleted file mode 100755 index a0f279aaea..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/cachexcache.class.php +++ /dev/null @@ -1,129 +0,0 @@ -. Adheres - * to the ICacheCore interface. - * - * @version 2012.04.17 - * @copyright 2006-2012 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2012 Amazon.com, Inc. or its affiliates. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - * @link http://xcache.lighttpd.net XCache - */ -class CacheXCache extends CacheCore implements ICacheCore -{ - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of this class. - * - * @param string $name (Required) A name to uniquely identify the cache object. - * @param string $location (Optional) The location to store the cache object in. This may vary by cache method. The default value is NULL. - * @param integer $expires (Optional) The number of seconds until a cache object is considered stale. The default value is 0. - * @param boolean $gzip (Optional) Whether data should be gzipped before being stored. The default value is true. - * @return object Reference to the cache object. - */ - public function __construct($name, $location = null, $expires = 0, $gzip = true) - { - parent::__construct($name, null, $expires, $gzip); - $this->id = $this->name; - } - - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return xcache_set($this->id, $data, $this->expires); - } - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read() - { - if ($data = xcache_get($this->id)) - { - $data = $this->gzip ? gzuncompress($data) : $data; - return unserialize($data); - } - - return false; - } - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data) - { - $data = serialize($data); - $data = $this->gzip ? gzcompress($data) : $data; - - return xcache_set($this->id, $data, $this->expires); - } - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete() - { - return xcache_unset($this->id); - } - - /** - * Defined here, but always returns false. XCache manages it's own expirations. It's worth - * mentioning that if the server is configured for a long xcache.var_gc_interval then it IS - * possible for expired data to remain in the var cache, though it is not possible to access - * it. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired() - { - return false; - } - - /** - * Implemented here, but always returns `false`. XCache manages its own expirations. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp() - { - return false; - } - - /** - * Implemented here, but always returns `false`. XCache manages its own expirations. - * - * @return boolean Whether the operation was successful. - */ - public function reset() - { - return false; - } -} - - -/*%******************************************************************************************%*/ -// EXCEPTIONS - -class CacheXCache_Exception extends CacheCore_Exception {} diff --git a/3rdparty/aws-sdk/lib/cachecore/icachecore.interface.php b/3rdparty/aws-sdk/lib/cachecore/icachecore.interface.php deleted file mode 100755 index 8d49f5bf49..0000000000 --- a/3rdparty/aws-sdk/lib/cachecore/icachecore.interface.php +++ /dev/null @@ -1,66 +0,0 @@ - class. - * - * @version 2009.03.22 - * @copyright 2006-2010 Ryan Parman - * @copyright 2006-2010 Foleeo, Inc. - * @copyright 2008-2010 Contributors - * @license http://opensource.org/licenses/bsd-license.php Simplified BSD License - * @link http://github.com/skyzyx/cachecore CacheCore - * @link http://getcloudfusion.com CloudFusion - */ -interface ICacheCore -{ - /** - * Creates a new cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function create($data); - - /** - * Reads a cache. - * - * @return mixed Either the content of the cache object, or boolean `false`. - */ - public function read(); - - /** - * Updates an existing cache. - * - * @param mixed $data (Required) The data to cache. - * @return boolean Whether the operation was successful. - */ - public function update($data); - - /** - * Deletes a cache. - * - * @return boolean Whether the operation was successful. - */ - public function delete(); - - /** - * Checks whether the cache object is expired or not. - * - * @return boolean Whether the cache is expired or not. - */ - public function is_expired(); - - /** - * Retrieves the timestamp of the cache. - * - * @return mixed Either the Unix time stamp of the cache creation, or boolean `false`. - */ - public function timestamp(); - - /** - * Resets the freshness of the cache. - * - * @return boolean Whether the operation was successful. - */ - public function reset(); -} diff --git a/3rdparty/aws-sdk/lib/dom/ArrayToDOMDocument.php b/3rdparty/aws-sdk/lib/dom/ArrayToDOMDocument.php deleted file mode 100644 index 06ad502eeb..0000000000 --- a/3rdparty/aws-sdk/lib/dom/ArrayToDOMDocument.php +++ /dev/null @@ -1,181 +0,0 @@ -appendChild(self::createDOMElement($source, $rootTagName, $document)); - - return $document; - } - - /** - * @param array $source - * @param string $rootTagName - * @param bool $formatOutput - * @return string - */ - public static function arrayToXMLString(array $source, $rootTagName = 'root', $formatOutput = true) - { - $document = self::arrayToDOMDocument($source, $rootTagName); - $document->formatOutput = $formatOutput; - - return $document->saveXML(); - } - - /** - * @param DOMDocument $document - * @return array - */ - public static function domDocumentToArray(DOMDocument $document) - { - return self::createArray($document->documentElement); - } - - /** - * @param string $xmlString - * @return array - */ - public static function xmlStringToArray($xmlString) - { - $document = new DOMDocument(); - - return $document->loadXML($xmlString) ? self::domDocumentToArray($document) : array(); - } - - /** - * @param mixed $source - * @param string $tagName - * @param DOMDocument $document - * @return DOMNode - */ - private static function createDOMElement($source, $tagName, DOMDocument $document) - { - if (!is_array($source)) - { - $element = $document->createElement($tagName); - $element->appendChild($document->createCDATASection($source)); - - return $element; - } - - $element = $document->createElement($tagName); - - foreach ($source as $key => $value) - { - if (is_string($key) && !is_numeric($key)) - { - if ($key === self::ATTRIBUTES) - { - foreach ($value as $attributeName => $attributeValue) - { - $element->setAttribute($attributeName, $attributeValue); - } - } - elseif ($key === self::CONTENT) - { - $element->appendChild($document->createCDATASection($value)); - } - elseif (is_string($value) && !is_numeric($value)) - { - $element->appendChild(self::createDOMElement($value, $key, $document)); - } - elseif (is_array($value) && count($value)) - { - $keyNode = $document->createElement($key); - - foreach ($value as $elementKey => $elementValue) - { - if (is_string($elementKey) && !is_numeric($elementKey)) - { - $keyNode->appendChild(self::createDOMElement($elementValue, $elementKey, $document)); - } - else - { - $element->appendChild(self::createDOMElement($elementValue, $key, $document)); - } - } - - if ($keyNode->hasChildNodes()) - { - $element->appendChild($keyNode); - } - } - else - { - if (is_bool($value)) - { - $value = $value ? 'true' : 'false'; - } - - $element->appendChild(self::createDOMElement($value, $key, $document)); - } - } - else - { - $element->appendChild(self::createDOMElement($value, $tagName, $document)); - } - } - - return $element; - } - - /** - * @param DOMNode $domNode - * @return array - */ - private static function createArray(DOMNode $domNode) - { - $array = array(); - - for ($i = 0; $i < $domNode->childNodes->length; $i++) - { - $item = $domNode->childNodes->item($i); - - if ($item->nodeType === XML_ELEMENT_NODE) - { - $arrayElement = array(); - - for ($attributeIndex = 0; !is_null($attribute = $item->attributes->item($attributeIndex)); $attributeIndex++) - { - if ($attribute->nodeType === XML_ATTRIBUTE_NODE) - { - $arrayElement[self::ATTRIBUTES][$attribute->nodeName] = $attribute->nodeValue; - } - } - - $children = self::createArray($item); - - if (is_array($children)) - { - $arrayElement = array_merge($arrayElement, $children); - } - else - { - $arrayElement[self::CONTENT] = $children; - } - - $array[$item->nodeName][] = $arrayElement; - } - elseif ($item->nodeType === XML_CDATA_SECTION_NODE || ($item->nodeType === XML_TEXT_NODE && trim($item->nodeValue) !== '')) - { - return $item->nodeValue; - } - } - - return $array; - } -} diff --git a/3rdparty/aws-sdk/lib/requestcore/LICENSE b/3rdparty/aws-sdk/lib/requestcore/LICENSE deleted file mode 100755 index 49b38bd620..0000000000 --- a/3rdparty/aws-sdk/lib/requestcore/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2006-2010 Ryan Parman, Foleeo Inc., and contributors. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other materials - provided with the distribution. - - * Neither the name of Ryan Parman, Foleeo Inc. nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS -AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/3rdparty/aws-sdk/lib/requestcore/README.md b/3rdparty/aws-sdk/lib/requestcore/README.md deleted file mode 100755 index 373ea4dcca..0000000000 --- a/3rdparty/aws-sdk/lib/requestcore/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# RequestCore - -RequestCore is a lightweight cURL-based HTTP request/response class that leverages MultiCurl for parallel requests. - -### PEAR HTTP_Request? - -RequestCore was written as a replacement for [PEAR HTTP_Request](http://pear.php.net/http_request/). While PEAR HTTP_Request is full-featured and heavy, RequestCore features only the essentials and is very lightweight. It also leverages the batch request support in cURL's `curl_multi_exec()` to enable multi-threaded requests that fire in parallel. - -### Reference and Download - -You can find the class reference at . You can get the code from . - -### License and Copyright - -This code is Copyright (c) 2008-2010, Ryan Parman. However, I'm licensing this code for others to use under the [Simplified BSD license](http://www.opensource.org/licenses/bsd-license.php). diff --git a/3rdparty/aws-sdk/lib/requestcore/cacert.pem b/3rdparty/aws-sdk/lib/requestcore/cacert.pem deleted file mode 100755 index 80bff62fd2..0000000000 --- a/3rdparty/aws-sdk/lib/requestcore/cacert.pem +++ /dev/null @@ -1,3390 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape security libraries. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1994-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- diff --git a/3rdparty/aws-sdk/lib/requestcore/requestcore.class.php b/3rdparty/aws-sdk/lib/requestcore/requestcore.class.php deleted file mode 100755 index 087694f08c..0000000000 --- a/3rdparty/aws-sdk/lib/requestcore/requestcore.class.php +++ /dev/null @@ -1,1028 +0,0 @@ -). - */ - public $request_class = 'RequestCore'; - - /** - * The default class to use for HTTP Responses (defaults to ). - */ - public $response_class = 'ResponseCore'; - - /** - * Default useragent string to use. - */ - public $useragent = 'RequestCore/1.4.4'; - - /** - * File to read from while streaming up. - */ - public $read_file = null; - - /** - * The resource to read from while streaming up. - */ - public $read_stream = null; - - /** - * The size of the stream to read from. - */ - public $read_stream_size = null; - - /** - * The length already read from the stream. - */ - public $read_stream_read = 0; - - /** - * File to write to while streaming down. - */ - public $write_file = null; - - /** - * The resource to write to while streaming down. - */ - public $write_stream = null; - - /** - * Stores the intended starting seek position. - */ - public $seek_position = null; - - /** - * The location of the cacert.pem file to use. - */ - public $cacert_location = false; - - /** - * The state of SSL certificate verification. - */ - public $ssl_verification = true; - - /** - * The user-defined callback function to call when a stream is read from. - */ - public $registered_streaming_read_callback = null; - - /** - * The user-defined callback function to call when a stream is written to. - */ - public $registered_streaming_write_callback = null; - - - /*%******************************************************************************************%*/ - // CONSTANTS - - /** - * GET HTTP Method - */ - const HTTP_GET = 'GET'; - - /** - * POST HTTP Method - */ - const HTTP_POST = 'POST'; - - /** - * PUT HTTP Method - */ - const HTTP_PUT = 'PUT'; - - /** - * DELETE HTTP Method - */ - const HTTP_DELETE = 'DELETE'; - - /** - * HEAD HTTP Method - */ - const HTTP_HEAD = 'HEAD'; - - - /*%******************************************************************************************%*/ - // CONSTRUCTOR/DESTRUCTOR - - /** - * Constructs a new instance of this class. - * - * @param string $url (Optional) The URL to request or service endpoint to query. - * @param string $proxy (Optional) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port` - * @param array $helpers (Optional) An associative array of classnames to use for request, and response functionality. Gets passed in automatically by the calling class. - * @return $this A reference to the current instance. - */ - public function __construct($url = null, $proxy = null, $helpers = null) - { - // Set some default values. - $this->request_url = $url; - $this->method = self::HTTP_GET; - $this->request_headers = array(); - $this->request_body = ''; - - // Set a new Request class if one was set. - if (isset($helpers['request']) && !empty($helpers['request'])) - { - $this->request_class = $helpers['request']; - } - - // Set a new Request class if one was set. - if (isset($helpers['response']) && !empty($helpers['response'])) - { - $this->response_class = $helpers['response']; - } - - if ($proxy) - { - $this->set_proxy($proxy); - } - - return $this; - } - - /** - * Destructs the instance. Closes opened file handles. - * - * @return $this A reference to the current instance. - */ - public function __destruct() - { - if (isset($this->read_file) && isset($this->read_stream)) - { - fclose($this->read_stream); - } - - if (isset($this->write_file) && isset($this->write_stream)) - { - fclose($this->write_stream); - } - - return $this; - } - - - /*%******************************************************************************************%*/ - // REQUEST METHODS - - /** - * Sets the credentials to use for authentication. - * - * @param string $user (Required) The username to authenticate with. - * @param string $pass (Required) The password to authenticate with. - * @return $this A reference to the current instance. - */ - public function set_credentials($user, $pass) - { - $this->username = $user; - $this->password = $pass; - return $this; - } - - /** - * Adds a custom HTTP header to the cURL request. - * - * @param string $key (Required) The custom HTTP header to set. - * @param mixed $value (Required) The value to assign to the custom HTTP header. - * @return $this A reference to the current instance. - */ - public function add_header($key, $value) - { - $this->request_headers[$key] = $value; - return $this; - } - - /** - * Removes an HTTP header from the cURL request. - * - * @param string $key (Required) The custom HTTP header to set. - * @return $this A reference to the current instance. - */ - public function remove_header($key) - { - if (isset($this->request_headers[$key])) - { - unset($this->request_headers[$key]); - } - return $this; - } - - /** - * Set the method type for the request. - * - * @param string $method (Required) One of the following constants: , , , , . - * @return $this A reference to the current instance. - */ - public function set_method($method) - { - $this->method = strtoupper($method); - return $this; - } - - /** - * Sets a custom useragent string for the class. - * - * @param string $ua (Required) The useragent string to use. - * @return $this A reference to the current instance. - */ - public function set_useragent($ua) - { - $this->useragent = $ua; - return $this; - } - - /** - * Set the body to send in the request. - * - * @param string $body (Required) The textual content to send along in the body of the request. - * @return $this A reference to the current instance. - */ - public function set_body($body) - { - $this->request_body = $body; - return $this; - } - - /** - * Set the URL to make the request to. - * - * @param string $url (Required) The URL to make the request to. - * @return $this A reference to the current instance. - */ - public function set_request_url($url) - { - $this->request_url = $url; - return $this; - } - - /** - * Set additional CURLOPT settings. These will merge with the default settings, and override if - * there is a duplicate. - * - * @param array $curlopts (Optional) A set of key-value pairs that set `CURLOPT` options. These will merge with the existing CURLOPTs, and ones passed here will override the defaults. Keys should be the `CURLOPT_*` constants, not strings. - * @return $this A reference to the current instance. - */ - public function set_curlopts($curlopts) - { - $this->curlopts = $curlopts; - return $this; - } - - /** - * Sets the length in bytes to read from the stream while streaming up. - * - * @param integer $size (Required) The length in bytes to read from the stream. - * @return $this A reference to the current instance. - */ - public function set_read_stream_size($size) - { - $this->read_stream_size = $size; - - return $this; - } - - /** - * Sets the resource to read from while streaming up. Reads the stream from its current position until - * EOF or `$size` bytes have been read. If `$size` is not given it will be determined by and - * . - * - * @param resource $resource (Required) The readable resource to read from. - * @param integer $size (Optional) The size of the stream to read. - * @return $this A reference to the current instance. - */ - public function set_read_stream($resource, $size = null) - { - if (!isset($size) || $size < 0) - { - $stats = fstat($resource); - - if ($stats && $stats['size'] >= 0) - { - $position = ftell($resource); - - if ($position !== false && $position >= 0) - { - $size = $stats['size'] - $position; - } - } - } - - $this->read_stream = $resource; - - return $this->set_read_stream_size($size); - } - - /** - * Sets the file to read from while streaming up. - * - * @param string $location (Required) The readable location to read from. - * @return $this A reference to the current instance. - */ - public function set_read_file($location) - { - $this->read_file = $location; - $read_file_handle = fopen($location, 'r'); - - return $this->set_read_stream($read_file_handle); - } - - /** - * Sets the resource to write to while streaming down. - * - * @param resource $resource (Required) The writeable resource to write to. - * @return $this A reference to the current instance. - */ - public function set_write_stream($resource) - { - $this->write_stream = $resource; - - return $this; - } - - /** - * Sets the file to write to while streaming down. - * - * @param string $location (Required) The writeable location to write to. - * @return $this A reference to the current instance. - */ - public function set_write_file($location) - { - $this->write_file = $location; - $write_file_handle = fopen($location, 'w'); - - return $this->set_write_stream($write_file_handle); - } - - /** - * Set the proxy to use for making requests. - * - * @param string $proxy (Required) The faux-url to use for proxy settings. Takes the following format: `proxy://user:pass@hostname:port` - * @return $this A reference to the current instance. - */ - public function set_proxy($proxy) - { - $proxy = parse_url($proxy); - $proxy['user'] = isset($proxy['user']) ? $proxy['user'] : null; - $proxy['pass'] = isset($proxy['pass']) ? $proxy['pass'] : null; - $proxy['port'] = isset($proxy['port']) ? $proxy['port'] : null; - $this->proxy = $proxy; - return $this; - } - - /** - * Set the intended starting seek position. - * - * @param integer $position (Required) The byte-position of the stream to begin reading from. - * @return $this A reference to the current instance. - */ - public function set_seek_position($position) - { - $this->seek_position = isset($position) ? (integer) $position : null; - - return $this; - } - - /** - * Register a callback function to execute whenever a data stream is read from using - * . - * - * The user-defined callback function should accept three arguments: - * - *
      - *
    • $curl_handle - resource - Required - The cURL handle resource that represents the in-progress transfer.
    • - *
    • $file_handle - resource - Required - The file handle resource that represents the file on the local file system.
    • - *
    • $length - integer - Required - The length in kilobytes of the data chunk that was transferred.
    • - *
    - * - * @param string|array|function $callback (Required) The callback function is called by , so you can pass the following values:
      - *
    • The name of a global function to execute, passed as a string.
    • - *
    • A method to execute, passed as array('ClassName', 'MethodName').
    • - *
    • An anonymous function (PHP 5.3+).
    - * @return $this A reference to the current instance. - */ - public function register_streaming_read_callback($callback) - { - $this->registered_streaming_read_callback = $callback; - - return $this; - } - - /** - * Register a callback function to execute whenever a data stream is written to using - * . - * - * The user-defined callback function should accept two arguments: - * - *
      - *
    • $curl_handle - resource - Required - The cURL handle resource that represents the in-progress transfer.
    • - *
    • $length - integer - Required - The length in kilobytes of the data chunk that was transferred.
    • - *
    - * - * @param string|array|function $callback (Required) The callback function is called by , so you can pass the following values:
      - *
    • The name of a global function to execute, passed as a string.
    • - *
    • A method to execute, passed as array('ClassName', 'MethodName').
    • - *
    • An anonymous function (PHP 5.3+).
    - * @return $this A reference to the current instance. - */ - public function register_streaming_write_callback($callback) - { - $this->registered_streaming_write_callback = $callback; - - return $this; - } - - - /*%******************************************************************************************%*/ - // PREPARE, SEND, AND PROCESS REQUEST - - /** - * A callback function that is invoked by cURL for streaming up. - * - * @param resource $curl_handle (Required) The cURL handle for the request. - * @param resource $file_handle (Required) The open file handle resource. - * @param integer $length (Required) The maximum number of bytes to read. - * @return binary Binary data from a stream. - */ - public function streaming_read_callback($curl_handle, $file_handle, $length) - { - // Once we've sent as much as we're supposed to send... - if ($this->read_stream_read >= $this->read_stream_size) - { - // Send EOF - return ''; - } - - // If we're at the beginning of an upload and need to seek... - if ($this->read_stream_read == 0 && isset($this->seek_position) && $this->seek_position !== ftell($this->read_stream)) - { - if (fseek($this->read_stream, $this->seek_position) !== 0) - { - throw new RequestCore_Exception('The stream does not support seeking and is either not at the requested position or the position is unknown.'); - } - } - - $read = fread($this->read_stream, min($this->read_stream_size - $this->read_stream_read, $length)); // Remaining upload data or cURL's requested chunk size - $this->read_stream_read += strlen($read); - - $out = $read === false ? '' : $read; - - // Execute callback function - if ($this->registered_streaming_read_callback) - { - call_user_func($this->registered_streaming_read_callback, $curl_handle, $file_handle, $out); - } - - return $out; - } - - /** - * A callback function that is invoked by cURL for streaming down. - * - * @param resource $curl_handle (Required) The cURL handle for the request. - * @param binary $data (Required) The data to write. - * @return integer The number of bytes written. - */ - public function streaming_write_callback($curl_handle, $data) - { - $length = strlen($data); - $written_total = 0; - $written_last = 0; - - while ($written_total < $length) - { - $written_last = fwrite($this->write_stream, substr($data, $written_total)); - - if ($written_last === false) - { - return $written_total; - } - - $written_total += $written_last; - } - - // Execute callback function - if ($this->registered_streaming_write_callback) - { - call_user_func($this->registered_streaming_write_callback, $curl_handle, $written_total); - } - - return $written_total; - } - - /** - * Prepares and adds the details of the cURL request. This can be passed along to a - * function. - * - * @return resource The handle for the cURL object. - */ - public function prep_request() - { - $curl_handle = curl_init(); - - // Set default options. - curl_setopt($curl_handle, CURLOPT_URL, $this->request_url); - curl_setopt($curl_handle, CURLOPT_FILETIME, true); - curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT, false); - curl_setopt($curl_handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_LEAST_RECENTLY_USED); - curl_setopt($curl_handle, CURLOPT_MAXREDIRS, 5); - curl_setopt($curl_handle, CURLOPT_HEADER, true); - curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000); - curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120); - curl_setopt($curl_handle, CURLOPT_NOSIGNAL, true); - curl_setopt($curl_handle, CURLOPT_REFERER, $this->request_url); - curl_setopt($curl_handle, CURLOPT_USERAGENT, $this->useragent); - curl_setopt($curl_handle, CURLOPT_READFUNCTION, array($this, 'streaming_read_callback')); - - // Verification of the SSL cert - if ($this->ssl_verification) - { - curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, 2); - } - else - { - curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, false); - } - - // chmod the file as 0755 - if ($this->cacert_location === true) - { - curl_setopt($curl_handle, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); - } - elseif (is_string($this->cacert_location)) - { - curl_setopt($curl_handle, CURLOPT_CAINFO, $this->cacert_location); - } - - // Debug mode - if ($this->debug_mode) - { - curl_setopt($curl_handle, CURLOPT_VERBOSE, true); - } - - // Handle open_basedir & safe mode - if (!ini_get('safe_mode') && !ini_get('open_basedir')) - { - curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true); - } - - // Enable a proxy connection if requested. - if ($this->proxy) - { - curl_setopt($curl_handle, CURLOPT_HTTPPROXYTUNNEL, true); - - $host = $this->proxy['host']; - $host .= ($this->proxy['port']) ? ':' . $this->proxy['port'] : ''; - curl_setopt($curl_handle, CURLOPT_PROXY, $host); - - if (isset($this->proxy['user']) && isset($this->proxy['pass'])) - { - curl_setopt($curl_handle, CURLOPT_PROXYUSERPWD, $this->proxy['user'] . ':' . $this->proxy['pass']); - } - } - - // Set credentials for HTTP Basic/Digest Authentication. - if ($this->username && $this->password) - { - curl_setopt($curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY); - curl_setopt($curl_handle, CURLOPT_USERPWD, $this->username . ':' . $this->password); - } - - // Handle the encoding if we can. - if (extension_loaded('zlib')) - { - curl_setopt($curl_handle, CURLOPT_ENCODING, 'gzip, deflate'); - } - - // Process custom headers - if (isset($this->request_headers) && count($this->request_headers)) - { - $temp_headers = array(); - - foreach ($this->request_headers as $k => $v) - { - $temp_headers[] = $k . ': ' . $v; - } - - curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $temp_headers); - } - - switch ($this->method) - { - case self::HTTP_PUT: - curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'PUT'); - if (isset($this->read_stream)) - { - if (!isset($this->read_stream_size) || $this->read_stream_size < 0) - { - throw new RequestCore_Exception('The stream size for the streaming upload cannot be determined.'); - } - - curl_setopt($curl_handle, CURLOPT_INFILESIZE, $this->read_stream_size); - curl_setopt($curl_handle, CURLOPT_UPLOAD, true); - } - else - { - curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body); - } - break; - - case self::HTTP_POST: - curl_setopt($curl_handle, CURLOPT_POST, true); - curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body); - break; - - case self::HTTP_HEAD: - curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, self::HTTP_HEAD); - curl_setopt($curl_handle, CURLOPT_NOBODY, 1); - break; - - default: // Assumed GET - curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, $this->method); - if (isset($this->write_stream)) - { - curl_setopt($curl_handle, CURLOPT_WRITEFUNCTION, array($this, 'streaming_write_callback')); - curl_setopt($curl_handle, CURLOPT_HEADER, false); - } - else - { - curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $this->request_body); - } - break; - } - - // Merge in the CURLOPTs - if (isset($this->curlopts) && sizeof($this->curlopts) > 0) - { - foreach ($this->curlopts as $k => $v) - { - curl_setopt($curl_handle, $k, $v); - } - } - - return $curl_handle; - } - - /** - * Take the post-processed cURL data and break it down into useful header/body/info chunks. Uses the - * data stored in the `curl_handle` and `response` properties unless replacement data is passed in via - * parameters. - * - * @param resource $curl_handle (Optional) The reference to the already executed cURL request. - * @param string $response (Optional) The actual response content itself that needs to be parsed. - * @return ResponseCore A object containing a parsed HTTP response. - */ - public function process_response($curl_handle = null, $response = null) - { - // Accept a custom one if it's passed. - if ($curl_handle && $response) - { - $this->curl_handle = $curl_handle; - $this->response = $response; - } - - // As long as this came back as a valid resource... - if (is_resource($this->curl_handle)) - { - // Determine what's what. - $header_size = curl_getinfo($this->curl_handle, CURLINFO_HEADER_SIZE); - $this->response_headers = substr($this->response, 0, $header_size); - $this->response_body = substr($this->response, $header_size); - $this->response_code = curl_getinfo($this->curl_handle, CURLINFO_HTTP_CODE); - $this->response_info = curl_getinfo($this->curl_handle); - - // Parse out the headers - $this->response_headers = explode("\r\n\r\n", trim($this->response_headers)); - $this->response_headers = array_pop($this->response_headers); - $this->response_headers = explode("\r\n", $this->response_headers); - array_shift($this->response_headers); - - // Loop through and split up the headers. - $header_assoc = array(); - foreach ($this->response_headers as $header) - { - $kv = explode(': ', $header); - $header_assoc[strtolower($kv[0])] = $kv[1]; - } - - // Reset the headers to the appropriate property. - $this->response_headers = $header_assoc; - $this->response_headers['_info'] = $this->response_info; - $this->response_headers['_info']['method'] = $this->method; - - if ($curl_handle && $response) - { - return new $this->response_class($this->response_headers, $this->response_body, $this->response_code, $this->curl_handle); - } - } - - // Return false - return false; - } - - /** - * Sends the request, calling necessary utility functions to update built-in properties. - * - * @param boolean $parse (Optional) Whether to parse the response with ResponseCore or not. - * @return string The resulting unparsed data from the request. - */ - public function send_request($parse = false) - { - set_time_limit(0); - - $curl_handle = $this->prep_request(); - $this->response = curl_exec($curl_handle); - - if ($this->response === false) - { - throw new cURL_Exception('cURL resource: ' . (string) $curl_handle . '; cURL error: ' . curl_error($curl_handle) . ' (cURL error code ' . curl_errno($curl_handle) . '). See http://curl.haxx.se/libcurl/c/libcurl-errors.html for an explanation of error codes.'); - } - - $parsed_response = $this->process_response($curl_handle, $this->response); - - curl_close($curl_handle); - - if ($parse) - { - return $parsed_response; - } - - return $this->response; - } - - /** - * Sends the request using , enabling parallel requests. Uses the "rolling" method. - * - * @param array $handles (Required) An indexed array of cURL handles to process simultaneously. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • callback - string|array - Optional - The string name of a function to pass the response data to. If this is a method, pass an array where the [0] index is the class and the [1] index is the method name.
    • - *
    • limit - integer - Optional - The number of simultaneous requests to make. This can be useful for scaling around slow server responses. Defaults to trusting cURLs judgement as to how many to use.
    - * @return array Post-processed cURL responses. - */ - public function send_multi_request($handles, $opt = null) - { - set_time_limit(0); - - // Skip everything if there are no handles to process. - if (count($handles) === 0) return array(); - - if (!$opt) $opt = array(); - - // Initialize any missing options - $limit = isset($opt['limit']) ? $opt['limit'] : -1; - - // Initialize - $handle_list = $handles; - $http = new $this->request_class(); - $multi_handle = curl_multi_init(); - $handles_post = array(); - $added = count($handles); - $last_handle = null; - $count = 0; - $i = 0; - - // Loop through the cURL handles and add as many as it set by the limit parameter. - while ($i < $added) - { - if ($limit > 0 && $i >= $limit) break; - curl_multi_add_handle($multi_handle, array_shift($handles)); - $i++; - } - - do - { - $active = false; - - // Start executing and wait for a response. - while (($status = curl_multi_exec($multi_handle, $active)) === CURLM_CALL_MULTI_PERFORM) - { - // Start looking for possible responses immediately when we have to add more handles - if (count($handles) > 0) break; - } - - // Figure out which requests finished. - $to_process = array(); - - while ($done = curl_multi_info_read($multi_handle)) - { - // Since curl_errno() isn't reliable for handles that were in multirequests, we check the 'result' of the info read, which contains the curl error number, (listed here http://curl.haxx.se/libcurl/c/libcurl-errors.html ) - if ($done['result'] > 0) - { - throw new cURL_Multi_Exception('cURL resource: ' . (string) $done['handle'] . '; cURL error: ' . curl_error($done['handle']) . ' (cURL error code ' . $done['result'] . '). See http://curl.haxx.se/libcurl/c/libcurl-errors.html for an explanation of error codes.'); - } - - // Because curl_multi_info_read() might return more than one message about a request, we check to see if this request is already in our array of completed requests - elseif (!isset($to_process[(int) $done['handle']])) - { - $to_process[(int) $done['handle']] = $done; - } - } - - // Actually deal with the request - foreach ($to_process as $pkey => $done) - { - $response = $http->process_response($done['handle'], curl_multi_getcontent($done['handle'])); - $key = array_search($done['handle'], $handle_list, true); - $handles_post[$key] = $response; - - if (count($handles) > 0) - { - curl_multi_add_handle($multi_handle, array_shift($handles)); - } - - curl_multi_remove_handle($multi_handle, $done['handle']); - curl_close($done['handle']); - } - } - while ($active || count($handles_post) < $added); - - curl_multi_close($multi_handle); - - ksort($handles_post, SORT_NUMERIC); - return $handles_post; - } - - - /*%******************************************************************************************%*/ - // RESPONSE METHODS - - /** - * Get the HTTP response headers from the request. - * - * @param string $header (Optional) A specific header value to return. Defaults to all headers. - * @return string|array All or selected header values. - */ - public function get_response_header($header = null) - { - if ($header) - { - return $this->response_headers[strtolower($header)]; - } - return $this->response_headers; - } - - /** - * Get the HTTP response body from the request. - * - * @return string The response body. - */ - public function get_response_body() - { - return $this->response_body; - } - - /** - * Get the HTTP response code from the request. - * - * @return string The HTTP response code. - */ - public function get_response_code() - { - return $this->response_code; - } -} - - -/** - * Container for all response-related methods. - */ -class ResponseCore -{ - /** - * Stores the HTTP header information. - */ - public $header; - - /** - * Stores the SimpleXML response. - */ - public $body; - - /** - * Stores the HTTP response code. - */ - public $status; - - /** - * Constructs a new instance of this class. - * - * @param array $header (Required) Associative array of HTTP headers (typically returned by ). - * @param string $body (Required) XML-formatted response from AWS. - * @param integer $status (Optional) HTTP response status code from the request. - * @return object Contains an `header` property (HTTP headers as an associative array), a or `body` property, and an `status` code. - */ - public function __construct($header, $body, $status = null) - { - $this->header = $header; - $this->body = $body; - $this->status = $status; - - return $this; - } - - /** - * Did we receive the status code we expected? - * - * @param integer|array $codes (Optional) The status code(s) to expect. Pass an for a single acceptable value, or an of integers for multiple acceptable values. - * @return boolean Whether we received the expected status code or not. - */ - public function isOK($codes = array(200, 201, 204, 206)) - { - if (is_array($codes)) - { - return in_array($this->status, $codes); - } - - return $this->status === $codes; - } -} - -class cURL_Exception extends Exception {} -class cURL_Multi_Exception extends cURL_Exception {} -class RequestCore_Exception extends Exception {} diff --git a/3rdparty/aws-sdk/lib/yaml/LICENSE b/3rdparty/aws-sdk/lib/yaml/LICENSE deleted file mode 100644 index 3cef853170..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2008-2009 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/3rdparty/aws-sdk/lib/yaml/README.markdown b/3rdparty/aws-sdk/lib/yaml/README.markdown deleted file mode 100644 index e4f80cfbac..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/README.markdown +++ /dev/null @@ -1,15 +0,0 @@ -Symfony YAML: A PHP library that speaks YAML -============================================ - -Symfony YAML is a PHP library that parses YAML strings and converts them to -PHP arrays. It can also converts PHP arrays to YAML strings. Its official -website is at http://components.symfony-project.org/yaml/. - -The documentation is to be found in the `doc/` directory. - -Symfony YAML is licensed under the MIT license (see LICENSE file). - -The Symfony YAML library is developed and maintained by the -[symfony](http://www.symfony-project.org/) project team. It has been extracted -from symfony to be used as a standalone library. Symfony YAML is part of the -[symfony components project](http://components.symfony-project.org/). diff --git a/3rdparty/aws-sdk/lib/yaml/lib/sfYaml.php b/3rdparty/aws-sdk/lib/yaml/lib/sfYaml.php deleted file mode 100644 index 1d89ccc973..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/lib/sfYaml.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * sfYaml offers convenience methods to load and dump YAML. - * - * @package symfony - * @subpackage yaml - * @author Fabien Potencier - * @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $ - */ -class sfYaml -{ - static protected - $spec = '1.2'; - - /** - * Sets the YAML specification version to use. - * - * @param string $version The YAML specification version - */ - static public function setSpecVersion($version) - { - if (!in_array($version, array('1.1', '1.2'))) - { - throw new InvalidArgumentException(sprintf('Version %s of the YAML specifications is not supported', $version)); - } - - self::$spec = $version; - } - - /** - * Gets the YAML specification version to use. - * - * @return string The YAML specification version - */ - static public function getSpecVersion() - { - return self::$spec; - } - - /** - * Loads YAML into a PHP array. - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. - * - * Usage: - * - * $array = sfYaml::load('config.yml'); - * print_r($array); - * - * - * @param string $input Path of YAML file or string containing YAML - * - * @return array The YAML converted to a PHP array - * - * @throws InvalidArgumentException If the YAML is not valid - */ - public static function load($input) - { - $file = ''; - - // if input is a file, process it - if (strpos($input, "\n") === false && is_file($input)) - { - $file = $input; - - ob_start(); - $retval = include($input); - $content = ob_get_clean(); - - // if an array is returned by the config file assume it's in plain php form else in YAML - $input = is_array($retval) ? $retval : $content; - } - - // if an array is returned by the config file assume it's in plain php form else in YAML - if (is_array($input)) - { - return $input; - } - - require_once dirname(__FILE__).'/sfYamlParser.php'; - - $yaml = new sfYamlParser(); - - try - { - $ret = $yaml->parse($input); - } - catch (Exception $e) - { - throw new InvalidArgumentException(sprintf('Unable to parse %s: %s', $file ? sprintf('file "%s"', $file) : 'string', $e->getMessage())); - } - - return $ret; - } - - /** - * Dumps a PHP array to a YAML string. - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. - * - * @param array $array PHP array - * @param integer $inline The level where you switch to inline YAML - * - * @return string A YAML string representing the original PHP array - */ - public static function dump($array, $inline = 2) - { - require_once dirname(__FILE__).'/sfYamlDumper.php'; - - $yaml = new sfYamlDumper(); - - return $yaml->dump($array, $inline); - } -} - -/** - * Wraps echo to automatically provide a newline. - * - * @param string $string The string to echo with new line - */ -function echoln($string) -{ - echo $string."\n"; -} diff --git a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlDumper.php b/3rdparty/aws-sdk/lib/yaml/lib/sfYamlDumper.php deleted file mode 100644 index 0ada2b37d2..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlDumper.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -require_once(dirname(__FILE__).'/sfYamlInline.php'); - -/** - * sfYamlDumper dumps PHP variables to YAML strings. - * - * @package symfony - * @subpackage yaml - * @author Fabien Potencier - * @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $ - */ -class sfYamlDumper -{ - /** - * Dumps a PHP value to YAML. - * - * @param mixed $input The PHP value - * @param integer $inline The level where you switch to inline YAML - * @param integer $indent The level o indentation indentation (used internally) - * - * @return string The YAML representation of the PHP value - */ - public function dump($input, $inline = 0, $indent = 0) - { - $output = ''; - $prefix = $indent ? str_repeat(' ', $indent) : ''; - - if ($inline <= 0 || !is_array($input) || empty($input)) - { - $output .= $prefix.sfYamlInline::dump($input); - } - else - { - $isAHash = array_keys($input) !== range(0, count($input) - 1); - - foreach ($input as $key => $value) - { - $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value); - - $output .= sprintf('%s%s%s%s', - $prefix, - $isAHash ? sfYamlInline::dump($key).':' : '-', - $willBeInlined ? ' ' : "\n", - $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + 2) - ).($willBeInlined ? "\n" : ''); - } - } - - return $output; - } -} diff --git a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlInline.php b/3rdparty/aws-sdk/lib/yaml/lib/sfYamlInline.php deleted file mode 100644 index 66edb4f07a..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlInline.php +++ /dev/null @@ -1,442 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -require_once dirname(__FILE__).'/sfYaml.php'; - -/** - * sfYamlInline implements a YAML parser/dumper for the YAML inline syntax. - * - * @package symfony - * @subpackage yaml - * @author Fabien Potencier - * @version SVN: $Id: sfYamlInline.class.php 16177 2009-03-11 08:32:48Z fabien $ - */ -class sfYamlInline -{ - const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')'; - - /** - * Convert a YAML string to a PHP array. - * - * @param string $value A YAML string - * - * @return array A PHP array representing the YAML string - */ - static public function load($value) - { - $value = trim($value); - - if (0 == strlen($value)) - { - return ''; - } - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) - { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('ASCII'); - } - - switch ($value[0]) - { - case '[': - $result = self::parseSequence($value); - break; - case '{': - $result = self::parseMapping($value); - break; - default: - $result = self::parseScalar($value); - } - - if (isset($mbEncoding)) - { - mb_internal_encoding($mbEncoding); - } - - return $result; - } - - /** - * Dumps a given PHP variable to a YAML string. - * - * @param mixed $value The PHP variable to convert - * - * @return string The YAML string representing the PHP array - */ - static public function dump($value) - { - if ('1.1' === sfYaml::getSpecVersion()) - { - $trueValues = array('true', 'on', '+', 'yes', 'y'); - $falseValues = array('false', 'off', '-', 'no', 'n'); - } - else - { - $trueValues = array('true'); - $falseValues = array('false'); - } - - switch (true) - { - case is_resource($value): - throw new InvalidArgumentException('Unable to dump PHP resources in a YAML file.'); - case is_object($value): - return '!!php/object:'.serialize($value); - case is_array($value): - return self::dumpArray($value); - case null === $value: - return 'null'; - case true === $value: - return 'true'; - case false === $value: - return 'false'; - case ctype_digit($value): - return is_string($value) ? "'$value'" : (int) $value; - case is_numeric($value): - return is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : (is_string($value) ? "'$value'" : $value); - case false !== strpos($value, "\n") || false !== strpos($value, "\r"): - return sprintf('"%s"', str_replace(array('"', "\n", "\r"), array('\\"', '\n', '\r'), $value)); - case preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ - ? | < > = ! % @ ` ]/x', $value): - return sprintf("'%s'", str_replace('\'', '\'\'', $value)); - case '' == $value: - return "''"; - case preg_match(self::getTimestampRegex(), $value): - return "'$value'"; - case in_array(strtolower($value), $trueValues): - return "'$value'"; - case in_array(strtolower($value), $falseValues): - return "'$value'"; - case in_array(strtolower($value), array('null', '~')): - return "'$value'"; - default: - return $value; - } - } - - /** - * Dumps a PHP array to a YAML string. - * - * @param array $value The PHP array to dump - * - * @return string The YAML string representing the PHP array - */ - static protected function dumpArray($value) - { - // array - $keys = array_keys($value); - if ( - (1 == count($keys) && '0' == $keys[0]) - || - (count($keys) > 1 && array_reduce($keys, create_function('$v,$w', 'return (integer) $v + $w;'), 0) == count($keys) * (count($keys) - 1) / 2)) - { - $output = array(); - foreach ($value as $val) - { - $output[] = self::dump($val); - } - - return sprintf('[%s]', implode(', ', $output)); - } - - // mapping - $output = array(); - foreach ($value as $key => $val) - { - $output[] = sprintf('%s: %s', self::dump($key), self::dump($val)); - } - - return sprintf('{ %s }', implode(', ', $output)); - } - - /** - * Parses a scalar to a YAML string. - * - * @param scalar $scalar - * @param string $delimiters - * @param array $stringDelimiter - * @param integer $i - * @param boolean $evaluate - * - * @return string A YAML string - */ - static public function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true) - { - if (in_array($scalar[$i], $stringDelimiters)) - { - // quoted scalar - $output = self::parseQuotedScalar($scalar, $i); - } - else - { - // "normal" string - if (!$delimiters) - { - $output = substr($scalar, $i); - $i += strlen($output); - - // remove comments - if (false !== $strpos = strpos($output, ' #')) - { - $output = rtrim(substr($output, 0, $strpos)); - } - } - else if (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) - { - $output = $match[1]; - $i += strlen($output); - } - else - { - throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', $scalar)); - } - - $output = $evaluate ? self::evaluateScalar($output) : $output; - } - - return $output; - } - - /** - * Parses a quoted scalar to YAML. - * - * @param string $scalar - * @param integer $i - * - * @return string A YAML string - */ - static protected function parseQuotedScalar($scalar, &$i) - { - if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/A', substr($scalar, $i), $match)) - { - throw new InvalidArgumentException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); - } - - $output = substr($match[0], 1, strlen($match[0]) - 2); - - if ('"' == $scalar[$i]) - { - // evaluate the string - $output = str_replace(array('\\"', '\\n', '\\r'), array('"', "\n", "\r"), $output); - } - else - { - // unescape ' - $output = str_replace('\'\'', '\'', $output); - } - - $i += strlen($match[0]); - - return $output; - } - - /** - * Parses a sequence to a YAML string. - * - * @param string $sequence - * @param integer $i - * - * @return string A YAML string - */ - static protected function parseSequence($sequence, &$i = 0) - { - $output = array(); - $len = strlen($sequence); - $i += 1; - - // [foo, bar, ...] - while ($i < $len) - { - switch ($sequence[$i]) - { - case '[': - // nested sequence - $output[] = self::parseSequence($sequence, $i); - break; - case '{': - // nested mapping - $output[] = self::parseMapping($sequence, $i); - break; - case ']': - return $output; - case ',': - case ' ': - break; - default: - $isQuoted = in_array($sequence[$i], array('"', "'")); - $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i); - - if (!$isQuoted && false !== strpos($value, ': ')) - { - // embedded mapping? - try - { - $value = self::parseMapping('{'.$value.'}'); - } - catch (InvalidArgumentException $e) - { - // no, it's not - } - } - - $output[] = $value; - - --$i; - } - - ++$i; - } - - throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $sequence)); - } - - /** - * Parses a mapping to a YAML string. - * - * @param string $mapping - * @param integer $i - * - * @return string A YAML string - */ - static protected function parseMapping($mapping, &$i = 0) - { - $output = array(); - $len = strlen($mapping); - $i += 1; - - // {foo: bar, bar:foo, ...} - while ($i < $len) - { - switch ($mapping[$i]) - { - case ' ': - case ',': - ++$i; - continue 2; - case '}': - return $output; - } - - // key - $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false); - - // value - $done = false; - while ($i < $len) - { - switch ($mapping[$i]) - { - case '[': - // nested sequence - $output[$key] = self::parseSequence($mapping, $i); - $done = true; - break; - case '{': - // nested mapping - $output[$key] = self::parseMapping($mapping, $i); - $done = true; - break; - case ':': - case ' ': - break; - default: - $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i); - $done = true; - --$i; - } - - ++$i; - - if ($done) - { - continue 2; - } - } - } - - throw new InvalidArgumentException(sprintf('Malformed inline YAML string %s', $mapping)); - } - - /** - * Evaluates scalars and replaces magic values. - * - * @param string $scalar - * - * @return string A YAML string - */ - static protected function evaluateScalar($scalar) - { - $scalar = trim($scalar); - - if ('1.1' === sfYaml::getSpecVersion()) - { - $trueValues = array('true', 'on', '+', 'yes', 'y'); - $falseValues = array('false', 'off', '-', 'no', 'n'); - } - else - { - $trueValues = array('true'); - $falseValues = array('false'); - } - - switch (true) - { - case 'null' == strtolower($scalar): - case '' == $scalar: - case '~' == $scalar: - return null; - case 0 === strpos($scalar, '!str'): - return (string) substr($scalar, 5); - case 0 === strpos($scalar, '! '): - return intval(self::parseScalar(substr($scalar, 2))); - case 0 === strpos($scalar, '!!php/object:'): - return unserialize(substr($scalar, 13)); - case ctype_digit($scalar): - $raw = $scalar; - $cast = intval($scalar); - return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); - case in_array(strtolower($scalar), $trueValues): - return true; - case in_array(strtolower($scalar), $falseValues): - return false; - case is_numeric($scalar): - return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar); - case 0 == strcasecmp($scalar, '.inf'): - case 0 == strcasecmp($scalar, '.NaN'): - return -log(0); - case 0 == strcasecmp($scalar, '-.inf'): - return log(0); - case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar): - return floatval(str_replace(',', '', $scalar)); - case preg_match(self::getTimestampRegex(), $scalar): - return strtotime($scalar); - default: - return (string) $scalar; - } - } - - static protected function getTimestampRegex() - { - return <<[0-9][0-9][0-9][0-9]) - -(?P[0-9][0-9]?) - -(?P[0-9][0-9]?) - (?:(?:[Tt]|[ \t]+) - (?P[0-9][0-9]?) - :(?P[0-9][0-9]) - :(?P[0-9][0-9]) - (?:\.(?P[0-9]*))? - (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) - (?::(?P[0-9][0-9]))?))?)? - $~x -EOF; - } -} diff --git a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlParser.php b/3rdparty/aws-sdk/lib/yaml/lib/sfYamlParser.php deleted file mode 100644 index 4c56a56db0..0000000000 --- a/3rdparty/aws-sdk/lib/yaml/lib/sfYamlParser.php +++ /dev/null @@ -1,612 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -require_once(dirname(__FILE__).'/sfYamlInline.php'); - -if (!defined('PREG_BAD_UTF8_OFFSET_ERROR')) -{ - define('PREG_BAD_UTF8_OFFSET_ERROR', 5); -} - -/** - * sfYamlParser parses YAML strings to convert them to PHP arrays. - * - * @package symfony - * @subpackage yaml - * @author Fabien Potencier - * @version SVN: $Id: sfYamlParser.class.php 10832 2008-08-13 07:46:08Z fabien $ - */ -class sfYamlParser -{ - protected - $offset = 0, - $lines = array(), - $currentLineNb = -1, - $currentLine = '', - $refs = array(); - - /** - * Constructor - * - * @param integer $offset The offset of YAML document (used for line numbers in error messages) - */ - public function __construct($offset = 0) - { - $this->offset = $offset; - } - - /** - * Parses a YAML string to a PHP value. - * - * @param string $value A YAML string - * - * @return mixed A PHP value - * - * @throws InvalidArgumentException If the YAML is not valid - */ - public function parse($value) - { - $value = str_replace("\t", ' ', $value); // Convert tabs to spaces. - - $this->currentLineNb = -1; - $this->currentLine = ''; - $this->lines = explode("\n", $this->cleanup($value)); - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) - { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('ASCII'); - } - - $data = array(); - while ($this->moveToNextLine()) - { - if ($this->isCurrentLineEmpty()) - { - continue; - } - - // tab? - if (preg_match('#^\t+#', $this->currentLine)) - { - throw new InvalidArgumentException(sprintf('A YAML file cannot contain tabs as indentation at line %d (%s).', $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - - $isRef = $isInPlace = $isProcessed = false; - if (preg_match('#^\-((?P\s+)(?P.+?))?\s*$#', $this->currentLine, $values)) - { - if (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#', $values['value'], $matches)) - { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - // array - if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) - { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new sfYamlParser($c); - $parser->refs =& $this->refs; - $data[] = $parser->parse($this->getNextEmbedBlock()); - } - else - { - if (isset($values['leadspaces']) - && ' ' == $values['leadspaces'] - && preg_match('#^(?P'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"\{].*?) *\:(\s+(?P.+?))?\s*$#', $values['value'], $matches)) - { - // this is a compact notation element, add to next block and parse - $c = $this->getRealCurrentLineNb(); - $parser = new sfYamlParser($c); - $parser->refs =& $this->refs; - - $block = $values['value']; - if (!$this->isNextLineIndented()) - { - $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2); - } - - $data[] = $parser->parse($block); - } - else - { - $data[] = $this->parseValue($values['value']); - } - } - } - else if (preg_match('#^(?P'.sfYamlInline::REGEX_QUOTED_STRING.'|[^ \'"].*?) *\:(\s+(?P.+?))?\s*$#', $this->currentLine, $values)) - { - $key = sfYamlInline::parseScalar($values['key']); - - if ('<<' === $key) - { - if (isset($values['value']) && '*' === substr($values['value'], 0, 1)) - { - $isInPlace = substr($values['value'], 1); - if (!array_key_exists($isInPlace, $this->refs)) - { - throw new InvalidArgumentException(sprintf('Reference "%s" does not exist at line %s (%s).', $isInPlace, $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - } - else - { - if (isset($values['value']) && $values['value'] !== '') - { - $value = $values['value']; - } - else - { - $value = $this->getNextEmbedBlock(); - } - $c = $this->getRealCurrentLineNb() + 1; - $parser = new sfYamlParser($c); - $parser->refs =& $this->refs; - $parsed = $parser->parse($value); - - $merged = array(); - if (!is_array($parsed)) - { - throw new InvalidArgumentException(sprintf("YAML merge keys used with a scalar value instead of an array at line %s (%s)", $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - else if (isset($parsed[0])) - { - // Numeric array, merge individual elements - foreach (array_reverse($parsed) as $parsedItem) - { - if (!is_array($parsedItem)) - { - throw new InvalidArgumentException(sprintf("Merge items must be arrays at line %s (%s).", $this->getRealCurrentLineNb() + 1, $parsedItem)); - } - $merged = array_merge($parsedItem, $merged); - } - } - else - { - // Associative array, merge - $merged = array_merge($merge, $parsed); - } - - $isProcessed = $merged; - } - } - else if (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#', $values['value'], $matches)) - { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - if ($isProcessed) - { - // Merge keys - $data = $isProcessed; - } - // hash - else if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) - { - // if next line is less indented or equal, then it means that the current value is null - if ($this->isNextLineIndented()) - { - $data[$key] = null; - } - else - { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new sfYamlParser($c); - $parser->refs =& $this->refs; - $data[$key] = $parser->parse($this->getNextEmbedBlock()); - } - } - else - { - if ($isInPlace) - { - $data = $this->refs[$isInPlace]; - } - else - { - $data[$key] = $this->parseValue($values['value']); - } - } - } - else - { - // 1-liner followed by newline - if (2 == count($this->lines) && empty($this->lines[1])) - { - $value = sfYamlInline::load($this->lines[0]); - if (is_array($value)) - { - $first = reset($value); - if ('*' === substr($first, 0, 1)) - { - $data = array(); - foreach ($value as $alias) - { - $data[] = $this->refs[substr($alias, 1)]; - } - $value = $data; - } - } - - if (isset($mbEncoding)) - { - mb_internal_encoding($mbEncoding); - } - - return $value; - } - - switch (preg_last_error()) - { - case PREG_INTERNAL_ERROR: - $error = 'Internal PCRE error on line'; - break; - case PREG_BACKTRACK_LIMIT_ERROR: - $error = 'pcre.backtrack_limit reached on line'; - break; - case PREG_RECURSION_LIMIT_ERROR: - $error = 'pcre.recursion_limit reached on line'; - break; - case PREG_BAD_UTF8_ERROR: - $error = 'Malformed UTF-8 data on line'; - break; - case PREG_BAD_UTF8_OFFSET_ERROR: - $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point on line'; - break; - default: - $error = 'Unable to parse line'; - } - - throw new InvalidArgumentException(sprintf('%s %d (%s).', $error, $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - - if ($isRef) - { - $this->refs[$isRef] = end($data); - } - } - - if (isset($mbEncoding)) - { - mb_internal_encoding($mbEncoding); - } - - return empty($data) ? null : $data; - } - - /** - * Returns the current line number (takes the offset into account). - * - * @return integer The current line number - */ - protected function getRealCurrentLineNb() - { - return $this->currentLineNb + $this->offset; - } - - /** - * Returns the current line indentation. - * - * @return integer The current line indentation - */ - protected function getCurrentLineIndentation() - { - return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' ')); - } - - /** - * Returns the next embed block of YAML. - * - * @param integer $indentation The indent level at which the block is to be read, or null for default - * - * @return string A YAML string - */ - protected function getNextEmbedBlock($indentation = null) - { - $this->moveToNextLine(); - - if (null === $indentation) - { - $newIndent = $this->getCurrentLineIndentation(); - - if (!$this->isCurrentLineEmpty() && 0 == $newIndent) - { - throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - } - else - { - $newIndent = $indentation; - } - - $data = array(substr($this->currentLine, $newIndent)); - - while ($this->moveToNextLine()) - { - if ($this->isCurrentLineEmpty()) - { - if ($this->isCurrentLineBlank()) - { - $data[] = substr($this->currentLine, $newIndent); - } - - continue; - } - - $indent = $this->getCurrentLineIndentation(); - - if (preg_match('#^(?P *)$#', $this->currentLine, $match)) - { - // empty line - $data[] = $match['text']; - } - else if ($indent >= $newIndent) - { - $data[] = substr($this->currentLine, $newIndent); - } - else if (0 == $indent) - { - $this->moveToPreviousLine(); - - break; - } - else - { - throw new InvalidArgumentException(sprintf('Indentation problem at line %d (%s)', $this->getRealCurrentLineNb() + 1, $this->currentLine)); - } - } - - return implode("\n", $data); - } - - /** - * Moves the parser to the next line. - */ - protected function moveToNextLine() - { - if ($this->currentLineNb >= count($this->lines) - 1) - { - return false; - } - - $this->currentLine = $this->lines[++$this->currentLineNb]; - - return true; - } - - /** - * Moves the parser to the previous line. - */ - protected function moveToPreviousLine() - { - $this->currentLine = $this->lines[--$this->currentLineNb]; - } - - /** - * Parses a YAML value. - * - * @param string $value A YAML value - * - * @return mixed A PHP value - */ - protected function parseValue($value) - { - if ('*' === substr($value, 0, 1)) - { - if (false !== $pos = strpos($value, '#')) - { - $value = substr($value, 1, $pos - 2); - } - else - { - $value = substr($value, 1); - } - - if (!array_key_exists($value, $this->refs)) - { - throw new InvalidArgumentException(sprintf('Reference "%s" does not exist (%s).', $value, $this->currentLine)); - } - return $this->refs[$value]; - } - - if (preg_match('/^(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?$/', $value, $matches)) - { - $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; - - return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers))); - } - else - { - return sfYamlInline::load($value); - } - } - - /** - * Parses a folded scalar. - * - * @param string $separator The separator that was used to begin this folded scalar (| or >) - * @param string $indicator The indicator that was used to begin this folded scalar (+ or -) - * @param integer $indentation The indentation that was used to begin this folded scalar - * - * @return string The text value - */ - protected function parseFoldedScalar($separator, $indicator = '', $indentation = 0) - { - $separator = '|' == $separator ? "\n" : ' '; - $text = ''; - - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineBlank()) - { - $text .= "\n"; - - $notEOF = $this->moveToNextLine(); - } - - if (!$notEOF) - { - return ''; - } - - if (!preg_match('#^(?P'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P.*)$#', $this->currentLine, $matches)) - { - $this->moveToPreviousLine(); - - return ''; - } - - $textIndent = $matches['indent']; - $previousIndent = 0; - - $text .= $matches['text'].$separator; - while ($this->currentLineNb + 1 < count($this->lines)) - { - $this->moveToNextLine(); - - if (preg_match('#^(?P {'.strlen($textIndent).',})(?P.+)$#', $this->currentLine, $matches)) - { - if (' ' == $separator && $previousIndent != $matches['indent']) - { - $text = substr($text, 0, -1)."\n"; - } - $previousIndent = $matches['indent']; - - $text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator); - } - else if (preg_match('#^(?P *)$#', $this->currentLine, $matches)) - { - $text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n"; - } - else - { - $this->moveToPreviousLine(); - - break; - } - } - - if (' ' == $separator) - { - // replace last separator by a newline - $text = preg_replace('/ (\n*)$/', "\n$1", $text); - } - - switch ($indicator) - { - case '': - $text = preg_replace('#\n+$#s', "\n", $text); - break; - case '+': - break; - case '-': - $text = preg_replace('#\n+$#s', '', $text); - break; - } - - return $text; - } - - /** - * Returns true if the next line is indented. - * - * @return Boolean Returns true if the next line is indented, false otherwise - */ - protected function isNextLineIndented() - { - $currentIndentation = $this->getCurrentLineIndentation(); - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineEmpty()) - { - $notEOF = $this->moveToNextLine(); - } - - if (false === $notEOF) - { - return false; - } - - $ret = false; - if ($this->getCurrentLineIndentation() <= $currentIndentation) - { - $ret = true; - } - - $this->moveToPreviousLine(); - - return $ret; - } - - /** - * Returns true if the current line is blank or if it is a comment line. - * - * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise - */ - protected function isCurrentLineEmpty() - { - return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); - } - - /** - * Returns true if the current line is blank. - * - * @return Boolean Returns true if the current line is blank, false otherwise - */ - protected function isCurrentLineBlank() - { - return '' == trim($this->currentLine, ' '); - } - - /** - * Returns true if the current line is a comment line. - * - * @return Boolean Returns true if the current line is a comment line, false otherwise - */ - protected function isCurrentLineComment() - { - //checking explicitly the first char of the trim is faster than loops or strpos - $ltrimmedLine = ltrim($this->currentLine, ' '); - return $ltrimmedLine[0] === '#'; - } - - /** - * Cleanups a YAML string to be parsed. - * - * @param string $value The input YAML string - * - * @return string A cleaned up YAML string - */ - protected function cleanup($value) - { - $value = str_replace(array("\r\n", "\r"), "\n", $value); - - if (!preg_match("#\n$#", $value)) - { - $value .= "\n"; - } - - // strip YAML header - $count = 0; - $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#s', '', $value, -1, $count); - $this->offset += $count; - - // remove leading comments and/or --- - $trimmedValue = preg_replace('#^((\#.*?\n)|(\-\-\-.*?\n))*#s', '', $value, -1, $count); - if ($count == 1) - { - // items have been removed, update the offset - $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); - $value = $trimmedValue; - } - - return $value; - } -} diff --git a/3rdparty/aws-sdk/sdk.class.php b/3rdparty/aws-sdk/sdk.class.php deleted file mode 100755 index 8dcb7bf252..0000000000 --- a/3rdparty/aws-sdk/sdk.class.php +++ /dev/null @@ -1,1435 +0,0 @@ -). - */ - public $utilities_class = 'CFUtilities'; - - /** - * The default class to use for HTTP requests (defaults to ). - */ - public $request_class = 'CFRequest'; - - /** - * The default class to use for HTTP responses (defaults to ). - */ - public $response_class = 'CFResponse'; - - /** - * The default class to use for parsing XML (defaults to ). - */ - public $parser_class = 'CFSimpleXML'; - - /** - * The default class to use for handling batch requests (defaults to ). - */ - public $batch_class = 'CFBatchRequest'; - - /** - * The state of SSL/HTTPS use. - */ - public $use_ssl = true; - - /** - * The state of SSL certificate verification. - */ - public $ssl_verification = true; - - /** - * The proxy to use for connecting. - */ - public $proxy = null; - - /** - * The alternate hostname to use, if any. - */ - public $hostname = null; - - /** - * The state of the capability to override the hostname with . - */ - public $override_hostname = true; - - /** - * The alternate port number to use, if any. - */ - public $port_number = null; - - /** - * The alternate resource prefix to use, if any. - */ - public $resource_prefix = null; - - /** - * The state of cache flow usage. - */ - public $use_cache_flow = false; - - /** - * The caching class to use. - */ - public $cache_class = null; - - /** - * The caching location to use. - */ - public $cache_location = null; - - /** - * When the cache should be considered stale. - */ - public $cache_expires = null; - - /** - * The state of cache compression. - */ - public $cache_compress = null; - - /** - * The current instantiated cache object. - */ - public $cache_object = null; - - /** - * The current instantiated batch request object. - */ - public $batch_object = null; - - /** - * The internally instantiated batch request object. - */ - public $internal_batch_object = null; - - /** - * The state of batch flow usage. - */ - public $use_batch_flow = false; - - /** - * The state of the cache deletion setting. - */ - public $delete_cache = false; - - /** - * The state of the debug mode setting. - */ - public $debug_mode = false; - - /** - * The number of times to retry failed requests. - */ - public $max_retries = 3; - - /** - * The user-defined callback function to call when a stream is read from. - */ - public $registered_streaming_read_callback = null; - - /** - * The user-defined callback function to call when a stream is written to. - */ - public $registered_streaming_write_callback = null; - - /** - * The credentials to use for authentication. - */ - public $credentials = array(); - - /** - * The authentication class to use. - */ - public $auth_class = null; - - /** - * The operation to execute. - */ - public $operation = null; - - /** - * The payload to send. - */ - public $payload = array(); - - /** - * The string prefix to prepend to the operation name. - */ - public $operation_prefix = ''; - - /** - * The number of times a request has been retried. - */ - public $redirects = 0; - - /** - * The state of whether the response should be parsed or not. - */ - public $parse_the_response = true; - - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * The constructor. This class should not be instantiated directly. Rather, a service-specific class - * should be instantiated. - * - * @param array $options (Optional) An associative array of parameters that can have the following keys:
      - *
    • certificate_authority - boolean - Optional - Determines which Cerificate Authority file to use. A value of boolean false will use the Certificate Authority file available on the system. A value of boolean true will use the Certificate Authority provided by the SDK. Passing a file system path to a Certificate Authority file (chmodded to 0755) will use that. Leave this set to false if you're not sure.
    • - *
    • credentials - string - Optional - The name of the credential set to use for authentication.
    • - *
    • default_cache_config - string - Optional - This option allows a preferred storage type to be configured for long-term caching. This can be changed later using the method. Valid values are: apc, xcache, or a file system path such as ./cache or /tmp/cache/.
    • - *
    • key - string - Optional - Your AWS key, or a session key. If blank, the default credential set will be used.
    • - *
    • secret - string - Optional - Your AWS secret key, or a session secret key. If blank, the default credential set will be used.
    • - *
    • token - string - Optional - An AWS session token.
    - * @return void - */ - public function __construct(array $options = array()) - { - // Instantiate the utilities class. - $this->util = new $this->utilities_class(); - - // Determine the current service. - $this->service = get_class($this); - - // Create credentials based on the options - $instance_credentials = new CFCredential($options); - - // Retreive a credential set from config.inc.php if it exists - if (isset($options['credentials'])) - { - // Use a specific credential set and merge with the instance credentials - $this->credentials = CFCredentials::get($options['credentials']) - ->merge($instance_credentials); - } - else - { - try - { - // Use the default credential set and merge with the instance credentials - $this->credentials = CFCredentials::get(CFCredentials::DEFAULT_KEY) - ->merge($instance_credentials); - } - catch (CFCredentials_Exception $e) - { - if (isset($options['key']) && isset($options['secret'])) - { - // Only the instance credentials were provided - $this->credentials = $instance_credentials; - } - else - { - // No credentials provided in the config file or constructor - throw new CFCredentials_Exception('No credentials were provided to ' . $this->service . '.'); - } - } - } - - // Set internal credentials after they are resolved - $this->key = $this->credentials->key; - $this->secret_key = $this->credentials->secret; - $this->auth_token = $this->credentials->token; - - // Automatically enable whichever caching mechanism is set to default. - $this->set_cache_config($this->credentials->default_cache_config); - } - - /** - * Alternate approach to constructing a new instance. Supports chaining. - * - * @param array $options (Optional) An associative array of parameters that can have the following keys:
      - *
    • certificate_authority - boolean - Optional - Determines which Cerificate Authority file to use. A value of boolean false will use the Certificate Authority file available on the system. A value of boolean true will use the Certificate Authority provided by the SDK. Passing a file system path to a Certificate Authority file (chmodded to 0755) will use that. Leave this set to false if you're not sure.
    • - *
    • credentials - string - Optional - The name of the credential set to use for authentication.
    • - *
    • default_cache_config - string - Optional - This option allows a preferred storage type to be configured for long-term caching. This can be changed later using the method. Valid values are: apc, xcache, or a file system path such as ./cache or /tmp/cache/.
    • - *
    • key - string - Optional - Your AWS key, or a session key. If blank, the default credential set will be used.
    • - *
    • secret - string - Optional - Your AWS secret key, or a session secret key. If blank, the default credential set will be used.
    • - *
    • token - string - Optional - An AWS session token.
    - * @return void - */ - public static function factory(array $options = array()) - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) - { - throw new Exception('PHP 5.3 or newer is required to instantiate a new class with CLASS::factory().'); - } - - $self = get_called_class(); - return new $self($options); - } - - - /*%******************************************************************************************%*/ - // MAGIC METHODS - - /** - * A magic method that allows `camelCase` method names to be translated into `snake_case` names. - * - * @param string $name (Required) The name of the method. - * @param array $arguments (Required) The arguments passed to the method. - * @return mixed The results of the intended method. - */ - public function __call($name, $arguments) - { - // Convert camelCase method calls to snake_case. - $method_name = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $name)); - - if (method_exists($this, $method_name)) - { - return call_user_func_array(array($this, $method_name), $arguments); - } - - throw new CFRuntime_Exception('The method ' . $name . '() is undefined. Attempted to map to ' . $method_name . '() which is also undefined. Error occurred'); - } - - - /*%******************************************************************************************%*/ - // SET CUSTOM SETTINGS - - /** - * Set the proxy settings to use. - * - * @param string $proxy (Required) Accepts proxy credentials in the following format: `proxy://user:pass@hostname:port` - * @return $this A reference to the current instance. - */ - public function set_proxy($proxy) - { - $this->proxy = $proxy; - return $this; - } - - /** - * Set the hostname to connect to. This is useful for alternate services that are API-compatible with - * AWS, but run from a different hostname. - * - * @param string $hostname (Required) The alternate hostname to use in place of the default one. Useful for mock or test applications living on different hostnames. - * @param integer $port_number (Optional) The alternate port number to use in place of the default one. Useful for mock or test applications living on different port numbers. - * @return $this A reference to the current instance. - */ - public function set_hostname($hostname, $port_number = null) - { - if ($this->override_hostname) - { - $this->hostname = $hostname; - - if ($port_number) - { - $this->port_number = $port_number; - $this->hostname .= ':' . (string) $this->port_number; - } - } - - return $this; - } - - /** - * Set the resource prefix to use. This method is useful for alternate services that are API-compatible - * with AWS. - * - * @param string $prefix (Required) An alternate prefix to prepend to the resource path. Useful for mock or test applications. - * @return $this A reference to the current instance. - */ - public function set_resource_prefix($prefix) - { - $this->resource_prefix = $prefix; - return $this; - } - - /** - * Disables any subsequent use of the method. - * - * @param boolean $override (Optional) Whether or not subsequent calls to should be obeyed. A `false` value disables the further effectiveness of . Defaults to `true`. - * @return $this A reference to the current instance. - */ - public function allow_hostname_override($override = true) - { - $this->override_hostname = $override; - return $this; - } - - /** - * Disables SSL/HTTPS connections for hosts that don't support them. Some services, however, still - * require SSL support. - * - * This method will throw a user warning when invoked, which can be hidden by changing your - * settings. - * - * @return $this A reference to the current instance. - */ - public function disable_ssl() - { - trigger_error('Disabling SSL connections is potentially unsafe and highly discouraged.', E_USER_WARNING); - $this->use_ssl = false; - return $this; - } - - /** - * Disables the verification of the SSL Certificate Authority. Doing so can enable an attacker to carry - * out a man-in-the-middle attack. - * - * https://secure.wikimedia.org/wikipedia/en/wiki/Man-in-the-middle_attack - * - * This method will throw a user warning when invoked, which can be hidden by changing your - * settings. - * - * @return $this A reference to the current instance. - */ - public function disable_ssl_verification($ssl_verification = false) - { - trigger_error('Disabling the verification of SSL certificates can lead to man-in-the-middle attacks. It is potentially unsafe and highly discouraged.', E_USER_WARNING); - $this->ssl_verification = $ssl_verification; - return $this; - } - - /** - * Enables HTTP request/response header logging to `STDERR`. - * - * @param boolean $enabled (Optional) Whether or not to enable debug mode. Defaults to `true`. - * @return $this A reference to the current instance. - */ - public function enable_debug_mode($enabled = true) - { - $this->debug_mode = $enabled; - return $this; - } - - /** - * Sets the maximum number of times to retry failed requests. - * - * @param integer $retries (Optional) The maximum number of times to retry failed requests. Defaults to `3`. - * @return $this A reference to the current instance. - */ - public function set_max_retries($retries = 3) - { - $this->max_retries = $retries; - return $this; - } - - /** - * Set the caching configuration to use for response caching. - * - * @param string $location (Required)

    The location to store the cache object in. This may vary by cache method.

    • File - The local file system paths such as ./cache (relative) or /tmp/cache/ (absolute). The location must be server-writable.
    • APC - Pass in apc to use this lightweight cache. You must have the APC extension installed.
    • XCache - Pass in xcache to use this lightweight cache. You must have the XCache extension installed.
    • Memcached - Pass in an indexed array of associative arrays. Each associative array should have a host and a port value representing a Memcached server to connect to.
    • PDO - A URL-style string (e.g. pdo.mysql://user:pass@localhost/cache) or a standard DSN-style string (e.g. pdo.sqlite:/sqlite/cache.db). MUST be prefixed with pdo.. See CachePDO and PDO for more details.
    - * @param boolean $gzip (Optional) Whether or not data should be gzipped before being stored. A value of `true` will compress the contents before caching them. A value of `false` will leave the contents uncompressed. Defaults to `true`. - * @return $this A reference to the current instance. - */ - public function set_cache_config($location, $gzip = true) - { - // If we have an array, we're probably passing in Memcached servers and ports. - if (is_array($location)) - { - $this->cache_class = 'CacheMC'; - } - else - { - // I would expect locations like `/tmp/cache`, `pdo.mysql://user:pass@hostname:port`, `pdo.sqlite:memory:`, and `apc`. - $type = strtolower(substr($location, 0, 3)); - switch ($type) - { - case 'apc': - $this->cache_class = 'CacheAPC'; - break; - - case 'xca': // First three letters of `xcache` - $this->cache_class = 'CacheXCache'; - break; - - case 'pdo': - $this->cache_class = 'CachePDO'; - $location = substr($location, 4); - break; - - default: - $this->cache_class = 'CacheFile'; - break; - } - } - - // Set the remaining cache information. - $this->cache_location = $location; - $this->cache_compress = $gzip; - - return $this; - } - - /** - * Register a callback function to execute whenever a data stream is read from using - * . - * - * The user-defined callback function should accept three arguments: - * - *
      - *
    • $curl_handle - resource - Required - The cURL handle resource that represents the in-progress transfer.
    • - *
    • $file_handle - resource - Required - The file handle resource that represents the file on the local file system.
    • - *
    • $length - integer - Required - The length in kilobytes of the data chunk that was transferred.
    • - *
    - * - * @param string|array|function $callback (Required) The callback function is called by , so you can pass the following values:
      - *
    • The name of a global function to execute, passed as a string.
    • - *
    • A method to execute, passed as array('ClassName', 'MethodName').
    • - *
    • An anonymous function (PHP 5.3+).
    - * @return $this A reference to the current instance. - */ - public function register_streaming_read_callback($callback) - { - $this->registered_streaming_read_callback = $callback; - return $this; - } - - /** - * Register a callback function to execute whenever a data stream is written to using - * . - * - * The user-defined callback function should accept two arguments: - * - *
      - *
    • $curl_handle - resource - Required - The cURL handle resource that represents the in-progress transfer.
    • - *
    • $length - integer - Required - The length in kilobytes of the data chunk that was transferred.
    • - *
    - * - * @param string|array|function $callback (Required) The callback function is called by , so you can pass the following values:
      - *
    • The name of a global function to execute, passed as a string.
    • - *
    • A method to execute, passed as array('ClassName', 'MethodName').
    • - *
    • An anonymous function (PHP 5.3+).
    - * @return $this A reference to the current instance. - */ - public function register_streaming_write_callback($callback) - { - $this->registered_streaming_write_callback = $callback; - return $this; - } - - /** - * Fetches and caches STS credentials. This is meant to be used by the constructor, and is not to be - * manually invoked. - * - * @param CacheCore $cache (Required) The a reference to the cache object that is being used to handle the caching. - * @param array $options (Required) The options that were passed into the constructor. - * @return mixed The data to be cached, or NULL. - */ - public function cache_sts_credentials($cache, $options) - { - $token = new AmazonSTS($options); - $response = $token->get_session_token(); - - if ($response->isOK()) - { - // Update the expiration - $expiration_time = strtotime((string) $response->body->GetSessionTokenResult->Credentials->Expiration); - $expiration_duration = round(($expiration_time - time()) * 0.85); - $cache->expire_in($expiration_duration); - - // Return the important data - return array( - 'key' => (string) $response->body->GetSessionTokenResult->Credentials->AccessKeyId, - 'secret' => (string) $response->body->GetSessionTokenResult->Credentials->SecretAccessKey, - 'token' => (string) $response->body->GetSessionTokenResult->Credentials->SessionToken, - 'expires' => (string) $response->body->GetSessionTokenResult->Credentials->Expiration, - ); - } - - return null; - } - - - /*%******************************************************************************************%*/ - // SET CUSTOM CLASSES - - /** - * Set a custom class for this functionality. Use this method when extending/overriding existing classes - * with new functionality. - * - * The replacement class must extend from . - * - * @param string $class (Optional) The name of the new class to use for this functionality. - * @return $this A reference to the current instance. - */ - public function set_utilities_class($class = 'CFUtilities') - { - $this->utilities_class = $class; - $this->util = new $this->utilities_class(); - return $this; - } - - /** - * Set a custom class for this functionality. Use this method when extending/overriding existing classes - * with new functionality. - * - * The replacement class must extend from . - * - * @param string $class (Optional) The name of the new class to use for this functionality. - * @param $this A reference to the current instance. - */ - public function set_request_class($class = 'CFRequest') - { - $this->request_class = $class; - return $this; - } - - /** - * Set a custom class for this functionality. Use this method when extending/overriding existing classes - * with new functionality. - * - * The replacement class must extend from . - * - * @param string $class (Optional) The name of the new class to use for this functionality. - * @return $this A reference to the current instance. - */ - public function set_response_class($class = 'CFResponse') - { - $this->response_class = $class; - return $this; - } - - /** - * Set a custom class for this functionality. Use this method when extending/overriding existing classes - * with new functionality. - * - * The replacement class must extend from . - * - * @param string $class (Optional) The name of the new class to use for this functionality. - * @return $this A reference to the current instance. - */ - public function set_parser_class($class = 'CFSimpleXML') - { - $this->parser_class = $class; - return $this; - } - - /** - * Set a custom class for this functionality. Use this method when extending/overriding existing classes - * with new functionality. - * - * The replacement class must extend from . - * - * @param string $class (Optional) The name of the new class to use for this functionality. - * @return $this A reference to the current instance. - */ - public function set_batch_class($class = 'CFBatchRequest') - { - $this->batch_class = $class; - return $this; - } - - - /*%******************************************************************************************%*/ - // AUTHENTICATION - - /** - * Default, shared method for authenticating a connection to AWS. - * - * @param string $operation (Required) Indicates the operation to perform. - * @param array $payload (Required) An associative array of parameters for authenticating. See the individual methods for allowed keys. - * @return CFResponse Object containing a parsed HTTP response. - */ - public function authenticate($operation, $payload) - { - $original_payload = $payload; - $method_arguments = func_get_args(); - $curlopts = array(); - $return_curl_handle = false; - - if (substr($operation, 0, strlen($this->operation_prefix)) !== $this->operation_prefix) - { - $operation = $this->operation_prefix . $operation; - } - - // Extract the custom CURLOPT settings from the payload - if (is_array($payload) && isset($payload['curlopts'])) - { - $curlopts = $payload['curlopts']; - unset($payload['curlopts']); - } - - // Determine whether the response or curl handle should be returned - if (is_array($payload) && isset($payload['returnCurlHandle'])) - { - $return_curl_handle = isset($payload['returnCurlHandle']) ? $payload['returnCurlHandle'] : false; - unset($payload['returnCurlHandle']); - } - - // Use the caching flow to determine if we need to do a round-trip to the server. - if ($this->use_cache_flow) - { - // Generate an identifier specific to this particular set of arguments. - $cache_id = $this->key . '_' . get_class($this) . '_' . $operation . '_' . sha1(serialize($method_arguments)); - - // Instantiate the appropriate caching object. - $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress); - - if ($this->delete_cache) - { - $this->use_cache_flow = false; - $this->delete_cache = false; - return $this->cache_object->delete(); - } - - // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request. - $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments); - - // Parse the XML body - $data = $this->parse_callback($data); - - // End! - return $data; - } - - /*%******************************************************************************************%*/ - - // Signer - $signer = new $this->auth_class($this->hostname, $operation, $payload, $this->credentials); - $signer->key = $this->key; - $signer->secret_key = $this->secret_key; - $signer->auth_token = $this->auth_token; - $signer->api_version = $this->api_version; - $signer->utilities_class = $this->utilities_class; - $signer->request_class = $this->request_class; - $signer->response_class = $this->response_class; - $signer->use_ssl = $this->use_ssl; - $signer->proxy = $this->proxy; - $signer->util = $this->util; - $signer->registered_streaming_read_callback = $this->registered_streaming_read_callback; - $signer->registered_streaming_write_callback = $this->registered_streaming_write_callback; - $request = $signer->authenticate(); - - // Update RequestCore settings - $request->request_class = $this->request_class; - $request->response_class = $this->response_class; - $request->ssl_verification = $this->ssl_verification; - - /*%******************************************************************************************%*/ - - // Debug mode - if ($this->debug_mode) - { - $request->debug_mode = $this->debug_mode; - } - - // Set custom CURLOPT settings - if (count($curlopts)) - { - $request->set_curlopts($curlopts); - } - - // Manage the (newer) batch request API or the (older) returnCurlHandle setting. - if ($this->use_batch_flow) - { - $handle = $request->prep_request(); - $this->batch_object->add($handle); - $this->use_batch_flow = false; - - return $handle; - } - elseif ($return_curl_handle) - { - return $request->prep_request(); - } - - // Send! - $request->send_request(); - - // Prepare the response. - $headers = $request->get_response_header(); - $headers['x-aws-stringtosign'] = $signer->string_to_sign; - - if (isset($signer->canonical_request)) - { - $headers['x-aws-canonicalrequest'] = $signer->canonical_request; - } - - $headers['x-aws-request-headers'] = $request->request_headers; - $headers['x-aws-body'] = $signer->querystring; - - $data = new $this->response_class($headers, ($this->parse_the_response === true) ? $this->parse_callback($request->get_response_body()) : $request->get_response_body(), $request->get_response_code()); - - // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries. - if ( - (integer) $request->get_response_code() === 500 || // Internal Error (presumably transient) - (integer) $request->get_response_code() === 503) // Service Unavailable (presumably transient) - { - if ($this->redirects <= $this->max_retries) - { - // Exponential backoff - $delay = (integer) (pow(4, $this->redirects) * 100000); - usleep($delay); - $this->redirects++; - $data = $this->authenticate($operation, $original_payload); - } - } - - // DynamoDB has custom logic - elseif ( - (integer) $request->get_response_code() === 400 && - stripos((string) $request->get_response_body(), 'com.amazonaws.dynamodb.') !== false && ( - stripos((string) $request->get_response_body(), 'ProvisionedThroughputExceededException') !== false - ) - ) - { - if ($this->redirects === 0) - { - $this->redirects++; - $data = $this->authenticate($operation, $original_payload); - } - elseif ($this->redirects <= max($this->max_retries, 10)) - { - // Exponential backoff - $delay = (integer) (pow(2, ($this->redirects - 1)) * 50000); - usleep($delay); - $this->redirects++; - $data = $this->authenticate($operation, $original_payload); - } - } - - $this->redirects = 0; - return $data; - } - - - /*%******************************************************************************************%*/ - // BATCH REQUEST LAYER - - /** - * Specifies that the intended request should be queued for a later batch request. - * - * @param CFBatchRequest $queue (Optional) The instance to use for managing batch requests. If not available, it generates a new instance of . - * @return $this A reference to the current instance. - */ - public function batch(CFBatchRequest &$queue = null) - { - if ($queue) - { - $this->batch_object = $queue; - } - elseif ($this->internal_batch_object) - { - $this->batch_object = &$this->internal_batch_object; - } - else - { - $this->internal_batch_object = new $this->batch_class(); - $this->batch_object = &$this->internal_batch_object; - } - - $this->use_batch_flow = true; - - return $this; - } - - /** - * Executes the batch request queue by sending all queued requests. - * - * @param boolean $clear_after_send (Optional) Whether or not to clear the batch queue after sending a request. Defaults to `true`. Set this to `false` if you are caching batch responses and want to retrieve results later. - * @return array An array of objects. - */ - public function send($clear_after_send = true) - { - if ($this->use_batch_flow) - { - // When we send the request, disable batch flow. - $this->use_batch_flow = false; - - // If we're not caching, simply send the request. - if (!$this->use_cache_flow) - { - $response = $this->batch_object->send(); - $parsed_data = array_map(array($this, 'parse_callback'), $response); - $parsed_data = new CFArray($parsed_data); - - // Clear the queue - if ($clear_after_send) - { - $this->batch_object->queue = array(); - } - - return $parsed_data; - } - - // Generate an identifier specific to this particular set of arguments. - $cache_id = $this->key . '_' . get_class($this) . '_' . sha1(serialize($this->batch_object)); - - // Instantiate the appropriate caching object. - $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress); - - if ($this->delete_cache) - { - $this->use_cache_flow = false; - $this->delete_cache = false; - return $this->cache_object->delete(); - } - - // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request. - $data_set = $this->cache_object->response_manager(array($this, 'cache_callback_batch'), array($this->batch_object)); - $parsed_data = array_map(array($this, 'parse_callback'), $data_set); - $parsed_data = new CFArray($parsed_data); - - // Clear the queue - if ($clear_after_send) - { - $this->batch_object->queue = array(); - } - - // End! - return $parsed_data; - } - - // Load the class - $null = new CFBatchRequest(); - unset($null); - - throw new CFBatchRequest_Exception('You must use $object->batch()->send()'); - } - - /** - * Parses a response body into a PHP object if appropriate. - * - * @param CFResponse|string $response (Required) The object to parse, or an XML string that would otherwise be a response body. - * @param string $content_type (Optional) The content-type to use when determining how to parse the content. - * @return CFResponse|string A parsed object, or parsed XML. - */ - public function parse_callback($response, $headers = null) - { - // Bail out - if (!$this->parse_the_response) return $response; - - // Shorten this so we have a (mostly) single code path - if (isset($response->body)) - { - if (is_string($response->body)) - { - $body = $response->body; - } - else - { - return $response; - } - } - elseif (is_string($response)) - { - $body = $response; - } - else - { - return $response; - } - - // Decompress gzipped content - if (isset($headers['content-encoding'])) - { - switch (strtolower(trim($headers['content-encoding'], "\x09\x0A\x0D\x20"))) - { - case 'gzip': - case 'x-gzip': - $decoder = new CFGzipDecode($body); - if ($decoder->parse()) - { - $body = $decoder->data; - } - break; - - case 'deflate': - if (($uncompressed = gzuncompress($body)) !== false) - { - $body = $uncompressed; - } - elseif (($uncompressed = gzinflate($body)) !== false) - { - $body = $uncompressed; - } - break; - } - } - - // Look for XML cues - if ( - (isset($headers['content-type']) && ($headers['content-type'] === 'text/xml' || $headers['content-type'] === 'application/xml')) || // We know it's XML - (!isset($headers['content-type']) && (stripos($body, '') === 0) || preg_match('/^<(\w*) xmlns="http(s?):\/\/(\w*).amazon(aws)?.com/im', $body)) // Sniff for XML - ) - { - // Strip the default XML namespace to simplify XPath expressions - $body = str_replace("xmlns=", "ns=", $body); - - try { - // Parse the XML body - $body = new $this->parser_class($body); - } - catch (Exception $e) - { - throw new Parser_Exception($e->getMessage()); - } - } - // Look for JSON cues - elseif ( - (isset($headers['content-type']) && ($headers['content-type'] === 'application/json') || $headers['content-type'] === 'application/x-amz-json-1.0') || // We know it's JSON - (!isset($headers['content-type']) && $this->util->is_json($body)) // Sniff for JSON - ) - { - // Normalize JSON to a CFSimpleXML object - $body = CFJSON::to_xml($body, $this->parser_class); - } - - // Put the parsed data back where it goes - if (isset($response->body)) - { - $response->body = $body; - } - else - { - $response = $body; - } - - return $response; - } - - - /*%******************************************************************************************%*/ - // CACHING LAYER - - /** - * Specifies that the resulting object should be cached according to the settings from - * . - * - * @param string|integer $expires (Required) The time the cache is to expire. Accepts a number of seconds as an integer, or an amount of time, as a string, that is understood by (e.g. "1 hour"). - * @param $this A reference to the current instance. - * @return $this - */ - public function cache($expires) - { - // Die if they haven't used set_cache_config(). - if (!$this->cache_class) - { - throw new CFRuntime_Exception('Must call set_cache_config() before using cache()'); - } - - if (is_string($expires)) - { - $expires = strtotime($expires); - $this->cache_expires = $expires - time(); - } - elseif (is_int($expires)) - { - $this->cache_expires = $expires; - } - - $this->use_cache_flow = true; - - return $this; - } - - /** - * The callback function that is executed when the cache doesn't exist or has expired. The response of - * this method is cached. Accepts identical parameters as the method. Never call this - * method directly -- it is used internally by the caching system. - * - * @param string $operation (Required) Indicates the operation to perform. - * @param array $payload (Required) An associative array of parameters for authenticating. See the individual methods for allowed keys. - * @return CFResponse A parsed HTTP response. - */ - public function cache_callback($operation, $payload) - { - // Disable the cache flow since it's already been handled. - $this->use_cache_flow = false; - - // Make the request - $response = $this->authenticate($operation, $payload); - - // If this is an XML document, convert it back to a string. - if (isset($response->body) && ($response->body instanceof SimpleXMLElement)) - { - $response->body = $response->body->asXML(); - } - - return $response; - } - - /** - * Used for caching the results of a batch request. Never call this method directly; it is used - * internally by the caching system. - * - * @param CFBatchRequest $batch (Required) The batch request object to send. - * @return CFResponse A parsed HTTP response. - */ - public function cache_callback_batch(CFBatchRequest $batch) - { - return $batch->send(); - } - - /** - * Deletes a cached object using the specified cache storage type. - * - * @return boolean A value of `true` if cached object exists and is successfully deleted, otherwise `false`. - */ - public function delete_cache() - { - $this->use_cache_flow = true; - $this->delete_cache = true; - - return $this; - } -} - - -/** - * Contains the functionality for auto-loading service classes. - */ -class CFLoader -{ - /*%******************************************************************************************%*/ - // AUTO-LOADER - - /** - * Automatically load classes that aren't included. - * - * @param string $class (Required) The classname to load. - * @return boolean Whether or not the file was successfully loaded. - */ - public static function autoloader($class) - { - $path = dirname(__FILE__) . DIRECTORY_SEPARATOR; - - // Amazon SDK classes - if (strstr($class, 'Amazon')) - { - if (file_exists($require_this = $path . 'services' . DIRECTORY_SEPARATOR . str_ireplace('Amazon', '', strtolower($class)) . '.class.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Utility classes - elseif (strstr($class, 'CF')) - { - if (file_exists($require_this = $path . 'utilities' . DIRECTORY_SEPARATOR . str_ireplace('CF', '', strtolower($class)) . '.class.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load CacheCore - elseif (strstr($class, 'Cache')) - { - if (file_exists($require_this = $path . 'lib' . DIRECTORY_SEPARATOR . 'cachecore' . DIRECTORY_SEPARATOR . strtolower($class) . '.class.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load RequestCore - elseif (strstr($class, 'RequestCore') || strstr($class, 'ResponseCore')) - { - if (file_exists($require_this = $path . 'lib' . DIRECTORY_SEPARATOR . 'requestcore' . DIRECTORY_SEPARATOR . 'requestcore.class.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load array-to-domdocument - elseif (strstr($class, 'Array2DOM')) - { - if (file_exists($require_this = $path . 'lib' . DIRECTORY_SEPARATOR . 'dom' . DIRECTORY_SEPARATOR . 'ArrayToDOMDocument.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load Authentication Signers - elseif (strstr($class, 'Auth')) - { - if (file_exists($require_this = $path . 'authentication' . DIRECTORY_SEPARATOR . str_replace('auth', 'signature_', strtolower($class)) . '.class.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load Signer interface - elseif ($class === 'Signer') - { - if (!interface_exists('Signable', false) && - file_exists($require_this = $path . 'authentication' . DIRECTORY_SEPARATOR . 'signable.interface.php')) - { - require_once $require_this; - } - - if (file_exists($require_this = $path . 'authentication' . DIRECTORY_SEPARATOR . 'signer.abstract.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - // Load Symfony YAML classes - elseif (strstr($class, 'sfYaml')) - { - if (file_exists($require_this = $path . 'lib' . DIRECTORY_SEPARATOR . 'yaml' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'sfYaml.php')) - { - require_once $require_this; - return true; - } - - return false; - } - - return false; - } -} - -// Register the autoloader. -spl_autoload_register(array('CFLoader', 'autoloader')); - -// Don't look for any configuration files, the Amazon S3 storage backend handles configuration - -// /*%******************************************************************************************%*/ -// // CONFIGURATION -// -// // Look for include file in the same directory (e.g. `./config.inc.php`). -// if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php')) -// { -// include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc.php'; -// } -// // Fallback to `~/.aws/sdk/config.inc.php` -// else -// { -// if (!isset($_ENV['HOME']) && isset($_SERVER['HOME'])) -// { -// $_ENV['HOME'] = $_SERVER['HOME']; -// } -// elseif (!isset($_ENV['HOME']) && !isset($_SERVER['HOME'])) -// { -// $_ENV['HOME'] = `cd ~ && pwd`; -// if (!$_ENV['HOME']) -// { -// switch (strtolower(PHP_OS)) -// { -// case 'darwin': -// $_ENV['HOME'] = '/Users/' . get_current_user(); -// break; -// -// case 'windows': -// case 'winnt': -// case 'win32': -// $_ENV['HOME'] = 'c:' . DIRECTORY_SEPARATOR . 'Documents and Settings' . DIRECTORY_SEPARATOR . get_current_user(); -// break; -// -// default: -// $_ENV['HOME'] = '/home/' . get_current_user(); -// break; -// } -// } -// } -// -// if (getenv('HOME') && file_exists(getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php')) -// { -// include_once getenv('HOME') . DIRECTORY_SEPARATOR . '.aws' . DIRECTORY_SEPARATOR . 'sdk' . DIRECTORY_SEPARATOR . 'config.inc.php'; -// } -// } diff --git a/3rdparty/aws-sdk/services/s3.class.php b/3rdparty/aws-sdk/services/s3.class.php deleted file mode 100755 index 2e9e1cd52b..0000000000 --- a/3rdparty/aws-sdk/services/s3.class.php +++ /dev/null @@ -1,3979 +0,0 @@ - for more information. - * - * @version 2012.01.17 - * @license See the included NOTICE.md file for more information. - * @copyright See the included NOTICE.md file for more information. - * @link http://aws.amazon.com/s3/ Amazon Simple Storage Service - * @link http://aws.amazon.com/documentation/s3/ Amazon Simple Storage Service documentation - */ -class AmazonS3 extends CFRuntime -{ - /*%******************************************************************************************%*/ - // REGIONAL ENDPOINTS - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Region. - */ - const REGION_US_E1 = 's3.amazonaws.com'; - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Region. - */ - const REGION_VIRGINIA = self::REGION_US_E1; - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Region. - */ - const REGION_US_STANDARD = self::REGION_US_E1; - - /** - * Specify the queue URL for the US-West 1 (Northern California) Region. - */ - const REGION_US_W1 = 's3-us-west-1.amazonaws.com'; - - /** - * Specify the queue URL for the US-West 1 (Northern California) Region. - */ - const REGION_CALIFORNIA = self::REGION_US_W1; - - /** - * Specify the queue URL for the US-West 2 (Oregon) Region. - */ - const REGION_US_W2 = 's3-us-west-2.amazonaws.com'; - - /** - * Specify the queue URL for the US-West 2 (Oregon) Region. - */ - const REGION_OREGON = self::REGION_US_W2; - - /** - * Specify the queue URL for the EU (Ireland) Region. - */ - const REGION_EU_W1 = 's3-eu-west-1.amazonaws.com'; - - /** - * Specify the queue URL for the EU (Ireland) Region. - */ - const REGION_IRELAND = self::REGION_EU_W1; - - /** - * Specify the queue URL for the Asia Pacific (Singapore) Region. - */ - const REGION_APAC_SE1 = 's3-ap-southeast-1.amazonaws.com'; - - /** - * Specify the queue URL for the Asia Pacific (Singapore) Region. - */ - const REGION_SINGAPORE = self::REGION_APAC_SE1; - - /** - * Specify the queue URL for the Asia Pacific (Japan) Region. - */ - const REGION_APAC_NE1 = 's3-ap-northeast-1.amazonaws.com'; - - /** - * Specify the queue URL for the Asia Pacific (Japan) Region. - */ - const REGION_TOKYO = self::REGION_APAC_NE1; - - /** - * Specify the queue URL for the South America (Sao Paulo) Region. - */ - const REGION_SA_E1 = 's3-sa-east-1.amazonaws.com'; - - /** - * Specify the queue URL for the South America (Sao Paulo) Region. - */ - const REGION_SAO_PAULO = self::REGION_SA_E1; - - /** - * Specify the queue URL for the United States GovCloud Region. - */ - const REGION_US_GOV1 = 's3-us-gov-west-1.amazonaws.com'; - - /** - * Specify the queue URL for the United States GovCloud FIPS 140-2 Region. - */ - const REGION_US_GOV1_FIPS = 's3-fips-us-gov-west-1.amazonaws.com'; - - /** - * The default endpoint. - */ - const DEFAULT_URL = self::REGION_US_E1; - - - /*%******************************************************************************************%*/ - // REGIONAL WEBSITE ENDPOINTS - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Website Region. - */ - const REGION_US_E1_WEBSITE = 's3-website-us-east-1.amazonaws.com'; - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Website Region. - */ - const REGION_VIRGINIA_WEBSITE = self::REGION_US_E1_WEBSITE; - - /** - * Specify the queue URL for the US-Standard (Northern Virginia & Washington State) Website Region. - */ - const REGION_US_STANDARD_WEBSITE = self::REGION_US_E1_WEBSITE; - - /** - * Specify the queue URL for the US-West 1 (Northern California) Website Region. - */ - const REGION_US_W1_WEBSITE = 's3-website-us-west-1.amazonaws.com'; - - /** - * Specify the queue URL for the US-West 1 (Northern California) Website Region. - */ - const REGION_CALIFORNIA_WEBSITE = self::REGION_US_W1_WEBSITE; - - /** - * Specify the queue URL for the US-West 2 (Oregon) Website Region. - */ - const REGION_US_W2_WEBSITE = 's3-website-us-west-2.amazonaws.com'; - - /** - * Specify the queue URL for the US-West 2 (Oregon) Website Region. - */ - const REGION_OREGON_WEBSITE = self::REGION_US_W2_WEBSITE; - - /** - * Specify the queue URL for the EU (Ireland) Website Region. - */ - const REGION_EU_W1_WEBSITE = 's3-website-eu-west-1.amazonaws.com'; - - /** - * Specify the queue URL for the EU (Ireland) Website Region. - */ - const REGION_IRELAND_WEBSITE = self::REGION_EU_W1_WEBSITE; - - /** - * Specify the queue URL for the Asia Pacific (Singapore) Website Region. - */ - const REGION_APAC_SE1_WEBSITE = 's3-website-ap-southeast-1.amazonaws.com'; - - /** - * Specify the queue URL for the Asia Pacific (Singapore) Website Region. - */ - const REGION_SINGAPORE_WEBSITE = self::REGION_APAC_SE1_WEBSITE; - - /** - * Specify the queue URL for the Asia Pacific (Japan) Website Region. - */ - const REGION_APAC_NE1_WEBSITE = 's3-website-ap-northeast-1.amazonaws.com'; - - /** - * Specify the queue URL for the Asia Pacific (Japan) Website Region. - */ - const REGION_TOKYO_WEBSITE = self::REGION_APAC_NE1_WEBSITE; - - /** - * Specify the queue URL for the South America (Sao Paulo) Website Region. - */ - const REGION_SA_E1_WEBSITE = 's3-website-sa-east-1.amazonaws.com'; - - /** - * Specify the queue URL for the South America (Sao Paulo) Website Region. - */ - const REGION_SAO_PAULO_WEBSITE = self::REGION_SA_E1_WEBSITE; - - /** - * Specify the queue URL for the United States GovCloud Website Region. - */ - const REGION_US_GOV1_WEBSITE = 's3-website-us-gov-west-1.amazonaws.com'; - - - /*%******************************************************************************************%*/ - // ACL - - /** - * ACL: Owner-only read/write. - */ - const ACL_PRIVATE = 'private'; - - /** - * ACL: Owner read/write, public read. - */ - const ACL_PUBLIC = 'public-read'; - - /** - * ACL: Public read/write. - */ - const ACL_OPEN = 'public-read-write'; - - /** - * ACL: Owner read/write, authenticated read. - */ - const ACL_AUTH_READ = 'authenticated-read'; - - /** - * ACL: Bucket owner read. - */ - const ACL_OWNER_READ = 'bucket-owner-read'; - - /** - * ACL: Bucket owner full control. - */ - const ACL_OWNER_FULL_CONTROL = 'bucket-owner-full-control'; - - - /*%******************************************************************************************%*/ - // GRANTS - - /** - * When applied to a bucket, grants permission to list the bucket. When applied to an object, this - * grants permission to read the object data and/or metadata. - */ - const GRANT_READ = 'READ'; - - /** - * When applied to a bucket, grants permission to create, overwrite, and delete any object in the - * bucket. This permission is not supported for objects. - */ - const GRANT_WRITE = 'WRITE'; - - /** - * Grants permission to read the ACL for the applicable bucket or object. The owner of a bucket or - * object always has this permission implicitly. - */ - const GRANT_READ_ACP = 'READ_ACP'; - - /** - * Gives permission to overwrite the ACP for the applicable bucket or object. The owner of a bucket - * or object always has this permission implicitly. Granting this permission is equivalent to granting - * FULL_CONTROL because the grant recipient can make any changes to the ACP. - */ - const GRANT_WRITE_ACP = 'WRITE_ACP'; - - /** - * Provides READ, WRITE, READ_ACP, and WRITE_ACP permissions. It does not convey additional rights and - * is provided only for convenience. - */ - const GRANT_FULL_CONTROL = 'FULL_CONTROL'; - - - /*%******************************************************************************************%*/ - // USERS - - /** - * The "AuthenticatedUsers" group for access control policies. - */ - const USERS_AUTH = 'http://acs.amazonaws.com/groups/global/AuthenticatedUsers'; - - /** - * The "AllUsers" group for access control policies. - */ - const USERS_ALL = 'http://acs.amazonaws.com/groups/global/AllUsers'; - - /** - * The "LogDelivery" group for access control policies. - */ - const USERS_LOGGING = 'http://acs.amazonaws.com/groups/s3/LogDelivery'; - - - /*%******************************************************************************************%*/ - // PATTERNS - - /** - * PCRE: Match all items - */ - const PCRE_ALL = '/.*/i'; - - - /*%******************************************************************************************%*/ - // STORAGE - - /** - * Standard storage redundancy. - */ - const STORAGE_STANDARD = 'STANDARD'; - - /** - * Reduced storage redundancy. - */ - const STORAGE_REDUCED = 'REDUCED_REDUNDANCY'; - - - /*%******************************************************************************************%*/ - // PROPERTIES - - /** - * The request URL. - */ - public $request_url; - - /** - * The virtual host setting. - */ - public $vhost; - - /** - * The base XML elements to use for access control policy methods. - */ - public $base_acp_xml; - - /** - * The base XML elements to use for creating buckets in regions. - */ - public $base_location_constraint; - - /** - * The base XML elements to use for logging methods. - */ - public $base_logging_xml; - - /** - * The base XML elements to use for notifications. - */ - public $base_notification_xml; - - /** - * The base XML elements to use for versioning. - */ - public $base_versioning_xml; - - /** - * The base XML elements to use for completing a multipart upload. - */ - public $complete_mpu_xml; - - /** - * The base XML elements to use for website support. - */ - public $website_config_xml; - - /** - * The base XML elements to use for multi-object delete support. - */ - public $multi_object_delete_xml; - - /** - * The base XML elements to use for object expiration support. - */ - public $object_expiration_xml; - - /** - * The DNS vs. Path-style setting. - */ - public $path_style = false; - - /** - * The state of whether the prefix change is temporary or permanent. - */ - public $temporary_prefix = false; - - - /*%******************************************************************************************%*/ - // CONSTRUCTOR - - /** - * Constructs a new instance of . - * - * @param array $options (Optional) An associative array of parameters that can have the following keys:
      - *
    • certificate_authority - boolean - Optional - Determines which Cerificate Authority file to use. A value of boolean false will use the Certificate Authority file available on the system. A value of boolean true will use the Certificate Authority provided by the SDK. Passing a file system path to a Certificate Authority file (chmodded to 0755) will use that. Leave this set to false if you're not sure.
    • - *
    • credentials - string - Optional - The name of the credential set to use for authentication.
    • - *
    • default_cache_config - string - Optional - This option allows a preferred storage type to be configured for long-term caching. This can be changed later using the method. Valid values are: apc, xcache, or a file system path such as ./cache or /tmp/cache/.
    • - *
    • key - string - Optional - Your AWS key, or a session key. If blank, the default credential set will be used.
    • - *
    • secret - string - Optional - Your AWS secret key, or a session secret key. If blank, the default credential set will be used.
    • - *
    • token - string - Optional - An AWS session token.
    - * @return void - */ - public function __construct(array $options = array()) - { - $this->vhost = null; - $this->api_version = '2006-03-01'; - $this->hostname = self::DEFAULT_URL; - - $this->base_acp_xml = ''; - $this->base_location_constraint = ''; - $this->base_logging_xml = ''; - $this->base_notification_xml = ''; - $this->base_versioning_xml = ''; - $this->complete_mpu_xml = ''; - $this->website_config_xml = 'index.htmlerror.html'; - $this->multi_object_delete_xml = ''; - $this->object_expiration_xml = ''; - - parent::__construct($options); - } - - - /*%******************************************************************************************%*/ - // AUTHENTICATION - - /** - * Authenticates a connection to Amazon S3. Do not use directly unless implementing custom methods for - * this class. - * - * @param string $operation (Required) The name of the bucket to operate on (S3 Only). - * @param array $payload (Required) An associative array of parameters for authenticating. See inline comments for allowed keys. - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_Authentication.html REST authentication - */ - public function authenticate($operation, $payload) - { - /* - * Overriding or extending this class? You can pass the following "magic" keys into $opt. - * - * ## verb, resource, sub_resource and query_string ## - * /?& - * GET /filename.txt?versions&prefix=abc&max-items=1 - * - * ## versionId, uploadId, partNumber, response-* ## - * These don't follow the same rules as above, in that the they needs to be signed, while - * other query_string values do not. - * - * ## curlopts ## - * These values get passed directly to the cURL methods in RequestCore. - * - * ## fileUpload, fileDownload, seekTo ## - * These are slightly modified and then passed to the cURL methods in RequestCore. - * - * ## headers ## - * $opt['headers'] is an array, whose keys are HTTP headers to be sent. - * - * ## body ## - * This is the request body that is sent to the server via PUT/POST. - * - * ## preauth ## - * This is a hook that tells authenticate() to generate a pre-authenticated URL. - * - * ## returnCurlHandle ## - * Tells authenticate() to return the cURL handle for the request instead of executing it. - */ - - // Rename variables (to overcome inheritence issues) - $bucket = $operation; - $opt = $payload; - - // Validate the S3 bucket name - if (!$this->validate_bucketname_support($bucket)) - { - // @codeCoverageIgnoreStart - throw new S3_Exception('S3 does not support "' . $bucket . '" as a valid bucket name. Review "Bucket Restrictions and Limitations" in the S3 Developer Guide for more information.'); - // @codeCoverageIgnoreEnd - } - - // Die if $opt isn't set. - if (!$opt) return false; - - $method_arguments = func_get_args(); - - // Use the caching flow to determine if we need to do a round-trip to the server. - if ($this->use_cache_flow) - { - // Generate an identifier specific to this particular set of arguments. - $cache_id = $this->key . '_' . get_class($this) . '_' . $bucket . '_' . sha1(serialize($method_arguments)); - - // Instantiate the appropriate caching object. - $this->cache_object = new $this->cache_class($cache_id, $this->cache_location, $this->cache_expires, $this->cache_compress); - - if ($this->delete_cache) - { - $this->use_cache_flow = false; - $this->delete_cache = false; - return $this->cache_object->delete(); - } - - // Invoke the cache callback function to determine whether to pull data from the cache or make a fresh request. - $data = $this->cache_object->response_manager(array($this, 'cache_callback'), $method_arguments); - - if ($this->parse_the_response) - { - // Parse the XML body - $data = $this->parse_callback($data); - } - - // End! - return $data; - } - - // If we haven't already set a resource prefix and the bucket name isn't DNS-valid... - if ((!$this->resource_prefix && !$this->validate_bucketname_create($bucket)) || $this->path_style) - { - // Fall back to the older path-style URI - $this->set_resource_prefix('/' . $bucket); - $this->temporary_prefix = true; - } - - // Determine hostname - $scheme = $this->use_ssl ? 'https://' : 'http://'; - if ($this->resource_prefix || $this->path_style) // Use bucket-in-path method. - { - $hostname = $this->hostname . $this->resource_prefix . (($bucket === '' || $this->resource_prefix === '/' . $bucket) ? '' : ('/' . $bucket)); - } - else - { - $hostname = $this->vhost ? $this->vhost : (($bucket === '') ? $this->hostname : ($bucket . '.') . $this->hostname); - } - - // Get the UTC timestamp in RFC 2616 format - $date = gmdate(CFUtilities::DATE_FORMAT_RFC2616, time()); - - // Storage for request parameters. - $resource = ''; - $sub_resource = ''; - $querystringparams = array(); - $signable_querystringparams = array(); - $string_to_sign = ''; - $headers = array( - 'Content-MD5' => '', - 'Content-Type' => 'application/x-www-form-urlencoded', - 'Date' => $date - ); - - /*%******************************************************************************************%*/ - - // Do we have an authentication token? - if ($this->auth_token) - { - $headers['X-Amz-Security-Token'] = $this->auth_token; - } - - // Handle specific resources - if (isset($opt['resource'])) - { - $resource .= $opt['resource']; - } - - // Merge query string values - if (isset($opt['query_string'])) - { - $querystringparams = array_merge($querystringparams, $opt['query_string']); - } - $query_string = $this->util->to_query_string($querystringparams); - - // Merge the signable query string values. Must be alphabetical. - $signable_list = array( - 'partNumber', - 'response-cache-control', - 'response-content-disposition', - 'response-content-encoding', - 'response-content-language', - 'response-content-type', - 'response-expires', - 'uploadId', - 'versionId' - ); - foreach ($signable_list as $item) - { - if (isset($opt[$item])) - { - $signable_querystringparams[$item] = $opt[$item]; - } - } - $signable_query_string = $this->util->to_query_string($signable_querystringparams); - - // Merge the HTTP headers - if (isset($opt['headers'])) - { - $headers = array_merge($headers, $opt['headers']); - } - - // Compile the URI to request - $conjunction = '?'; - $signable_resource = '/' . str_replace('%2F', '/', rawurlencode($resource)); - $non_signable_resource = ''; - - if (isset($opt['sub_resource'])) - { - $signable_resource .= $conjunction . rawurlencode($opt['sub_resource']); - $conjunction = '&'; - } - if ($signable_query_string !== '') - { - $signable_query_string = $conjunction . $signable_query_string; - $conjunction = '&'; - } - if ($query_string !== '') - { - $non_signable_resource .= $conjunction . $query_string; - $conjunction = '&'; - } - if (substr($hostname, -1) === substr($signable_resource, 0, 1)) - { - $signable_resource = ltrim($signable_resource, '/'); - } - - $this->request_url = $scheme . $hostname . $signable_resource . $signable_query_string . $non_signable_resource; - - if (isset($opt['location'])) - { - $this->request_url = $opt['location']; - } - - // Gather information to pass along to other classes. - $helpers = array( - 'utilities' => $this->utilities_class, - 'request' => $this->request_class, - 'response' => $this->response_class, - ); - - // Instantiate the request class - $request = new $this->request_class($this->request_url, $this->proxy, $helpers, $this->credentials); - - // Update RequestCore settings - $request->request_class = $this->request_class; - $request->response_class = $this->response_class; - $request->ssl_verification = $this->ssl_verification; - - // Pass along registered stream callbacks - if ($this->registered_streaming_read_callback) - { - $request->register_streaming_read_callback($this->registered_streaming_read_callback); - } - - if ($this->registered_streaming_write_callback) - { - $request->register_streaming_write_callback($this->registered_streaming_write_callback); - } - - // Streaming uploads - if (isset($opt['fileUpload'])) - { - if (is_resource($opt['fileUpload'])) - { - // Determine the length to read from the stream - $length = null; // From current position until EOF by default, size determined by set_read_stream() - - if (isset($headers['Content-Length'])) - { - $length = $headers['Content-Length']; - } - elseif (isset($opt['seekTo'])) - { - // Read from seekTo until EOF by default - $stats = fstat($opt['fileUpload']); - - if ($stats && $stats['size'] >= 0) - { - $length = $stats['size'] - (integer) $opt['seekTo']; - } - } - - $request->set_read_stream($opt['fileUpload'], $length); - - if ($headers['Content-Type'] === 'application/x-www-form-urlencoded') - { - $headers['Content-Type'] = 'application/octet-stream'; - } - } - else - { - $request->set_read_file($opt['fileUpload']); - - // Determine the length to read from the file - $length = $request->read_stream_size; // The file size by default - - if (isset($headers['Content-Length'])) - { - $length = $headers['Content-Length']; - } - elseif (isset($opt['seekTo']) && isset($length)) - { - // Read from seekTo until EOF by default - $length -= (integer) $opt['seekTo']; - } - - $request->set_read_stream_size($length); - - // Attempt to guess the correct mime-type - if ($headers['Content-Type'] === 'application/x-www-form-urlencoded') - { - $extension = explode('.', $opt['fileUpload']); - $extension = array_pop($extension); - $mime_type = CFMimeTypes::get_mimetype($extension); - $headers['Content-Type'] = $mime_type; - } - } - - $headers['Content-Length'] = $request->read_stream_size; - $headers['Content-MD5'] = ''; - } - - // Handle streaming file offsets - if (isset($opt['seekTo'])) - { - // Pass the seek position to RequestCore - $request->set_seek_position((integer) $opt['seekTo']); - } - - // Streaming downloads - if (isset($opt['fileDownload'])) - { - if (is_resource($opt['fileDownload'])) - { - $request->set_write_stream($opt['fileDownload']); - } - else - { - $request->set_write_file($opt['fileDownload']); - } - } - - $curlopts = array(); - - // Set custom CURLOPT settings - if (isset($opt['curlopts'])) - { - $curlopts = $opt['curlopts']; - } - - // Debug mode - if ($this->debug_mode) - { - $curlopts[CURLOPT_VERBOSE] = true; - } - - // Set the curl options. - if (count($curlopts)) - { - $request->set_curlopts($curlopts); - } - - // Do we have a verb? - if (isset($opt['verb'])) - { - $request->set_method($opt['verb']); - $string_to_sign .= $opt['verb'] . "\n"; - } - - // Add headers and content when we have a body - if (isset($opt['body'])) - { - $request->set_body($opt['body']); - $headers['Content-Length'] = strlen($opt['body']); - - if ($headers['Content-Type'] === 'application/x-www-form-urlencoded') - { - $headers['Content-Type'] = 'application/octet-stream'; - } - - if (!isset($opt['NoContentMD5']) || $opt['NoContentMD5'] !== true) - { - $headers['Content-MD5'] = $this->util->hex_to_base64(md5($opt['body'])); - } - } - - // Handle query-string authentication - if (isset($opt['preauth']) && (integer) $opt['preauth'] > 0) - { - unset($headers['Date']); - $headers['Content-Type'] = ''; - $headers['Expires'] = is_int($opt['preauth']) ? $opt['preauth'] : strtotime($opt['preauth']); - } - - // Sort headers - uksort($headers, 'strnatcasecmp'); - - // Add headers to request and compute the string to sign - foreach ($headers as $header_key => $header_value) - { - // Strip linebreaks from header values as they're illegal and can allow for security issues - $header_value = str_replace(array("\r", "\n"), '', $header_value); - - // Add the header if it has a value - if ($header_value !== '') - { - $request->add_header($header_key, $header_value); - } - - // Generate the string to sign - if ( - strtolower($header_key) === 'content-md5' || - strtolower($header_key) === 'content-type' || - strtolower($header_key) === 'date' || - (strtolower($header_key) === 'expires' && isset($opt['preauth']) && (integer) $opt['preauth'] > 0) - ) - { - $string_to_sign .= $header_value . "\n"; - } - elseif (substr(strtolower($header_key), 0, 6) === 'x-amz-') - { - $string_to_sign .= strtolower($header_key) . ':' . $header_value . "\n"; - } - } - - // Add the signable resource location - $string_to_sign .= ($this->resource_prefix ? $this->resource_prefix : ''); - $string_to_sign .= (($bucket === '' || $this->resource_prefix === '/' . $bucket) ? '' : ('/' . $bucket)) . $signable_resource . urldecode($signable_query_string); - - // Hash the AWS secret key and generate a signature for the request. - $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $this->secret_key, true)); - $request->add_header('Authorization', 'AWS ' . $this->key . ':' . $signature); - - // If we're generating a URL, return the URL to the calling method. - if (isset($opt['preauth']) && (integer) $opt['preauth'] > 0) - { - $query_params = array( - 'AWSAccessKeyId' => $this->key, - 'Expires' => $headers['Expires'], - 'Signature' => $signature, - ); - - // If using short-term credentials, add the token to the query string - if ($this->auth_token) - { - $query_params['x-amz-security-token'] = $this->auth_token; - } - - return $this->request_url . $conjunction . http_build_query($query_params, '', '&'); - } - elseif (isset($opt['preauth'])) - { - return $this->request_url; - } - - /*%******************************************************************************************%*/ - - // If our changes were temporary, reset them. - if ($this->temporary_prefix) - { - $this->temporary_prefix = false; - $this->resource_prefix = null; - } - - // Manage the (newer) batch request API or the (older) returnCurlHandle setting. - if ($this->use_batch_flow) - { - $handle = $request->prep_request(); - $this->batch_object->add($handle); - $this->use_batch_flow = false; - - return $handle; - } - elseif (isset($opt['returnCurlHandle']) && $opt['returnCurlHandle'] === true) - { - return $request->prep_request(); - } - - // Send! - $request->send_request(); - - // Prepare the response - $headers = $request->get_response_header(); - $headers['x-aws-request-url'] = $this->request_url; - $headers['x-aws-redirects'] = $this->redirects; - $headers['x-aws-stringtosign'] = $string_to_sign; - $headers['x-aws-requestheaders'] = $request->request_headers; - - // Did we have a request body? - if (isset($opt['body'])) - { - $headers['x-aws-requestbody'] = $opt['body']; - } - - $data = new $this->response_class($headers, $this->parse_callback($request->get_response_body()), $request->get_response_code()); - - // Did Amazon tell us to redirect? Typically happens for multiple rapid requests EU datacenters. - // @see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/Redirects.html - // @codeCoverageIgnoreStart - if ((integer) $request->get_response_code() === 307) // Temporary redirect to new endpoint. - { - $this->redirects++; - $opt['location'] = $headers['location']; - $data = $this->authenticate($bucket, $opt); - } - - // Was it Amazon's fault the request failed? Retry the request until we reach $max_retries. - elseif ((integer) $request->get_response_code() === 500 || (integer) $request->get_response_code() === 503) - { - if ($this->redirects <= $this->max_retries) - { - // Exponential backoff - $delay = (integer) (pow(4, $this->redirects) * 100000); - usleep($delay); - $this->redirects++; - $data = $this->authenticate($bucket, $opt); - } - } - // @codeCoverageIgnoreEnd - - // Return! - $this->redirects = 0; - return $data; - } - - /** - * Validates whether or not the specified Amazon S3 bucket name is valid for DNS-style access. This - * method is leveraged by any method that creates buckets. - * - * @param string $bucket (Required) The name of the bucket to validate. - * @return boolean Whether or not the specified Amazon S3 bucket name is valid for DNS-style access. A value of true means that the bucket name is valid. A value of false means that the bucket name is invalid. - */ - public function validate_bucketname_create($bucket) - { - // list_buckets() uses this. Let it pass. - if ($bucket === '') return true; - - if ( - ($bucket === null || $bucket === false) || // Must not be null or false - preg_match('/[^(a-z0-9\-\.)]/', $bucket) || // Must be in the lowercase Roman alphabet, period or hyphen - !preg_match('/^([a-z]|\d)/', $bucket) || // Must start with a number or letter - !(strlen($bucket) >= 3 && strlen($bucket) <= 63) || // Must be between 3 and 63 characters long - (strpos($bucket, '..') !== false) || // Bucket names cannot contain two, adjacent periods - (strpos($bucket, '-.') !== false) || // Bucket names cannot contain dashes next to periods - (strpos($bucket, '.-') !== false) || // Bucket names cannot contain dashes next to periods - preg_match('/(-|\.)$/', $bucket) || // Bucket names should not end with a dash or period - preg_match('/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/', $bucket) // Must not be formatted as an IP address - ) return false; - - return true; - } - - /** - * Validates whether or not the specified Amazon S3 bucket name is valid for path-style access. This - * method is leveraged by any method that reads from buckets. - * - * @param string $bucket (Required) The name of the bucket to validate. - * @return boolean Whether or not the bucket name is valid. A value of true means that the bucket name is valid. A value of false means that the bucket name is invalid. - */ - public function validate_bucketname_support($bucket) - { - // list_buckets() uses this. Let it pass. - if ($bucket === '') return true; - - // Validate - if ( - ($bucket === null || $bucket === false) || // Must not be null or false - preg_match('/[^(a-z0-9_\-\.)]/i', $bucket) || // Must be in the Roman alphabet, period, hyphen or underscore - !preg_match('/^([a-z]|\d)/i', $bucket) || // Must start with a number or letter - !(strlen($bucket) >= 3 && strlen($bucket) <= 255) || // Must be between 3 and 255 characters long - preg_match('/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/', $bucket) // Must not be formatted as an IP address - ) return false; - - return true; - } - - /*%******************************************************************************************%*/ - // SETTERS - - /** - * Sets the region to use for subsequent Amazon S3 operations. This will also reset any prior use of - * . - * - * @param string $region (Required) The region to use for subsequent Amazon S3 operations. For a complete list of REGION constants, see the AmazonS3 Constants page in the API reference. - * @return $this A reference to the current instance. - */ - public function set_region($region) - { - // @codeCoverageIgnoreStart - $this->set_hostname($region); - - switch ($region) - { - case self::REGION_US_E1: // Northern Virginia - $this->enable_path_style(false); - break; - - case self::REGION_EU_W1: // Ireland - $this->enable_path_style(); // Always use path-style access for EU endpoint. - break; - - default: - $this->enable_path_style(false); - break; - - } - // @codeCoverageIgnoreEnd - - return $this; - } - - /** - * Sets the virtual host to use in place of the default `bucket.s3.amazonaws.com` domain. - * - * @param string $vhost (Required) The virtual host to use in place of the default `bucket.s3.amazonaws.com` domain. - * @return $this A reference to the current instance. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/VirtualHosting.html Virtual Hosting of Buckets - */ - public function set_vhost($vhost) - { - $this->vhost = $vhost; - return $this; - } - - /** - * Enables the use of the older path-style URI access for all requests. - * - * @param string $style (Optional) Whether or not to enable path-style URI access for all requests. The default value is true. - * @return $this A reference to the current instance. - */ - public function enable_path_style($style = true) - { - $this->path_style = $style; - return $this; - } - - - /*%******************************************************************************************%*/ - // BUCKET METHODS - - /** - * Creates an Amazon S3 bucket. - * - * Every object stored in Amazon S3 is contained in a bucket. Buckets partition the namespace of - * objects stored in Amazon S3 at the top level. in a bucket, any name can be used for objects. - * However, bucket names must be unique across all of Amazon S3. - * - * @param string $bucket (Required) The name of the bucket to create. - * @param string $region (Required) The preferred geographical location for the bucket. [Allowed values: `AmazonS3::REGION_US_E1 `, `AmazonS3::REGION_US_W1`, `AmazonS3::REGION_EU_W1`, `AmazonS3::REGION_APAC_SE1`, `AmazonS3::REGION_APAC_NE1`] - * @param string $acl (Optional) The ACL settings for the specified bucket. [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. The default value is . - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/UsingBucket.html Working with Amazon S3 Buckets - */ - public function create_bucket($bucket, $region, $acl = self::ACL_PRIVATE, $opt = null) - { - // If the bucket contains uppercase letters... - if (preg_match('/[A-Z]/', $bucket)) - { - // Throw a warning - trigger_error('Since DNS-valid bucket names cannot contain uppercase characters, "' . $bucket . '" has been automatically converted to "' . strtolower($bucket) . '"', E_USER_WARNING); - - // Force the bucketname to lowercase - $bucket = strtolower($bucket); - } - - // Validate the S3 bucket name for creation - if (!$this->validate_bucketname_create($bucket)) - { - // @codeCoverageIgnoreStart - throw new S3_Exception('"' . $bucket . '" is not DNS-valid (i.e., .s3.amazonaws.com), and cannot be used as an S3 bucket name. Review "Bucket Restrictions and Limitations" in the S3 Developer Guide for more information.'); - // @codeCoverageIgnoreEnd - } - - if (!$opt) $opt = array(); - $opt['verb'] = 'PUT'; - $opt['headers'] = array( - 'Content-Type' => 'application/xml', - 'x-amz-acl' => $acl - ); - - // Defaults - $this->set_region($region); // Also sets path-style - $xml = simplexml_load_string($this->base_location_constraint); - - switch ($region) - { - case self::REGION_US_E1: // Northern Virginia - $opt['body'] = ''; - break; - - case self::REGION_EU_W1: // Ireland - $xml->LocationConstraint = 'EU'; - $opt['body'] = $xml->asXML(); - break; - - default: - $xml->LocationConstraint = str_replace(array('s3-', '.amazonaws.com'), '', $region); - $opt['body'] = $xml->asXML(); - break; - } - - $response = $this->authenticate($bucket, $opt); - - // Make sure we're set back to DNS-style URLs - $this->enable_path_style(false); - - return $response; - } - - /** - * Gets the region in which the specified Amazon S3 bucket is located. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function get_bucket_region($bucket, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'GET'; - $opt['sub_resource'] = 'location'; - - // Authenticate to S3 - $response = $this->authenticate($bucket, $opt); - - if ($response->isOK()) - { - // Handle body - $response->body = (string) $response->body; - } - - return $response; - } - - /** - * Gets the HTTP headers for the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function get_bucket_headers($bucket, $opt = null) - { - if (!$opt) $opt = array(); - $opt['verb'] = 'HEAD'; - - return $this->authenticate($bucket, $opt); - } - - /** - * Deletes a bucket from an Amazon S3 account. A bucket must be empty before the bucket itself can be deleted. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param boolean $force (Optional) Whether to force-delete the bucket and all of its contents. The default value is false. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return mixed A object if the bucket was deleted successfully. Returns boolean false if otherwise. - */ - public function delete_bucket($bucket, $force = false, $opt = null) - { - // Set default value - $success = true; - - if ($force) - { - // Delete all of the items from the bucket. - $success = $this->delete_all_object_versions($bucket); - } - - // As long as we were successful... - if ($success) - { - if (!$opt) $opt = array(); - $opt['verb'] = 'DELETE'; - - return $this->authenticate($bucket, $opt); - } - - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - /** - * Gets a list of all buckets contained in the caller's Amazon S3 account. - * - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function list_buckets($opt = null) - { - if (!$opt) $opt = array(); - $opt['verb'] = 'GET'; - - return $this->authenticate('', $opt); - } - - /** - * Gets the access control list (ACL) settings for the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAccessPolicy.html REST Access Control Policy - */ - public function get_bucket_acl($bucket, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'GET'; - $opt['sub_resource'] = 'acl'; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Sets the access control list (ACL) settings for the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $acl (Optional) The ACL settings for the specified bucket. [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. Alternatively, an array of associative arrays. Each associative array contains an `id` and a `permission` key. The default value is . - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAccessPolicy.html REST Access Control Policy - */ - public function set_bucket_acl($bucket, $acl = self::ACL_PRIVATE, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'PUT'; - $opt['sub_resource'] = 'acl'; - $opt['headers'] = array( - 'Content-Type' => 'application/xml' - ); - - // Make sure these are defined. - // @codeCoverageIgnoreStart - if (!$this->credentials->canonical_id || !$this->credentials->canonical_name) - { - // Fetch the data live. - $canonical = $this->get_canonical_user_id(); - $this->credentials->canonical_id = $canonical['id']; - $this->credentials->canonical_name = $canonical['display_name']; - } - // @codeCoverageIgnoreEnd - - if (is_array($acl)) - { - $opt['body'] = $this->generate_access_policy($this->credentials->canonical_id, $this->credentials->canonical_name, $acl); - } - else - { - $opt['body'] = ''; - $opt['headers']['x-amz-acl'] = $acl; - } - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - - /*%******************************************************************************************%*/ - // OBJECT METHODS - - /** - * Creates an Amazon S3 object. After an Amazon S3 bucket is created, objects can be stored in it. - * - * Each standard object can hold up to 5 GB of data. When an object is stored in Amazon S3, the data is streamed - * to multiple storage servers in multiple data centers. This ensures the data remains available in the - * event of internal network or hardware failure. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • body - string - Required; Conditional - The data to be stored in the object. Either this parameter or fileUpload must be specified.
    • - *
    • fileUpload - string|resource - Required; Conditional - The URL/path for the file to upload, or an open resource. Either this parameter or body is required.
    • - *
    • acl - string - Optional - The ACL settings for the specified object. [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. The default value is ACL_PRIVATE.
    • - *
    • contentType - string - Optional - The type of content that is being sent in the body. If a file is being uploaded via fileUpload as a file system path, it will attempt to determine the correct mime-type based on the file extension. The default value is application/octet-stream.
    • - *
    • encryption - string - Optional - The algorithm to use for encrypting the object. [Allowed values: AES256]
    • - *
    • headers - array - Optional - Standard HTTP headers to send along in the request. Accepts an associative array of key-value pairs.
    • - *
    • length - integer - Optional - The size of the object in bytes. For more information, see RFC 2616, section 14.13. The value can also be passed to the header option as Content-Length.
    • - *
    • meta - array - Optional - An associative array of key-value pairs. Represented by x-amz-meta-:. Any header starting with this prefix is considered user metadata. It will be stored with the object and returned when you retrieve the object. The total size of the HTTP request, not including the body, must be less than 4 KB.
    • - *
    • seekTo - integer - Optional - The starting position in bytes within the file/stream to upload from.
    • - *
    • storage - string - Optional - Whether to use Standard or Reduced Redundancy storage. [Allowed values: AmazonS3::STORAGE_STANDARD, AmazonS3::STORAGE_REDUCED]. The default value is STORAGE_STANDARD.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAccessPolicy.html REST Access Control Policy - */ - public function create_object($bucket, $filename, $opt = null) - { - if (!$opt) $opt = array(); - - // Add this to our request - $opt['verb'] = 'PUT'; - $opt['resource'] = $filename; - - // Handle content length. Can also be passed as an HTTP header. - if (isset($opt['length'])) - { - $opt['headers']['Content-Length'] = $opt['length']; - unset($opt['length']); - } - - // Handle content type. Can also be passed as an HTTP header. - if (isset($opt['contentType'])) - { - $opt['headers']['Content-Type'] = $opt['contentType']; - unset($opt['contentType']); - } - - // Handle Access Control Lists. Can also be passed as an HTTP header. - if (isset($opt['acl'])) - { - $opt['headers']['x-amz-acl'] = $opt['acl']; - unset($opt['acl']); - } - - // Handle storage settings. Can also be passed as an HTTP header. - if (isset($opt['storage'])) - { - $opt['headers']['x-amz-storage-class'] = $opt['storage']; - unset($opt['storage']); - } - - // Handle encryption settings. Can also be passed as an HTTP header. - if (isset($opt['encryption'])) - { - $opt['headers']['x-amz-server-side-encryption'] = $opt['encryption']; - unset($opt['encryption']); - } - - // Handle meta tags. Can also be passed as an HTTP header. - if (isset($opt['meta'])) - { - foreach ($opt['meta'] as $meta_key => $meta_value) - { - // e.g., `My Meta Header` is converted to `x-amz-meta-my-meta-header`. - $opt['headers']['x-amz-meta-' . strtolower(str_replace(' ', '-', $meta_key))] = $meta_value; - } - unset($opt['meta']); - } - - $opt['headers']['Expect'] = '100-continue'; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Gets the contents of an Amazon S3 object in the specified bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • etag - string - Optional - The ETag header passed in from a previous request. If specified, request LastModified option must be specified as well. Will trigger a 304 Not Modified status code if the file hasn't changed.
    • - *
    • fileDownload - string|resource - Optional - The file system location to download the file to, or an open file resource. Must be a server-writable location.
    • - *
    • headers - array - Optional - Standard HTTP headers to send along in the request. Accepts an associative array of key-value pairs.
    • - *
    • lastmodified - string - Optional - The LastModified header passed in from a previous request. If specified, request ETag option must be specified as well. Will trigger a 304 Not Modified status code if the file hasn't changed.
    • - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • range - string - Optional - The range of bytes to fetch from the object. Specify this parameter when downloading partial bits or completing incomplete object downloads. The specified range must be notated with a hyphen (e.g., 0-10485759). Defaults to the byte range of the complete Amazon S3 object.
    • - *
    • response - array - Optional - Allows adjustments to specific response headers. Pass an associative array where each key is one of the following: cache-control, content-disposition, content-encoding, content-language, content-type, expires. The expires value should use and be formatted with the DATE_RFC2822 constant.
    • - *
    • versionId - string - Optional - The version of the object to retrieve. Version IDs are returned in the x-amz-version-id header of any previous object-related request.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function get_object($bucket, $filename, $opt = null) - { - if (!$opt) $opt = array(); - - // Add this to our request - $opt['verb'] = 'GET'; - $opt['resource'] = $filename; - - if (!isset($opt['headers']) || !is_array($opt['headers'])) - { - $opt['headers'] = array(); - } - - if (isset($opt['lastmodified'])) - { - $opt['headers']['If-Modified-Since'] = $opt['lastmodified']; - } - - if (isset($opt['etag'])) - { - $opt['headers']['If-None-Match'] = $opt['etag']; - } - - // Partial content range - if (isset($opt['range'])) - { - $opt['headers']['Range'] = 'bytes=' . $opt['range']; - } - - // GET responses - if (isset($opt['response'])) - { - foreach ($opt['response'] as $key => $value) - { - $opt['response-' . $key] = $value; - unset($opt['response'][$key]); - } - } - - // Authenticate to S3 - $this->parse_the_response = false; - $response = $this->authenticate($bucket, $opt); - $this->parse_the_response = true; - - return $response; - } - - /** - * Gets the HTTP headers for the specified Amazon S3 object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • versionId - string - Optional - The version of the object to retrieve. Version IDs are returned in the x-amz-version-id header of any previous object-related request.
    • - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function get_object_headers($bucket, $filename, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'HEAD'; - $opt['resource'] = $filename; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Deletes an Amazon S3 object from the specified bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • versionId - string - Optional - The version of the object to delete. Version IDs are returned in the x-amz-version-id header of any previous object-related request.
    • - *
    • MFASerial - string - Optional - The serial number on the back of the Gemalto device. MFASerial and MFAToken must both be set for MFA to work.
    • - *
    • MFAToken - string - Optional - The current token displayed on the Gemalto device. MFASerial and MFAToken must both be set for MFA to work.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://aws.amazon.com/mfa/ Multi-Factor Authentication - */ - public function delete_object($bucket, $filename, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'DELETE'; - $opt['resource'] = $filename; - - // Enable MFA delete? - // @codeCoverageIgnoreStart - if (isset($opt['MFASerial']) && isset($opt['MFAToken'])) - { - $opt['headers'] = array( - 'x-amz-mfa' => ($opt['MFASerial'] . ' ' . $opt['MFAToken']) - ); - } - // @codeCoverageIgnoreEnd - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Deletes two or more specified Amazon S3 objects from the specified bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • objects - array - Required - The object references to delete from the bucket.
        - *
      • key - string - Required - The name of the object (e.g., the "key") to delete. This should include the entire file path including all "subdirectories".
      • - *
      • version_id - string - Optional - If the object is versioned, include the version ID to delete.
      • - *
    • - *
    • quiet - boolean - Optional - Whether or not Amazon S3 should use "Quiet" mode for this operation. A value of true will enable Quiet mode. A value of false will use Verbose mode. The default value is false.
    • - *
    • MFASerial - string - Optional - The serial number on the back of the Gemalto device. MFASerial and MFAToken must both be set for MFA to work.
    • - *
    • MFAToken - string - Optional - The current token displayed on the Gemalto device. MFASerial and MFAToken must both be set for MFA to work.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://aws.amazon.com/mfa/ Multi-Factor Authentication - */ - public function delete_objects($bucket, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'POST'; - $opt['sub_resource'] = 'delete'; - $opt['body'] = ''; - - // Bail out - if (!isset($opt['objects']) || !is_array($opt['objects'])) - { - throw new S3_Exception('The ' . __FUNCTION__ . ' method requires the "objects" option to be set as an array.'); - } - - $xml = new SimpleXMLElement($this->multi_object_delete_xml); - - // Add the objects - foreach ($opt['objects'] as $object) - { - $xobject = $xml->addChild('Object'); - $xobject->addChild('Key', $object['key']); - - if (isset($object['version_id'])) - { - $xobject->addChild('VersionId', $object['version_id']); - } - } - - // Quiet mode? - if (isset($opt['quiet'])) - { - $quiet = 'false'; - if (is_bool($opt['quiet'])) // Boolean - { - $quiet = $opt['quiet'] ? 'true' : 'false'; - } - elseif (is_string($opt['quiet'])) // String - { - $quiet = ($opt['quiet'] === 'true') ? 'true' : 'false'; - } - - $xml->addChild('Quiet', $quiet); - } - - // Enable MFA delete? - // @codeCoverageIgnoreStart - if (isset($opt['MFASerial']) && isset($opt['MFAToken'])) - { - $opt['headers'] = array( - 'x-amz-mfa' => ($opt['MFASerial'] . ' ' . $opt['MFAToken']) - ); - } - // @codeCoverageIgnoreEnd - - $opt['body'] = $xml->asXML(); - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Gets a list of all Amazon S3 objects in the specified bucket. - * - * NOTE: This method is paginated, and will not return more than max-keys keys. If you want to retrieve a list of all keys, you will need to make multiple calls to this function using the marker option to specify the pagination offset (the key of the last processed key--lexically ordered) and the IsTruncated response key to detect when all results have been processed. See: the S3 REST documentation for get_bucket for more information. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • delimiter - string - Optional - Keys that contain the same string between the prefix and the first occurrence of the delimiter will be rolled up into a single result element in the CommonPrefixes collection.
    • - *
    • marker - string - Optional - Restricts the response to contain results that only occur alphabetically after the value of the marker.
    • - *
    • max-keys - string - Optional - The maximum number of results returned by the method call. The returned list will contain no more results than the specified value, but may return fewer. The default value is 1000.
    • - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • prefix - string - Optional - Restricts the response to contain results that begin only with the specified prefix.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function list_objects($bucket, $opt = null) - { - if (!$opt) $opt = array(); - - // Add this to our request - $opt['verb'] = 'GET'; - - foreach (array('delimiter', 'marker', 'max-keys', 'prefix') as $param) - { - if (isset($opt[$param])) - { - $opt['query_string'][$param] = $opt[$param]; - unset($opt[$param]); - } - } - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Copies an Amazon S3 object to a new location, whether in the same Amazon S3 region, bucket, or otherwise. - * - * @param array $source (Required) The bucket and file name to copy from. The following keys must be set:
      - *
    • bucket - string - Required - Specifies the name of the bucket containing the source object.
    • - *
    • filename - string - Required - Specifies the file name of the source object to copy.
    - * @param array $dest (Required) The bucket and file name to copy to. The following keys must be set:
      - *
    • bucket - string - Required - Specifies the name of the bucket to copy the object to.
    • - *
    • filename - string - Required - Specifies the file name to copy the object to.
    - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • acl - string - Optional - The ACL settings for the specified object. [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. Alternatively, an array of associative arrays. Each associative array contains an id and a permission key. The default value is ACL_PRIVATE.
    • - *
    • encryption - string - Optional - The algorithm to use for encrypting the object. [Allowed values: AES256]
    • - *
    • storage - string - Optional - Whether to use Standard or Reduced Redundancy storage. [Allowed values: AmazonS3::STORAGE_STANDARD, AmazonS3::STORAGE_REDUCED]. The default value is STORAGE_STANDARD.
    • - *
    • versionId - string - Optional - The version of the object to copy. Version IDs are returned in the x-amz-version-id header of any previous object-related request.
    • - *
    • ifMatch - string - Optional - The ETag header from a previous request. Copies the object if its entity tag (ETag) matches the specified tag; otherwise, the request returns a 412 HTTP status code error (precondition failed). Used in conjunction with ifUnmodifiedSince.
    • - *
    • ifUnmodifiedSince - string - Optional - The LastModified header from a previous request. Copies the object if it hasn't been modified since the specified time; otherwise, the request returns a 412 HTTP status code error (precondition failed). Used in conjunction with ifMatch.
    • - *
    • ifNoneMatch - string - Optional - The ETag header from a previous request. Copies the object if its entity tag (ETag) is different than the specified ETag; otherwise, the request returns a 412 HTTP status code error (failed condition). Used in conjunction with ifModifiedSince.
    • - *
    • ifModifiedSince - string - Optional - The LastModified header from a previous request. Copies the object if it has been modified since the specified time; otherwise, the request returns a 412 HTTP status code error (failed condition). Used in conjunction with ifNoneMatch.
    • - *
    • headers - array - Optional - Standard HTTP headers to send along in the request. Accepts an associative array of key-value pairs.
    • - *
    • meta - array - Optional - Associative array of key-value pairs. Represented by x-amz-meta-: Any header starting with this prefix is considered user metadata. It will be stored with the object and returned when you retrieve the object. The total size of the HTTP request, not including the body, must be less than 4 KB.
    • - *
    • metadataDirective - string - Optional - Accepts either COPY or REPLACE. You will likely never need to use this, as it manages itself with no issues.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/API/RESTObjectCOPY.html Copying Amazon S3 Objects - */ - public function copy_object($source, $dest, $opt = null) - { - if (!$opt) $opt = array(); - $batch = array(); - - // Add this to our request - $opt['verb'] = 'PUT'; - $opt['resource'] = $dest['filename']; - $opt['body'] = ''; - - // Handle copy source - if (isset($source['bucket']) && isset($source['filename'])) - { - $opt['headers']['x-amz-copy-source'] = '/' . $source['bucket'] . '/' . rawurlencode($source['filename']) - . (isset($opt['versionId']) ? ('?' . 'versionId=' . rawurlencode($opt['versionId'])) : ''); // Append the versionId to copy, if available - unset($opt['versionId']); - - // Determine if we need to lookup the pre-existing content-type. - if ( - (!$this->use_batch_flow && !isset($opt['returnCurlHandle'])) && - !in_array(strtolower('content-type'), array_map('strtolower', array_keys($opt['headers']))) - ) - { - $response = $this->get_object_headers($source['bucket'], $source['filename']); - if ($response->isOK()) - { - $opt['headers']['Content-Type'] = $response->header['content-type']; - } - } - } - - // Handle metadata directive - $opt['headers']['x-amz-metadata-directive'] = 'COPY'; - if ($source['bucket'] === $dest['bucket'] && $source['filename'] === $dest['filename']) - { - $opt['headers']['x-amz-metadata-directive'] = 'REPLACE'; - } - if (isset($opt['metadataDirective'])) - { - $opt['headers']['x-amz-metadata-directive'] = $opt['metadataDirective']; - unset($opt['metadataDirective']); - } - - // Handle Access Control Lists. Can also pass canned ACLs as an HTTP header. - if (isset($opt['acl']) && is_array($opt['acl'])) - { - $batch[] = $this->set_object_acl($dest['bucket'], $dest['filename'], $opt['acl'], array( - 'returnCurlHandle' => true - )); - unset($opt['acl']); - } - elseif (isset($opt['acl'])) - { - $opt['headers']['x-amz-acl'] = $opt['acl']; - unset($opt['acl']); - } - - // Handle storage settings. Can also be passed as an HTTP header. - if (isset($opt['storage'])) - { - $opt['headers']['x-amz-storage-class'] = $opt['storage']; - unset($opt['storage']); - } - - // Handle encryption settings. Can also be passed as an HTTP header. - if (isset($opt['encryption'])) - { - $opt['headers']['x-amz-server-side-encryption'] = $opt['encryption']; - unset($opt['encryption']); - } - - // Handle conditional-copy parameters - if (isset($opt['ifMatch'])) - { - $opt['headers']['x-amz-copy-source-if-match'] = $opt['ifMatch']; - unset($opt['ifMatch']); - } - if (isset($opt['ifNoneMatch'])) - { - $opt['headers']['x-amz-copy-source-if-none-match'] = $opt['ifNoneMatch']; - unset($opt['ifNoneMatch']); - } - if (isset($opt['ifUnmodifiedSince'])) - { - $opt['headers']['x-amz-copy-source-if-unmodified-since'] = $opt['ifUnmodifiedSince']; - unset($opt['ifUnmodifiedSince']); - } - if (isset($opt['ifModifiedSince'])) - { - $opt['headers']['x-amz-copy-source-if-modified-since'] = $opt['ifModifiedSince']; - unset($opt['ifModifiedSince']); - } - - // Handle meta tags. Can also be passed as an HTTP header. - if (isset($opt['meta'])) - { - foreach ($opt['meta'] as $meta_key => $meta_value) - { - // e.g., `My Meta Header` is converted to `x-amz-meta-my-meta-header`. - $opt['headers']['x-amz-meta-' . strtolower(str_replace(' ', '-', $meta_key))] = $meta_value; - } - unset($opt['meta']); - } - - // Authenticate to S3 - $response = $this->authenticate($dest['bucket'], $opt); - - // Attempt to reset ACLs - $http = new RequestCore(); - $http->send_multi_request($batch); - - return $response; - } - - /** - * Updates an Amazon S3 object with new headers or other metadata. To replace the content of the - * specified Amazon S3 object, call with the same bucket and file name parameters. - * - * @param string $bucket (Required) The name of the bucket that contains the source file. - * @param string $filename (Required) The source file name that you want to update. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • acl - string - Optional - The ACL settings for the specified object. [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. The default value is .
    • - *
    • headers - array - Optional - Standard HTTP headers to send along in the request. Accepts an associative array of key-value pairs.
    • - *
    • meta - array - Optional - An associative array of key-value pairs. Any header with the x-amz-meta- prefix is considered user metadata and is stored with the Amazon S3 object. It will be stored with the object and returned when you retrieve the object. The total size of the HTTP request, not including the body, must be less than 4 KB.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/API/RESTObjectCOPY.html Copying Amazon S3 Objects - */ - public function update_object($bucket, $filename, $opt = null) - { - if (!$opt) $opt = array(); - $opt['metadataDirective'] = 'REPLACE'; - - // Authenticate to S3 - return $this->copy_object( - array('bucket' => $bucket, 'filename' => $filename), - array('bucket' => $bucket, 'filename' => $filename), - $opt - ); - } - - - /*%******************************************************************************************%*/ - // ACCESS CONTROL LISTS - - /** - * Gets the access control list (ACL) settings for the specified Amazon S3 object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • versionId - string - Optional - The version of the object to retrieve. Version IDs are returned in the x-amz-version-id header of any previous object-related request.
    • - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAccessPolicy.html REST Access Control Policy - */ - public function get_object_acl($bucket, $filename, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'GET'; - $opt['resource'] = $filename; - $opt['sub_resource'] = 'acl'; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Sets the access control list (ACL) settings for the specified Amazon S3 object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param string $acl (Optional) The ACL settings for the specified object. Accepts any of the following constants: [Allowed values: AmazonS3::ACL_PRIVATE, AmazonS3::ACL_PUBLIC, AmazonS3::ACL_OPEN, AmazonS3::ACL_AUTH_READ, AmazonS3::ACL_OWNER_READ, AmazonS3::ACL_OWNER_FULL_CONTROL]. Alternatively, an array of associative arrays. Each associative array contains an id and a permission key. The default value is ACL_PRIVATE. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAccessPolicy.html REST Access Control Policy - */ - public function set_object_acl($bucket, $filename, $acl = self::ACL_PRIVATE, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'PUT'; - $opt['resource'] = $filename; - $opt['sub_resource'] = 'acl'; - - // Retrieve the original metadata - $metadata = $this->get_object_metadata($bucket, $filename); - if ($metadata && $metadata['ContentType']) - { - $opt['headers']['Content-Type'] = $metadata['ContentType']; - } - if ($metadata && $metadata['StorageClass']) - { - $opt['headers']['x-amz-storage-class'] = $metadata['StorageClass']; - } - - // Make sure these are defined. - // @codeCoverageIgnoreStart - if (!$this->credentials->canonical_id || !$this->credentials->canonical_name) - { - // Fetch the data live. - $canonical = $this->get_canonical_user_id(); - $this->credentials->canonical_id = $canonical['id']; - $this->credentials->canonical_name = $canonical['display_name']; - } - // @codeCoverageIgnoreEnd - - if (is_array($acl)) - { - $opt['body'] = $this->generate_access_policy($this->credentials->canonical_id, $this->credentials->canonical_name, $acl); - } - else - { - $opt['body'] = ''; - $opt['headers']['x-amz-acl'] = $acl; - } - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Generates the XML to be used for the Access Control Policy. - * - * @param string $canonical_id (Required) The canonical ID for the bucket owner. This is provided as the `id` return value from . - * @param string $canonical_name (Required) The canonical display name for the bucket owner. This is provided as the `display_name` value from . - * @param array $users (Optional) An array of associative arrays. Each associative array contains an `id` value and a `permission` value. - * @return string Access Control Policy XML. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_ACLs.html Access Control Lists - */ - public function generate_access_policy($canonical_id, $canonical_name, $users) - { - $xml = simplexml_load_string($this->base_acp_xml); - $owner = $xml->addChild('Owner'); - $owner->addChild('ID', $canonical_id); - $owner->addChild('DisplayName', $canonical_name); - $acl = $xml->addChild('AccessControlList'); - - foreach ($users as $user) - { - $grant = $acl->addChild('Grant'); - $grantee = $grant->addChild('Grantee'); - - switch ($user['id']) - { - // Authorized Users - case self::USERS_AUTH: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_AUTH); - break; - - // All Users - case self::USERS_ALL: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_ALL); - break; - - // The Logging User - case self::USERS_LOGGING: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_LOGGING); - break; - - // Email Address or Canonical Id - default: - if (strpos($user['id'], '@')) - { - $grantee->addAttribute('xsi:type', 'AmazonCustomerByEmail', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('EmailAddress', $user['id']); - } - else - { - // Assume Canonical Id - $grantee->addAttribute('xsi:type', 'CanonicalUser', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('ID', $user['id']); - } - break; - } - - $grant->addChild('Permission', $user['permission']); - } - - return $xml->asXML(); - } - - - /*%******************************************************************************************%*/ - // LOGGING METHODS - - /** - * Gets the access logs associated with the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. Pass a `null` value when using the method. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • preauth - integer|string - Optional - Specifies that a presigned URL for this request should be returned. May be passed as a number of seconds since UNIX Epoch, or any string compatible with .
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/ServerLogs.html Server Access Logging - */ - public function get_logs($bucket, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'GET'; - $opt['sub_resource'] = 'logging'; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Enables access logging for the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to enable logging for. Pass a `null` value when using the method. - * @param string $target_bucket (Required) The name of the bucket to store the logs in. - * @param string $target_prefix (Required) The prefix to give to the log file names. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • users - array - Optional - An array of associative arrays specifying any user to give access to. Each associative array contains an id and permission value.
    • - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/LoggingAPI.html Server Access Logging Configuration API - */ - public function enable_logging($bucket, $target_bucket, $target_prefix, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'PUT'; - $opt['sub_resource'] = 'logging'; - $opt['headers'] = array( - 'Content-Type' => 'application/xml' - ); - - $xml = simplexml_load_string($this->base_logging_xml); - $LoggingEnabled = $xml->addChild('LoggingEnabled'); - $LoggingEnabled->addChild('TargetBucket', $target_bucket); - $LoggingEnabled->addChild('TargetPrefix', $target_prefix); - $TargetGrants = $LoggingEnabled->addChild('TargetGrants'); - - if (isset($opt['users']) && is_array($opt['users'])) - { - foreach ($opt['users'] as $user) - { - $grant = $TargetGrants->addChild('Grant'); - $grantee = $grant->addChild('Grantee'); - - switch ($user['id']) - { - // Authorized Users - case self::USERS_AUTH: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_AUTH); - break; - - // All Users - case self::USERS_ALL: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_ALL); - break; - - // The Logging User - case self::USERS_LOGGING: - $grantee->addAttribute('xsi:type', 'Group', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('URI', self::USERS_LOGGING); - break; - - // Email Address or Canonical Id - default: - if (strpos($user['id'], '@')) - { - $grantee->addAttribute('xsi:type', 'AmazonCustomerByEmail', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('EmailAddress', $user['id']); - } - else - { - // Assume Canonical Id - $grantee->addAttribute('xsi:type', 'CanonicalUser', 'http://www.w3.org/2001/XMLSchema-instance'); - $grantee->addChild('ID', $user['id']); - } - break; - } - - $grant->addChild('Permission', $user['permission']); - } - } - - $opt['body'] = $xml->asXML(); - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - /** - * Disables access logging for the specified Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. Pass `null` if using . - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - * @link http://docs.amazonwebservices.com/AmazonS3/latest/dev/LoggingAPI.html Server Access Logging Configuration API - */ - public function disable_logging($bucket, $opt = null) - { - // Add this to our request - if (!$opt) $opt = array(); - $opt['verb'] = 'PUT'; - $opt['sub_resource'] = 'logging'; - $opt['headers'] = array( - 'Content-Type' => 'application/xml' - ); - $opt['body'] = $this->base_logging_xml; - - // Authenticate to S3 - return $this->authenticate($bucket, $opt); - } - - - /*%******************************************************************************************%*/ - // CONVENIENCE METHODS - - /** - * Gets whether or not the specified Amazon S3 bucket exists in Amazon S3. This includes buckets - * that do not belong to the caller. - * - * @param string $bucket (Required) The name of the bucket to use. - * @return boolean A value of true if the bucket exists, or a value of false if it does not. - */ - public function if_bucket_exists($bucket) - { - if ($this->use_batch_flow) - { - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - } - - $header = $this->get_bucket_headers($bucket); - return (bool) $header->isOK(); - } - - /** - * Gets whether or not the specified Amazon S3 object exists in the specified bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @return boolean A value of true if the object exists, or a value of false if it does not. - */ - public function if_object_exists($bucket, $filename) - { - if ($this->use_batch_flow) - { - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - } - - $header = $this->get_object_headers($bucket, $filename); - - if ($header->isOK()) { return true; } - elseif ($header->status === 404) { return false; } - - // @codeCoverageIgnoreStart - return null; - // @codeCoverageIgnoreEnd - } - - /** - * Gets whether or not the specified Amazon S3 bucket has a bucket policy associated with it. - * - * @param string $bucket (Required) The name of the bucket to use. - * @return boolean A value of true if a bucket policy exists, or a value of false if one does not. - */ - public function if_bucket_policy_exists($bucket) - { - if ($this->use_batch_flow) - { - // @codeCoverageIgnoreStart - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - // @codeCoverageIgnoreEnd - } - - $response = $this->get_bucket_policy($bucket); - - if ($response->isOK()) { return true; } - elseif ($response->status === 404) { return false; } - - // @codeCoverageIgnoreStart - return null; - // @codeCoverageIgnoreEnd - } - - /** - * Gets the number of Amazon S3 objects in the specified bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @return integer The number of Amazon S3 objects in the bucket. - */ - public function get_bucket_object_count($bucket) - { - if ($this->use_batch_flow) - { - // @codeCoverageIgnoreStart - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - // @codeCoverageIgnoreEnd - } - - return count($this->get_object_list($bucket)); - } - - /** - * Gets the cumulative file size of the contents of the Amazon S3 bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param boolean $friendly_format (Optional) A value of true will format the return value to 2 decimal points using the largest possible unit (i.e., 3.42 GB). A value of false will format the return value as the raw number of bytes. - * @return integer|string The number of bytes as an integer, or the friendly format as a string. - */ - public function get_bucket_filesize($bucket, $friendly_format = false) - { - if ($this->use_batch_flow) - { - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - } - - $filesize = 0; - $list = $this->list_objects($bucket); - - foreach ($list->body->Contents as $filename) - { - $filesize += (integer) $filename->Size; - } - - while ((string) $list->body->IsTruncated === 'true') - { - $body = (array) $list->body; - $list = $this->list_objects($bucket, array( - 'marker' => (string) end($body['Contents'])->Key - )); - - foreach ($list->body->Contents as $object) - { - $filesize += (integer) $object->Size; - } - } - - if ($friendly_format) - { - $filesize = $this->util->size_readable($filesize); - } - - return $filesize; - } - - /** - * Gets the file size of the specified Amazon S3 object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param boolean $friendly_format (Optional) A value of true will format the return value to 2 decimal points using the largest possible unit (i.e., 3.42 GB). A value of false will format the return value as the raw number of bytes. - * @return integer|string The number of bytes as an integer, or the friendly format as a string. - */ - public function get_object_filesize($bucket, $filename, $friendly_format = false) - { - if ($this->use_batch_flow) - { - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - } - - $object = $this->get_object_headers($bucket, $filename); - $filesize = (integer) $object->header['content-length']; - - if ($friendly_format) - { - $filesize = $this->util->size_readable($filesize); - } - - return $filesize; - } - - /** - * Changes the content type for an existing Amazon S3 object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param string $contentType (Required) The content-type to apply to the object. - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function change_content_type($bucket, $filename, $contentType, $opt = null) - { - if (!$opt) $opt = array(); - - // Retrieve the original metadata - $metadata = $this->get_object_metadata($bucket, $filename); - if ($metadata && $metadata['ACL']) - { - $opt['acl'] = $metadata['ACL']; - } - if ($metadata && $metadata['StorageClass']) - { - $opt['headers']['x-amz-storage-class'] = $metadata['StorageClass']; - } - - // Merge optional parameters - $opt = array_merge_recursive(array( - 'headers' => array( - 'Content-Type' => $contentType - ), - 'metadataDirective' => 'COPY' - ), $opt); - - return $this->copy_object( - array('bucket' => $bucket, 'filename' => $filename), - array('bucket' => $bucket, 'filename' => $filename), - $opt - ); - } - - /** - * Changes the storage redundancy for an existing object. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param string $filename (Required) The file name for the object. - * @param string $storage (Required) The storage setting to apply to the object. [Allowed values: AmazonS3::STORAGE_STANDARD, AmazonS3::STORAGE_REDUCED] - * @param array $opt (Optional) An associative array of parameters that can have the following keys:
      - *
    • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
    • - *
    • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.
    - * @return CFResponse A object containing a parsed HTTP response. - */ - public function change_storage_redundancy($bucket, $filename, $storage, $opt = null) - { - if (!$opt) $opt = array(); - - // Retrieve the original metadata - $metadata = $this->get_object_metadata($bucket, $filename); - if ($metadata && $metadata['ACL']) - { - $opt['acl'] = $metadata['ACL']; - } - if ($metadata && $metadata['ContentType']) - { - $opt['headers']['Content-Type'] = $metadata['ContentType']; - } - - // Merge optional parameters - $opt = array_merge(array( - 'storage' => $storage, - 'metadataDirective' => 'COPY', - ), $opt); - - return $this->copy_object( - array('bucket' => $bucket, 'filename' => $filename), - array('bucket' => $bucket, 'filename' => $filename), - $opt - ); - } - - /** - * Gets a simplified list of bucket names on an Amazon S3 account. - * - * @param string $pcre (Optional) A Perl-Compatible Regular Expression (PCRE) to filter the bucket names against. - * @return array The list of matching bucket names. If there are no results, the method will return an empty array. - * @link http://php.net/pcre Regular Expressions (Perl-Compatible) - */ - public function get_bucket_list($pcre = null) - { - if ($this->use_batch_flow) - { - throw new S3_Exception(__FUNCTION__ . '() cannot be batch requested'); - } - - // Get a list of buckets. - $list = $this->list_buckets(); - if ($list = $list->body->query('descendant-or-self::Name')) - { - $list = $list->map_string($pcre); - return $list; - } - - // @codeCoverageIgnoreStart - return array(); - // @codeCoverageIgnoreEnd - } - - /** - * Gets a simplified list of Amazon S3 object file names contained in a bucket. - * - * @param string $bucket (Required) The name of the bucket to use. - * @param array $opt (Optional) An associative array of parameters that can have the following keys: -
    +
    t('Security Warning');?> t('No secure random number generator is available, please enable the PHP OpenSSL extension.');?>
    @@ -27,7 +27,7 @@
    -
    +
    t('Security Warning');?> t('Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root.');?>
    From 995b5c073922afd5d4fae00cad7e1bfc87c0ac73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 23 Nov 2012 15:51:57 +0100 Subject: [PATCH 339/481] readd fallback code for pre token links --- apps/files_sharing/public.php | 346 ++++++++++++++++++++-------------- core/js/share.js | 22 ++- lib/public/share.php | 2 +- 3 files changed, 219 insertions(+), 151 deletions(-) diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index d680a87fa7..ac24736873 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -19,6 +19,24 @@ if (isset($_GET['token'])) { \OCP\Util::writeLog('files_sharing', 'You have files that are shared by link originating from ownCloud 4.0. Redistribute the new links, because backwards compatibility will be removed in ownCloud 5.', \OCP\Util::WARN); } } + +function getID($path) { + // use the share table from the db to find the item source if the file was reshared because shared files + //are not stored in the file cache. + if (substr(OC_Filesystem::getMountPoint($path), -7, 6) == "Shared") { + $path_parts = explode('/', $path, 5); + $user = $path_parts[1]; + $intPath = '/'.$path_parts[4]; + $query = \OC_DB::prepare('SELECT `item_source` FROM `*PREFIX*share` WHERE `uid_owner` = ? AND `file_target` = ? '); + $result = $query->execute(array($user, $intPath)); + $row = $result->fetchRow(); + $fileSource = $row['item_source']; + } else { + $fileSource = OC_Filecache::getId($path, ''); + } + + return $fileSource; +} // Enf of backward compatibility /** @@ -34,6 +52,7 @@ function getPathAndUser($id) { return $row; } + if (isset($_GET['t'])) { $token = $_GET['t']; $linkItem = OCP\Share::getShareByToken($token); @@ -59,166 +78,201 @@ if (isset($_GET['t'])) { //mount filesystem of file owner OC_Util::setupFS($fileOwner); - if (!isset($linkItem['item_type'])) { - OCP\Util::writeLog('share', 'No item type set for share id: '.$linkItem['id'], \OCP\Util::ERROR); - header('HTTP/1.0 404 Not Found'); - $tmpl = new OCP\Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); - } - if (isset($linkItem['share_with'])) { - // Authenticate share_with - $url = OCP\Util::linkToPublic('files').'&t='.$token; - if (isset($_GET['file'])) { - $url .= '&file='.urlencode($_GET['file']); - } else if (isset($_GET['dir'])) { - $url .= '&dir='.urlencode($_GET['dir']); - } - if (isset($_POST['password'])) { - $password = $_POST['password']; - if ($linkItem['share_type'] == OCP\Share::SHARE_TYPE_LINK) { - // Check Password - $forcePortable = (CRYPT_BLOWFISH != 1); - $hasher = new PasswordHash(8, $forcePortable); - if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $linkItem['share_with']))) { - $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); - $tmpl->assign('URL', $url); - $tmpl->assign('error', true); - $tmpl->printPage(); - exit(); - } else { - // Save item id in session for future requests - $_SESSION['public_link_authenticated'] = $linkItem['id']; - } - } else { - OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type'].' for share id '.$linkItem['id'], \OCP\Util::ERROR); - header('HTTP/1.0 404 Not Found'); - $tmpl = new OCP\Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); - } - // Check if item id is set in session - } else if (!isset($_SESSION['public_link_authenticated']) || $_SESSION['public_link_authenticated'] !== $linkItem['id']) { - // Prompt for password + } + } +} else if (isset($_GET['file']) || isset($_GET['dir'])) { + OCP\Util::writeLog('share', 'Missing token, trying fallback file/dir links', \OCP\Util::DEBUG); + if (isset($_GET['dir'])) { + $type = 'folder'; + $path = $_GET['dir']; + if(strlen($path)>1 and substr($path, -1, 1)==='/') { + $path=substr($path, 0, -1); + } + $baseDir = $path; + $dir = $baseDir; + } else { + $type = 'file'; + $path = $_GET['file']; + if(strlen($path)>1 and substr($path, -1, 1)==='/') { + $path=substr($path, 0, -1); + } + } + $shareOwner = substr($path, 1, strpos($path, '/', 1) - 1); + + if (OCP\User::userExists($shareOwner)) { + OC_Util::setupFS($shareOwner); + $fileSource = getId($path); + if ($fileSource != -1 ) { + $linkItem = OCP\Share::getItemSharedWithByLink($type, $fileSource, $shareOwner); + $pathAndUser['path'] = $path; + $path_parts = explode('/', $path, 5); + $pathAndUser['user'] = $path_parts[1]; + $fileOwner = $path_parts[1]; + } + } +} + +if ($linkItem) { + if (!isset($linkItem['item_type'])) { + OCP\Util::writeLog('share', 'No item type set for share id: '.$linkItem['id'], \OCP\Util::ERROR); + header('HTTP/1.0 404 Not Found'); + $tmpl = new OCP\Template('', '404', 'guest'); + $tmpl->printPage(); + exit(); + } + if (isset($linkItem['share_with'])) { + // Authenticate share_with + $url = OCP\Util::linkToPublic('files').'&t='.$token; + if (isset($_GET['file'])) { + $url .= '&file='.urlencode($_GET['file']); + } else if (isset($_GET['dir'])) { + $url .= '&dir='.urlencode($_GET['dir']); + } + if (isset($_POST['password'])) { + $password = $_POST['password']; + if ($linkItem['share_type'] == OCP\Share::SHARE_TYPE_LINK) { + // Check Password + $forcePortable = (CRYPT_BLOWFISH != 1); + $hasher = new PasswordHash(8, $forcePortable); + if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $linkItem['share_with']))) { $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); $tmpl->assign('URL', $url); + $tmpl->assign('error', true); $tmpl->printPage(); exit(); + } else { + // Save item id in session for future requests + $_SESSION['public_link_authenticated'] = $linkItem['id']; } - } - $basePath = substr($pathAndUser['path'] , strlen('/'.$fileOwner.'/files')); - $path = $basePath; - if (isset($_GET['path'])) { - $path .= $_GET['path']; - } - if (!$path || !OC_Filesystem::isValidPath($path) || !OC_Filesystem::file_exists($path)) { - OCP\Util::writeLog('share', 'Invalid path '.$path.' for share id '.$linkItem['id'], \OCP\Util::ERROR); + } else { + OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type'].' for share id '.$linkItem['id'], \OCP\Util::ERROR); header('HTTP/1.0 404 Not Found'); $tmpl = new OCP\Template('', '404', 'guest'); $tmpl->printPage(); exit(); } - $dir = dirname($path); - $file = basename($path); - // Download the file - if (isset($_GET['download'])) { - if (isset($_GET['path']) && $_GET['path'] !== '' ) { - if ( isset($_GET['files']) ) { // download selected files - OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); - } else if (isset($_GET['path']) && $_GET['path'] != '' ) { // download a file from a shared directory - OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); - } else { // download the whole shared directory - OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); - } - } else { // download a single shared file - OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); - } - - } else { - OCP\Util::addStyle('files_sharing', 'public'); - OCP\Util::addScript('files_sharing', 'public'); - OCP\Util::addScript('files', 'fileactions'); - $tmpl = new OCP\Template('files_sharing', 'public', 'base'); - $tmpl->assign('uidOwner', $shareOwner); - $tmpl->assign('dir', $dir); - $tmpl->assign('filename', $file); - $tmpl->assign('mimetype', OC_Filesystem::getMimeType($path)); - if (isset($_GET['path'])) { - $getPath = $_GET['path']; - } else { - $getPath = ''; - } - // Show file list - if (OC_Filesystem::is_dir($path)) { - OCP\Util::addStyle('files', 'files'); - OCP\Util::addScript('files', 'files'); - OCP\Util::addScript('files', 'filelist'); - $files = array(); - $rootLength = strlen($basePath) + 1; - foreach (OC_Files::getDirectoryContent($path) as $i) { - $i['date'] = OCP\Util::formatDate($i['mtime']); - if ($i['type'] == 'file') { - $fileinfo = pathinfo($i['name']); - $i['basename'] = $fileinfo['filename']; - $i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : ''; - } - $i['directory'] = '/'.substr($i['directory'], $rootLength); - if ($i['directory'] == '/') { - $i['directory'] = ''; - } - $i['permissions'] = OCP\PERMISSION_READ; - $files[] = $i; - } - // Make breadcrumb - $breadcrumb = array(); - $pathtohere = ''; - - //add base breadcrumb - $breadcrumb[] = array('dir' => '/', 'name' => basename($basePath)); - - //add subdir breadcrumbs - foreach (explode('/', urldecode($_GET['path'])) as $i) { - if ($i != '') { - $pathtohere .= '/'.$i; - $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i); - } - } - - $list = new OCP\Template('files', 'part.list', ''); - $list->assign('files', $files, false); - $list->assign('publicListView', true); - $list->assign('baseURL', OCP\Util::linkToPublic('files').'&t='.$token.'&path=', false); - $list->assign('downloadURL', OCP\Util::linkToPublic('files').'&t='.$token.'&download&path=', false); - $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '' ); - $breadcrumbNav->assign('breadcrumb', $breadcrumb, false); - $breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files').'&t='.$token.'&path=', false); - $folder = new OCP\Template('files', 'index', ''); - $folder->assign('fileList', $list->fetchPage(), false); - $folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false); - $folder->assign('isCreatable', false); - $folder->assign('permissions', 0); - $folder->assign('files', $files); - $folder->assign('uploadMaxFilesize', 0); - $folder->assign('uploadMaxHumanFilesize', 0); - $folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); - $tmpl->assign('folder', $folder->fetchPage(), false); - $tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); - $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&t='.$token.'&download&path='.urlencode($getPath)); - } else { - // Show file preview if viewer is available - if ($type == 'file') { - $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&t='.$token.'&download'); - } else { - $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&t='.$token.'&download&path='.urlencode($getPath)); - } - } - $tmpl->printPage(); - } + // Check if item id is set in session + } else if (!isset($_SESSION['public_link_authenticated']) || $_SESSION['public_link_authenticated'] !== $linkItem['id']) { + // Prompt for password + $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); + $tmpl->assign('URL', $url); + $tmpl->printPage(); exit(); } } + $basePath = substr($pathAndUser['path'] , strlen('/'.$fileOwner.'/files')); + $path = $basePath; + if (isset($_GET['path'])) { + $path .= $_GET['path']; + } + if (!$path || !OC_Filesystem::isValidPath($path) || !OC_Filesystem::file_exists($path)) { + OCP\Util::writeLog('share', 'Invalid path '.$path.' for share id '.$linkItem['id'], \OCP\Util::ERROR); + header('HTTP/1.0 404 Not Found'); + $tmpl = new OCP\Template('', '404', 'guest'); + $tmpl->printPage(); + exit(); + } + $dir = dirname($path); + $file = basename($path); + // Download the file + if (isset($_GET['download'])) { + if (isset($_GET['path']) && $_GET['path'] !== '' ) { + if ( isset($_GET['files']) ) { // download selected files + OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); + } else if (isset($_GET['path']) && $_GET['path'] != '' ) { // download a file from a shared directory + OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); + } else { // download the whole shared directory + OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); + } + } else { // download a single shared file + OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); + } + + } else { + OCP\Util::addStyle('files_sharing', 'public'); + OCP\Util::addScript('files_sharing', 'public'); + OCP\Util::addScript('files', 'fileactions'); + $tmpl = new OCP\Template('files_sharing', 'public', 'base'); + $tmpl->assign('uidOwner', $shareOwner); + $tmpl->assign('dir', $dir); + $tmpl->assign('filename', $file); + $tmpl->assign('mimetype', OC_Filesystem::getMimeType($path)); + if (isset($_GET['path'])) { + $getPath = $_GET['path']; + } else { + $getPath = ''; + } + // + $urlLinkIdentifiers= (isset($token)?'&t='.$token:'').(isset($_GET['dir'])?'&dir='.$_GET['dir']:'').(isset($_GET['file'])?'&file='.$_GET['file']:''); + // Show file list + if (OC_Filesystem::is_dir($path)) { + OCP\Util::addStyle('files', 'files'); + OCP\Util::addScript('files', 'files'); + OCP\Util::addScript('files', 'filelist'); + $files = array(); + $rootLength = strlen($basePath) + 1; + foreach (OC_Files::getDirectoryContent($path) as $i) { + $i['date'] = OCP\Util::formatDate($i['mtime']); + if ($i['type'] == 'file') { + $fileinfo = pathinfo($i['name']); + $i['basename'] = $fileinfo['filename']; + $i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : ''; + } + $i['directory'] = '/'.substr($i['directory'], $rootLength); + if ($i['directory'] == '/') { + $i['directory'] = ''; + } + $i['permissions'] = OCP\PERMISSION_READ; + $files[] = $i; + } + // Make breadcrumb + $breadcrumb = array(); + $pathtohere = ''; + + //add base breadcrumb + $breadcrumb[] = array('dir' => '/', 'name' => basename($basePath)); + + //add subdir breadcrumbs + foreach (explode('/', urldecode($_GET['path'])) as $i) { + if ($i != '') { + $pathtohere .= '/'.$i; + $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i); + } + } + + $list = new OCP\Template('files', 'part.list', ''); + $list->assign('files', $files, false); + $list->assign('publicListView', true); + $list->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false); + $list->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path=', false); + $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '' ); + $breadcrumbNav->assign('breadcrumb', $breadcrumb, false); + $breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false); + $folder = new OCP\Template('files', 'index', ''); + $folder->assign('fileList', $list->fetchPage(), false); + $folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false); + $folder->assign('isCreatable', false); + $folder->assign('permissions', 0); + $folder->assign('files', $files); + $folder->assign('uploadMaxFilesize', 0); + $folder->assign('uploadMaxHumanFilesize', 0); + $folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); + $tmpl->assign('folder', $folder->fetchPage(), false); + $tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); + $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path='.urlencode($getPath)); + } else { + // Show file preview if viewer is available + if ($type == 'file') { + $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download'); + } else { + $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path='.urlencode($getPath)); + } + } + $tmpl->printPage(); + } + exit(); } else { - OCP\Util::writeLog('share', 'Missing token', \OCP\Util::DEBUG); + OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG); } header('HTTP/1.0 404 Not Found'); $tmpl = new OCP\Template('', '404', 'guest'); diff --git a/core/js/share.js b/core/js/share.js index 879befd95b..0f71ae2241 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -179,7 +179,7 @@ OC.Share={ if (data.shares) { $.each(data.shares, function(index, share) { if (share.share_type == OC.Share.SHARE_TYPE_LINK) { - OC.Share.showLink(share.token, share.share_with); + OC.Share.showLink(share.token, share.share_with, itemSource); } else { if (share.collection) { OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions, share.collection); @@ -323,10 +323,24 @@ OC.Share={ $('#expiration').show(); } }, - showLink:function(token, password) { + showLink:function(token, password, itemSource) { OC.Share.itemShares[OC.Share.SHARE_TYPE_LINK] = true; $('#linkCheckbox').attr('checked', true); - var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&t='+token; + if (! token) { + //fallback to pre token link + var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + var type = $('tr').filterAttr('data-id', String(itemSource)).data('type'); + if ($('#dir').val() == '/') { + var file = $('#dir').val() + filename; + } else { + var file = $('#dir').val() + '/' + filename; + } + file = '/'+OC.currentUser+'/files'+file; + var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&'+type+'='+encodeURIComponent(file); + } else { + //TODO add path param when showing a link to file in a subfolder of a public link share + var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&t='+token; + } $('#linkText').val(link); $('#linkText').show('blind'); $('#showPassword').show(); @@ -473,7 +487,7 @@ $(document).ready(function() { if (this.checked) { // Create a link OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', OC.PERMISSION_READ, function(data) { - OC.Share.showLink(data.token); + OC.Share.showLink(data.token, null, itemSource); OC.Share.updateIcon(itemType, itemSource); }); } else { diff --git a/lib/public/share.php b/lib/public/share.php index 2ded31a42e..653ea64fa6 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -689,7 +689,7 @@ class Share { if (($itemType == 'file' || $itemType == 'folder') && $format == \OC_Share_Backend_File::FORMAT_FILE_APP || $format == \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT) { $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `uid_owner`, `share_type`, `share_with`, `file_source`, `path`, `file_target`, `permissions`, `expiration`, `name`, `ctime`, `mtime`, `mimetype`, `size`, `encrypted`, `versioned`, `writable`'; } else { - $select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`, `file_source`, `path`, `file_target`, `permissions`, `stime`, `expiration`'; + $select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`, `file_source`, `path`, `file_target`, `permissions`, `stime`, `expiration`, `token`'; } } else { $select = '*'; From fb5d0db0376f8f75fe6745fd1c94d5b325be4f41 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Fri, 23 Nov 2012 16:40:28 +0100 Subject: [PATCH 340/481] =?UTF-8?q?prettier=20error=20output.=20Let=C2=B4s?= =?UTF-8?q?=20see=20how=20many=20more=20low=20hanging=20fruits=20I=20find?= =?UTF-8?q?=20on=20my=20way=20to=20the=20real=20bug=20that=20I=20want=20to?= =?UTF-8?q?=20fix=20;-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/db.php | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/db.php b/lib/db.php index de42626563..687c49a021 100644 --- a/lib/db.php +++ b/lib/db.php @@ -168,7 +168,10 @@ class OC_DB { try{ self::$PDO=new PDO($dsn, $user, $pass, $opts); }catch(PDOException $e) { - echo( 'can not connect to database, using '.$type.'. ('.$e->getMessage().')'); + $error['error']='can not connect to database, using '.$type.'. ('.$e->getMessage().')'; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); die(); } // We always, really always want associative arrays @@ -263,9 +266,12 @@ class OC_DB { // Die if we could not connect if( PEAR::isError( self::$MDB2 )) { - echo( 'can not connect to database, using '.$type.'. ('.self::$MDB2->getUserInfo().')'); OC_Log::write('core', self::$MDB2->getUserInfo(), OC_Log::FATAL); OC_Log::write('core', self::$MDB2->getMessage(), OC_Log::FATAL); + $error['error']='can not connect to database, using '.$type.'. ('.self::$MDB2->getUserInfo().')'; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); die(); } @@ -326,7 +332,11 @@ class OC_DB { $entry .= 'Offending command was: '.htmlentities($query).'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - die( $entry ); + $error['error']=$entry; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } }else{ try{ @@ -336,7 +346,11 @@ class OC_DB { $entry .= 'Offending command was: '.htmlentities($query).'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - die( $entry ); + $error['error']=$entry; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } $result=new PDOStatementWrapper($result); } @@ -449,7 +463,11 @@ class OC_DB { // Die in case something went wrong if( $definition instanceof MDB2_Schema_Error ) { - die( $definition->getMessage().': '.$definition->getUserInfo()); + $error['error']=$definition->getMessage().': '.$definition->getUserInfo(); + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } if(OC_Config::getValue('dbtype', 'sqlite')==='oci') { unset($definition['charset']); //or MDB2 tries SHUTDOWN IMMEDIATE @@ -461,8 +479,11 @@ class OC_DB { // Die in case something went wrong if( $ret instanceof MDB2_Error ) { - echo (self::$MDB2->getDebugOutput()); - die ($ret->getMessage() . ': ' . $ret->getUserInfo()); + $error['error']=self::$MDB2->getDebugOutput().' '.$ret->getMessage() . ': ' . $ret->getUserInfo(); + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } return true; @@ -575,7 +596,11 @@ class OC_DB { $entry .= 'Offending command was: ' . $query . '
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - die( $entry ); + $error['error']=$entry; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } if($result->numRows() == 0) { @@ -607,7 +632,11 @@ class OC_DB { $entry .= 'Offending command was: ' . $query.'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: ' . $entry); - die( $entry ); + $error['error']=$entry; + $error['hint']=''; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); } return $result->execute(); From dde334239824b7a2b0829d2781d48b35da700111 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 24 Nov 2012 00:03:00 +0100 Subject: [PATCH 341/481] [tx-robot] updated from transifex --- apps/files/l10n/ar.php | 1 + apps/files/l10n/bg_BG.php | 1 - apps/files/l10n/ca.php | 2 +- apps/files/l10n/cs_CZ.php | 2 +- apps/files/l10n/da.php | 1 - apps/files/l10n/de.php | 1 - apps/files/l10n/de_DE.php | 1 - apps/files/l10n/el.php | 1 - apps/files/l10n/eo.php | 14 +++- apps/files/l10n/es.php | 1 - apps/files/l10n/es_AR.php | 2 +- apps/files/l10n/et_EE.php | 1 - apps/files/l10n/eu.php | 1 - apps/files/l10n/fa.php | 1 - apps/files/l10n/fi_FI.php | 1 - apps/files/l10n/fr.php | 1 - apps/files/l10n/gl.php | 1 - apps/files/l10n/he.php | 1 - apps/files/l10n/hr.php | 1 - apps/files/l10n/hu_HU.php | 1 - apps/files/l10n/id.php | 1 - apps/files/l10n/it.php | 2 +- apps/files/l10n/ja_JP.php | 1 - apps/files/l10n/ka_GE.php | 1 - apps/files/l10n/ko.php | 1 - apps/files/l10n/lb.php | 1 - apps/files/l10n/lt_LT.php | 1 - apps/files/l10n/lv.php | 1 - apps/files/l10n/mk.php | 1 - apps/files/l10n/ms_MY.php | 1 - apps/files/l10n/nb_NO.php | 1 - apps/files/l10n/nl.php | 1 - apps/files/l10n/oc.php | 1 - apps/files/l10n/pl.php | 1 - apps/files/l10n/pt_BR.php | 1 - apps/files/l10n/pt_PT.php | 2 +- apps/files/l10n/ro.php | 1 - apps/files/l10n/ru.php | 2 +- apps/files/l10n/ru_RU.php | 2 +- apps/files/l10n/si_LK.php | 1 - apps/files/l10n/sk_SK.php | 1 - apps/files/l10n/sl.php | 1 - apps/files/l10n/sr.php | 1 - apps/files/l10n/sv.php | 1 - apps/files/l10n/ta_LK.php | 1 - apps/files/l10n/th_TH.php | 1 - apps/files/l10n/tr.php | 1 - apps/files/l10n/uk.php | 1 - apps/files/l10n/vi.php | 1 - apps/files/l10n/zh_CN.GB2312.php | 1 - apps/files/l10n/zh_CN.php | 1 - apps/files/l10n/zh_TW.php | 1 - apps/user_webdavauth/l10n/eo.php | 3 + core/l10n/eo.php | 21 ++++- l10n/ar/files.po | 78 ++++++++--------- l10n/bg_BG/files.po | 76 ++++++++--------- l10n/ca/files.po | 78 ++++++++--------- l10n/cs_CZ/files.po | 78 ++++++++--------- l10n/da/files.po | 76 ++++++++--------- l10n/de/files.po | 76 ++++++++--------- l10n/de_DE/files.po | 76 ++++++++--------- l10n/el/files.po | 76 ++++++++--------- l10n/eo/core.po | 124 ++++++++++++++-------------- l10n/eo/files.po | 106 ++++++++++++------------ l10n/eo/user_webdavauth.po | 9 +- l10n/es/files.po | 76 ++++++++--------- l10n/es_AR/files.po | 78 ++++++++--------- l10n/et_EE/files.po | 76 ++++++++--------- l10n/eu/files.po | 76 ++++++++--------- l10n/fa/files.po | 76 ++++++++--------- l10n/fi_FI/files.po | 76 ++++++++--------- l10n/fr/files.po | 76 ++++++++--------- l10n/gl/files.po | 76 ++++++++--------- l10n/he/files.po | 76 ++++++++--------- l10n/hi/files.po | 76 ++++++++--------- l10n/hr/files.po | 76 ++++++++--------- l10n/hu_HU/files.po | 76 ++++++++--------- l10n/ia/files.po | 76 ++++++++--------- l10n/id/files.po | 76 ++++++++--------- l10n/it/files.po | 78 ++++++++--------- l10n/ja_JP/files.po | 76 ++++++++--------- l10n/ka_GE/files.po | 76 ++++++++--------- l10n/ko/files.po | 76 ++++++++--------- l10n/ku_IQ/files.po | 76 ++++++++--------- l10n/lb/files.po | 76 ++++++++--------- l10n/lt_LT/files.po | 76 ++++++++--------- l10n/lv/files.po | 76 ++++++++--------- l10n/mk/files.po | 76 ++++++++--------- l10n/ms_MY/files.po | 76 ++++++++--------- l10n/nb_NO/files.po | 76 ++++++++--------- l10n/nl/files.po | 76 ++++++++--------- l10n/nn_NO/files.po | 76 ++++++++--------- l10n/oc/files.po | 76 ++++++++--------- l10n/pl/files.po | 76 ++++++++--------- l10n/pl_PL/files.po | 76 ++++++++--------- l10n/pt_BR/files.po | 76 ++++++++--------- l10n/pt_PT/files.po | 79 +++++++++--------- l10n/ro/files.po | 76 ++++++++--------- l10n/ru/files.po | 78 ++++++++--------- l10n/ru_RU/files.po | 78 ++++++++--------- l10n/si_LK/files.po | 76 ++++++++--------- l10n/sk_SK/files.po | 76 ++++++++--------- l10n/sl/files.po | 76 ++++++++--------- l10n/sr/files.po | 76 ++++++++--------- l10n/sr@latin/files.po | 76 ++++++++--------- l10n/sv/files.po | 76 ++++++++--------- l10n/ta_LK/files.po | 76 ++++++++--------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 74 +++++++++-------- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/files.po | 76 ++++++++--------- l10n/tr/files.po | 76 ++++++++--------- l10n/uk/files.po | 76 ++++++++--------- l10n/vi/files.po | 76 ++++++++--------- l10n/zh_CN.GB2312/files.po | 76 ++++++++--------- l10n/zh_CN/files.po | 76 ++++++++--------- l10n/zh_HK/files.po | 76 ++++++++--------- l10n/zh_TW/files.po | 76 ++++++++--------- l10n/zu_ZA/files.po | 76 ++++++++--------- 126 files changed, 2522 insertions(+), 2406 deletions(-) create mode 100644 apps/user_webdavauth/l10n/eo.php diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php index 13d46911dc..2d22061154 100644 --- a/apps/files/l10n/ar.php +++ b/apps/files/l10n/ar.php @@ -6,6 +6,7 @@ "No file was uploaded" => "لم يتم ترفيع أي من الملفات", "Missing a temporary folder" => "المجلد المؤقت غير موجود", "Files" => "الملفات", +"Unshare" => "إلغاء مشاركة", "Delete" => "محذوف", "Close" => "إغلق", "Name" => "الاسم", diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php index 0a3bf02e95..1c847b453c 100644 --- a/apps/files/l10n/bg_BG.php +++ b/apps/files/l10n/bg_BG.php @@ -10,7 +10,6 @@ "Delete" => "Изтриване", "Upload Error" => "Грешка при качване", "Upload cancelled." => "Качването е отменено.", -"Invalid name, '/' is not allowed." => "Неправилно име – \"/\" не е позволено.", "Name" => "Име", "Size" => "Размер", "Modified" => "Променено", diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index dbfb56f818..a2d5bddbfc 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -28,7 +28,7 @@ "{count} files uploading" => "{count} fitxers en pujada", "Upload cancelled." => "La pujada s'ha cancel·lat.", "File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", -"Invalid name, '/' is not allowed." => "El nom no és vàlid, no es permet '/'.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "El nom de la carpeta no és vàlid. L'ús de \"Compartit\" està reservat per a OwnCloud", "{count} files scanned" => "{count} fitxers escannejats", "error while scanning" => "error durant l'escaneig", "Name" => "Nom", diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index 1409aada19..75613a34d2 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -28,7 +28,7 @@ "{count} files uploading" => "odesílám {count} souborů", "Upload cancelled." => "Odesílání zrušeno.", "File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky vyústí ve zrušení nahrávání.", -"Invalid name, '/' is not allowed." => "Neplatný název, znak '/' není povolen", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Neplatný název složky. Použití názvu \"Shared\" je rezervováno pro interní úžití službou Owncloud.", "{count} files scanned" => "prozkoumáno {count} souborů", "error while scanning" => "chyba při prohledávání", "Name" => "Název", diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php index 1f5fd87def..09eb61f976 100644 --- a/apps/files/l10n/da.php +++ b/apps/files/l10n/da.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} filer uploades", "Upload cancelled." => "Upload afbrudt.", "File upload is in progress. Leaving the page now will cancel the upload." => "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", -"Invalid name, '/' is not allowed." => "Ugyldigt navn, '/' er ikke tilladt.", "{count} files scanned" => "{count} filer skannet", "error while scanning" => "fejl under scanning", "Name" => "Navn", diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 16fa6cd98a..4abfc8c432 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} Dateien werden hochgeladen", "Upload cancelled." => "Upload abgebrochen.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", -"Invalid name, '/' is not allowed." => "Ungültiger Name: \"/\" ist nicht erlaubt.", "{count} files scanned" => "{count} Dateien wurden gescannt", "error while scanning" => "Fehler beim Scannen", "Name" => "Name", diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 07af6977e3..7ba7600a0d 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} Dateien wurden hochgeladen", "Upload cancelled." => "Upload abgebrochen.", "File upload is in progress. Leaving the page now will cancel the upload." => "Der Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", -"Invalid name, '/' is not allowed." => "Ungültiger Name: \"/\" ist nicht erlaubt.", "{count} files scanned" => "{count} Dateien wurden gescannt", "error while scanning" => "Fehler beim Scannen", "Name" => "Name", diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index 920ddf5759..a7da6e04a7 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} αρχεία ανεβαίνουν", "Upload cancelled." => "Η αποστολή ακυρώθηκε.", "File upload is in progress. Leaving the page now will cancel the upload." => "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Έξοδος από την σελίδα τώρα θα ακυρώσει την αποστολή.", -"Invalid name, '/' is not allowed." => "Μη έγκυρο όνομα, το '/' δεν επιτρέπεται.", "{count} files scanned" => "{count} αρχεία ανιχνεύτηκαν", "error while scanning" => "σφάλμα κατά την ανίχνευση", "Name" => "Όνομα", diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index dcd16d3f1f..70ac5ce684 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -10,23 +10,34 @@ "Unshare" => "Malkunhavigi", "Delete" => "Forigi", "Rename" => "Alinomigi", +"{new_name} already exists" => "{new_name} jam ekzistas", "replace" => "anstataŭigi", "suggest name" => "sugesti nomon", "cancel" => "nuligi", +"replaced {new_name}" => "anstataŭiĝis {new_name}", "undo" => "malfari", +"replaced {new_name} with {old_name}" => "anstataŭiĝis {new_name} per {old_name}", +"unshared {files}" => "malkunhaviĝis {files}", +"deleted {files}" => "foriĝis {files}", "generating ZIP-file, it may take some time." => "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo", "Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn", "Upload Error" => "Alŝuta eraro", "Close" => "Fermi", "Pending" => "Traktotaj", "1 file uploading" => "1 dosiero estas alŝutata", +"{count} files uploading" => "{count} dosieroj alŝutatas", "Upload cancelled." => "La alŝuto nuliĝis.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", -"Invalid name, '/' is not allowed." => "Nevalida nomo, “/” ne estas permesata.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nevalida nomo de dosierujo. Uzo de “Shared” rezervitas de Owncloud", +"{count} files scanned" => "{count} dosieroj skaniĝis", "error while scanning" => "eraro dum skano", "Name" => "Nomo", "Size" => "Grando", "Modified" => "Modifita", +"1 folder" => "1 dosierujo", +"{count} folders" => "{count} dosierujoj", +"1 file" => "1 dosiero", +"{count} files" => "{count} dosierujoj", "File handling" => "Dosieradministro", "Maximum upload size" => "Maksimuma alŝutogrando", "max. possible: " => "maks. ebla: ", @@ -38,6 +49,7 @@ "New" => "Nova", "Text file" => "Tekstodosiero", "Folder" => "Dosierujo", +"From link" => "El ligilo", "Upload" => "Alŝuti", "Cancel upload" => "Nuligi alŝuton", "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index cf45d10d02..7bc4fa64ae 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -28,7 +28,6 @@ "{count} files uploading" => "Subiendo {count} archivos", "Upload cancelled." => "Subida cancelada.", "File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Salir de la página ahora cancelará la subida.", -"Invalid name, '/' is not allowed." => "Nombre no válido, '/' no está permitido.", "{count} files scanned" => "{count} archivos escaneados", "error while scanning" => "error escaneando", "Name" => "Nombre", diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php index d2ab91fafd..2746e983eb 100644 --- a/apps/files/l10n/es_AR.php +++ b/apps/files/l10n/es_AR.php @@ -28,7 +28,7 @@ "{count} files uploading" => "Subiendo {count} archivos", "Upload cancelled." => "La subida fue cancelada", "File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.", -"Invalid name, '/' is not allowed." => "Nombre no válido, no se permite '/' en él.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nombre del directorio inválido. Usar \"Shared\" está reservado por ownCloud.", "{count} files scanned" => "{count} archivos escaneados", "error while scanning" => "error mientras se escaneaba", "Name" => "Nombre", diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index 73d5a286a9..66b6e69d69 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} faili üleslaadimist", "Upload cancelled." => "Üleslaadimine tühistati.", "File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", -"Invalid name, '/' is not allowed." => "Vigane nimi, '/' pole lubatud.", "{count} files scanned" => "{count} faili skännitud", "error while scanning" => "viga skännimisel", "Name" => "Nimi", diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index 57fc0ace99..dddb58e9cb 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -22,7 +22,6 @@ "1 file uploading" => "fitxategi 1 igotzen", "Upload cancelled." => "Igoera ezeztatuta", "File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", -"Invalid name, '/' is not allowed." => "Baliogabeko izena, '/' ezin da erabili. ", "error while scanning" => "errore bat egon da eskaneatzen zen bitartean", "Name" => "Izena", "Size" => "Tamaina", diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php index 640101b581..4bf0800fcd 100644 --- a/apps/files/l10n/fa.php +++ b/apps/files/l10n/fa.php @@ -18,7 +18,6 @@ "Close" => "بستن", "Pending" => "در انتظار", "Upload cancelled." => "بار گذاری لغو شد", -"Invalid name, '/' is not allowed." => "نام نامناسب '/' غیرفعال است", "Name" => "نام", "Size" => "اندازه", "Modified" => "تغییر یافته", diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index bd11e9c901..781cfaca3c 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -22,7 +22,6 @@ "Pending" => "Odottaa", "Upload cancelled." => "Lähetys peruttu.", "File upload is in progress. Leaving the page now will cancel the upload." => "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", -"Invalid name, '/' is not allowed." => "Virheellinen nimi, merkki '/' ei ole sallittu.", "Name" => "Nimi", "Size" => "Koko", "Modified" => "Muutettu", diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index bb299ace83..5170272c45 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} fichiers téléversés", "Upload cancelled." => "Chargement annulé.", "File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", -"Invalid name, '/' is not allowed." => "Nom invalide, '/' n'est pas autorisé.", "{count} files scanned" => "{count} fichiers indexés", "error while scanning" => "erreur lors de l'indexation", "Name" => "Nom", diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index a93920463a..43fdb459ad 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} ficheiros subíndose", "Upload cancelled." => "Subida cancelada.", "File upload is in progress. Leaving the page now will cancel the upload." => "A subida do ficheiro está en curso. Saír agora da páxina cancelará a subida.", -"Invalid name, '/' is not allowed." => "Nome non válido, '/' non está permitido.", "{count} files scanned" => "{count} ficheiros escaneados", "error while scanning" => "erro mentres analizaba", "Name" => "Nome", diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 1eac8093ef..78c249d894 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -15,7 +15,6 @@ "Close" => "סגירה", "Pending" => "ממתין", "Upload cancelled." => "ההעלאה בוטלה.", -"Invalid name, '/' is not allowed." => "שם לא חוקי, '/' אסור לשימוש.", "Name" => "שם", "Size" => "גודל", "Modified" => "זמן שינוי", diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php index 4c78ddfd74..a9bc1aa13b 100644 --- a/apps/files/l10n/hr.php +++ b/apps/files/l10n/hr.php @@ -22,7 +22,6 @@ "1 file uploading" => "1 datoteka se učitava", "Upload cancelled." => "Slanje poništeno.", "File upload is in progress. Leaving the page now will cancel the upload." => "Učitavanje datoteke. Napuštanjem stranice će prekinuti učitavanje.", -"Invalid name, '/' is not allowed." => "Neispravan naziv, znak '/' nije dozvoljen.", "error while scanning" => "grečka prilikom skeniranja", "Name" => "Naziv", "Size" => "Veličina", diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php index 584676a6b2..a0a84612d6 100644 --- a/apps/files/l10n/hu_HU.php +++ b/apps/files/l10n/hu_HU.php @@ -18,7 +18,6 @@ "Close" => "Bezár", "Pending" => "Folyamatban", "Upload cancelled." => "Feltöltés megszakítva", -"Invalid name, '/' is not allowed." => "Érvénytelen név, a '/' nem megengedett", "Name" => "Név", "Size" => "Méret", "Modified" => "Módosítva", diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php index cd356298a1..eba1d1e141 100644 --- a/apps/files/l10n/id.php +++ b/apps/files/l10n/id.php @@ -18,7 +18,6 @@ "Close" => "tutup", "Pending" => "Menunggu", "Upload cancelled." => "Pengunggahan dibatalkan.", -"Invalid name, '/' is not allowed." => "Kesalahan nama, '/' tidak diijinkan.", "Name" => "Nama", "Size" => "Ukuran", "Modified" => "Dimodifikasi", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index 155b8aa34c..ff213aec29 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -28,7 +28,7 @@ "{count} files uploading" => "{count} file in fase di caricamentoe", "Upload cancelled." => "Invio annullato", "File upload is in progress. Leaving the page now will cancel the upload." => "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", -"Invalid name, '/' is not allowed." => "Nome non valido", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nome della cartella non valido. L'uso di \"Shared\" è riservato a ownCloud", "{count} files scanned" => "{count} file analizzati", "error while scanning" => "errore durante la scansione", "Name" => "Nome", diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index c4c78545a7..50df005091 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} ファイルをアップロード中", "Upload cancelled." => "アップロードはキャンセルされました。", "File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", -"Invalid name, '/' is not allowed." => "無効な名前、'/' は使用できません。", "{count} files scanned" => "{count} ファイルをスキャン", "error while scanning" => "スキャン中のエラー", "Name" => "名前", diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php index 21676d7049..c6e1b23227 100644 --- a/apps/files/l10n/ka_GE.php +++ b/apps/files/l10n/ka_GE.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} ფაილი იტვირთება", "Upload cancelled." => "ატვირთვა შეჩერებულ იქნა.", "File upload is in progress. Leaving the page now will cancel the upload." => "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", -"Invalid name, '/' is not allowed." => "არასწორი სახელი, '/' არ დაიშვება.", "{count} files scanned" => "{count} ფაილი სკანირებულია", "error while scanning" => "შეცდომა სკანირებისას", "Name" => "სახელი", diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index b604740c77..ea3157c568 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} 파일 업로드중", "Upload cancelled." => "업로드 취소.", "File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다.", -"Invalid name, '/' is not allowed." => "잘못된 이름, '/' 은 허용이 되지 않습니다.", "{count} files scanned" => "{count} 파일 스캔되었습니다.", "error while scanning" => "스캔하는 도중 에러", "Name" => "이름", diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index cd669d2222..74eacab1f9 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -17,7 +17,6 @@ "Close" => "Zoumaachen", "Upload cancelled." => "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." => "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", -"Invalid name, '/' is not allowed." => "Ongültege Numm, '/' net erlaabt.", "Name" => "Numm", "Size" => "Gréisst", "Modified" => "Geännert", diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php index b2732bf92d..0db27ae0d5 100644 --- a/apps/files/l10n/lt_LT.php +++ b/apps/files/l10n/lt_LT.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} įkeliami failai", "Upload cancelled." => "Įkėlimas atšauktas.", "File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.", -"Invalid name, '/' is not allowed." => "Pavadinime negali būti naudojamas ženklas \"/\".", "{count} files scanned" => "{count} praskanuoti failai", "error while scanning" => "klaida skanuojant", "Name" => "Pavadinimas", diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php index 24b46f5331..4911db7aa3 100644 --- a/apps/files/l10n/lv.php +++ b/apps/files/l10n/lv.php @@ -17,7 +17,6 @@ "Pending" => "Gaida savu kārtu", "Upload cancelled." => "Augšuplāde ir atcelta", "File upload is in progress. Leaving the page now will cancel the upload." => "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.", -"Invalid name, '/' is not allowed." => "Šis simbols '/', nav atļauts.", "Name" => "Nosaukums", "Size" => "Izmērs", "Modified" => "Izmainīts", diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php index 49d00fa45a..50b4735c36 100644 --- a/apps/files/l10n/mk.php +++ b/apps/files/l10n/mk.php @@ -14,7 +14,6 @@ "Close" => "Затвои", "Pending" => "Чека", "Upload cancelled." => "Преземањето е прекинато.", -"Invalid name, '/' is not allowed." => "неисправно име, '/' не е дозволено.", "Name" => "Име", "Size" => "Големина", "Modified" => "Променето", diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php index da3a3946b7..49bb8da879 100644 --- a/apps/files/l10n/ms_MY.php +++ b/apps/files/l10n/ms_MY.php @@ -16,7 +16,6 @@ "Close" => "Tutup", "Pending" => "Dalam proses", "Upload cancelled." => "Muatnaik dibatalkan.", -"Invalid name, '/' is not allowed." => "penggunaa nama tidak sah, '/' tidak dibenarkan.", "Name" => "Nama ", "Size" => "Saiz", "Modified" => "Dimodifikasi", diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php index eddcc035d1..ea36431d79 100644 --- a/apps/files/l10n/nb_NO.php +++ b/apps/files/l10n/nb_NO.php @@ -27,7 +27,6 @@ "{count} files uploading" => "{count} filer laster opp", "Upload cancelled." => "Opplasting avbrutt.", "File upload is in progress. Leaving the page now will cancel the upload." => "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.", -"Invalid name, '/' is not allowed." => "Ugyldig navn, '/' er ikke tillatt. ", "{count} files scanned" => "{count} filer lest inn", "error while scanning" => "feil under skanning", "Name" => "Navn", diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index b1137e5770..fee3f0831c 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} bestanden aan het uploaden", "Upload cancelled." => "Uploaden geannuleerd.", "File upload is in progress. Leaving the page now will cancel the upload." => "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", -"Invalid name, '/' is not allowed." => "Ongeldige naam, '/' is niet toegestaan.", "{count} files scanned" => "{count} bestanden gescanned", "error while scanning" => "Fout tijdens het scannen", "Name" => "Naam", diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php index 69d7db43b9..7e35ecf338 100644 --- a/apps/files/l10n/oc.php +++ b/apps/files/l10n/oc.php @@ -21,7 +21,6 @@ "1 file uploading" => "1 fichièr al amontcargar", "Upload cancelled." => "Amontcargar anullat.", "File upload is in progress. Leaving the page now will cancel the upload." => "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ", -"Invalid name, '/' is not allowed." => "Nom invalid, '/' es pas permis.", "error while scanning" => "error pendant l'exploracion", "Name" => "Nom", "Size" => "Talha", diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index 999275a3bd..80b3551181 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} przesyłanie plików", "Upload cancelled." => "Wczytywanie anulowane.", "File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Teraz opuszczając stronę wysyłanie zostanie anulowane.", -"Invalid name, '/' is not allowed." => "Nieprawidłowa nazwa '/' jest niedozwolone.", "{count} files scanned" => "{count} pliki skanowane", "error while scanning" => "Wystąpił błąd podczas skanowania", "Name" => "Nazwa", diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index f9203ec1cc..bf92ffe42e 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -28,7 +28,6 @@ "{count} files uploading" => "Enviando {count} arquivos", "Upload cancelled." => "Envio cancelado.", "File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.", -"Invalid name, '/' is not allowed." => "Nome inválido, '/' não é permitido.", "{count} files scanned" => "{count} arquivos scaneados", "error while scanning" => "erro durante verificação", "Name" => "Nome", diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index 93b87e405b..266a282d6e 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -28,7 +28,7 @@ "{count} files uploading" => "A carregar {count} ficheiros", "Upload cancelled." => "O envio foi cancelado.", "File upload is in progress. Leaving the page now will cancel the upload." => "Envio de ficheiro em progresso. Irá cancelar o envio se sair da página agora.", -"Invalid name, '/' is not allowed." => "Nome inválido, '/' não permitido.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nome de pasta inválido! O uso de \"Shared\" (Partilhado) está reservado pelo OwnCloud", "{count} files scanned" => "{count} ficheiros analisados", "error while scanning" => "erro ao analisar", "Name" => "Nome", diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php index 22eb954e7e..ce57e3ff84 100644 --- a/apps/files/l10n/ro.php +++ b/apps/files/l10n/ro.php @@ -22,7 +22,6 @@ "1 file uploading" => "un fișier se încarcă", "Upload cancelled." => "Încărcare anulată.", "File upload is in progress. Leaving the page now will cancel the upload." => "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.", -"Invalid name, '/' is not allowed." => "Nume invalid, '/' nu este permis.", "error while scanning" => "eroare la scanarea", "Name" => "Nume", "Size" => "Dimensiune", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index eca3236f57..6961c538b4 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -28,7 +28,7 @@ "{count} files uploading" => "{count} файлов загружается", "Upload cancelled." => "Загрузка отменена.", "File upload is in progress. Leaving the page now will cancel the upload." => "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку.", -"Invalid name, '/' is not allowed." => "Неверное имя, '/' не допускается.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Не правильное имя папки. Имя \"Shared\" резервировано в Owncloud", "{count} files scanned" => "{count} файлов просканировано", "error while scanning" => "ошибка во время санирования", "Name" => "Название", diff --git a/apps/files/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php index 5f9747f359..59021ea99a 100644 --- a/apps/files/l10n/ru_RU.php +++ b/apps/files/l10n/ru_RU.php @@ -28,7 +28,7 @@ "{count} files uploading" => "{количество} загружено файлов", "Upload cancelled." => "Загрузка отменена", "File upload is in progress. Leaving the page now will cancel the upload." => "Процесс загрузки файла. Если покинуть страницу сейчас, загрузка будет отменена.", -"Invalid name, '/' is not allowed." => "Неправильное имя, '/' не допускается.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Некорректное имя папки. Нименование \"Опубликовано\" зарезервировано ownCloud", "{count} files scanned" => "{количество} файлов отсканировано", "error while scanning" => "ошибка при сканировании", "Name" => "Имя", diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php index 90451e403e..241e52558d 100644 --- a/apps/files/l10n/si_LK.php +++ b/apps/files/l10n/si_LK.php @@ -20,7 +20,6 @@ "1 file uploading" => "1 ගොනුවක් උඩගත කෙරේ", "Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", -"Invalid name, '/' is not allowed." => "අවලංගු නමක්. '/' ට අවසර නැත", "error while scanning" => "පරීක්ෂා කිරීමේදී දෝෂයක්", "Name" => "නම", "Size" => "ප්‍රමාණය", diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index ae625ae71b..4c379e899a 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} súborov odosielaných", "Upload cancelled." => "Odosielanie zrušené", "File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", -"Invalid name, '/' is not allowed." => "Chybný názov, \"/\" nie je povolené", "{count} files scanned" => "{count} súborov prehľadaných", "error while scanning" => "chyba počas kontroly", "Name" => "Meno", diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index 3e9a3b117e..62cf7f7206 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -28,7 +28,6 @@ "{count} files uploading" => "nalagam {count} datotek", "Upload cancelled." => "Pošiljanje je preklicano.", "File upload is in progress. Leaving the page now will cancel the upload." => "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", -"Invalid name, '/' is not allowed." => "Neveljavno ime. Znak '/' ni dovoljen.", "{count} files scanned" => "{count} files scanned", "error while scanning" => "napaka med pregledovanjem datotek", "Name" => "Ime", diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index 6c5fdd3934..e16ac0a313 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -28,7 +28,6 @@ "{count} files uploading" => "Шаље се {count} датотека", "Upload cancelled." => "Слање је прекинуто.", "File upload is in progress. Leaving the page now will cancel the upload." => "Слање датотеке је у току. Ако сада напустите страну слање ће бити прекинуто.", -"Invalid name, '/' is not allowed." => "Грешка у имену, '/' није дозвољено.", "{count} files scanned" => "{count} датотека се скенира", "error while scanning" => "грешка у скенирању", "Name" => "Име", diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index 64e7134641..dbac36b9a9 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} filer laddas upp", "Upload cancelled." => "Uppladdning avbruten.", "File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", -"Invalid name, '/' is not allowed." => "Ogiltigt namn, '/' är inte tillåten.", "{count} files scanned" => "{count} filer skannade", "error while scanning" => "fel vid skanning", "Name" => "Namn", diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php index 7018f3080e..0bd4b173c0 100644 --- a/apps/files/l10n/ta_LK.php +++ b/apps/files/l10n/ta_LK.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{எண்ணிக்கை} கோப்புகள் பதிவேற்றப்படுகின்றது", "Upload cancelled." => "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது", "File upload is in progress. Leaving the page now will cancel the upload." => "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", -"Invalid name, '/' is not allowed." => "செல்லுபடியற்ற பெயர், '/ ' அனுமதிக்கப்படமாட்டாது", "{count} files scanned" => "{எண்ணிக்கை} கோப்புகள் வருடப்பட்டது", "error while scanning" => "வருடும் போதான வழு", "Name" => "பெயர்", diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php index 3352dc1311..4bd7abfffe 100644 --- a/apps/files/l10n/th_TH.php +++ b/apps/files/l10n/th_TH.php @@ -28,7 +28,6 @@ "{count} files uploading" => "กำลังอัพโหลด {count} ไฟล์", "Upload cancelled." => "การอัพโหลดถูกยกเลิก", "File upload is in progress. Leaving the page now will cancel the upload." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", -"Invalid name, '/' is not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง '/' ไม่อนุญาตให้ใช้งาน", "{count} files scanned" => "สแกนไฟล์แล้ว {count} ไฟล์", "error while scanning" => "พบข้อผิดพลาดในระหว่างการสแกนไฟล์", "Name" => "ชื่อ", diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index 9dd56497f2..e657f02df6 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -20,7 +20,6 @@ "Pending" => "Bekliyor", "Upload cancelled." => "Yükleme iptal edildi.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.", -"Invalid name, '/' is not allowed." => "Geçersiz isim, '/' işaretine izin verilmiyor.", "Name" => "Ad", "Size" => "Boyut", "Modified" => "Değiştirilme", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index e2b99d899d..ac826d27cb 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -27,7 +27,6 @@ "{count} files uploading" => "{count} файлів завантажується", "Upload cancelled." => "Завантаження перервано.", "File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.", -"Invalid name, '/' is not allowed." => "Некоректне ім'я, '/' не дозволено.", "{count} files scanned" => "{count} файлів проскановано", "error while scanning" => "помилка при скануванні", "Name" => "Ім'я", diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php index 16138e722a..9140a24f2f 100644 --- a/apps/files/l10n/vi.php +++ b/apps/files/l10n/vi.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} tập tin đang tải lên", "Upload cancelled." => "Hủy tải lên", "File upload is in progress. Leaving the page now will cancel the upload." => "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", -"Invalid name, '/' is not allowed." => "Tên không hợp lệ ,không được phép dùng '/'", "{count} files scanned" => "{count} tập tin đã được quét", "error while scanning" => "lỗi trong khi quét", "Name" => "Tên", diff --git a/apps/files/l10n/zh_CN.GB2312.php b/apps/files/l10n/zh_CN.GB2312.php index 362d31ecda..e3c85820e4 100644 --- a/apps/files/l10n/zh_CN.GB2312.php +++ b/apps/files/l10n/zh_CN.GB2312.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} 个文件正在上传", "Upload cancelled." => "上传取消了", "File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传。关闭页面会取消上传。", -"Invalid name, '/' is not allowed." => "非法文件名,\"/\"是不被许可的", "{count} files scanned" => "{count} 个文件已扫描", "error while scanning" => "扫描出错", "Name" => "名字", diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index c9a3ab26c5..03efc3f22e 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -28,7 +28,6 @@ "{count} files uploading" => "{count} 个文件上传中", "Upload cancelled." => "上传已取消", "File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。", -"Invalid name, '/' is not allowed." => "非法的名称,不允许使用‘/’。", "{count} files scanned" => "{count} 个文件已扫描。", "error while scanning" => "扫描时出错", "Name" => "名称", diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php index 12910078fa..fd3d1b6099 100644 --- a/apps/files/l10n/zh_TW.php +++ b/apps/files/l10n/zh_TW.php @@ -18,7 +18,6 @@ "Close" => "關閉", "Upload cancelled." => "上傳取消", "File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中. 離開此頁面將會取消上傳.", -"Invalid name, '/' is not allowed." => "無效的名稱, '/'是不被允許的", "Name" => "名稱", "Size" => "大小", "Modified" => "修改", diff --git a/apps/user_webdavauth/l10n/eo.php b/apps/user_webdavauth/l10n/eo.php new file mode 100644 index 0000000000..b4a2652d33 --- /dev/null +++ b/apps/user_webdavauth/l10n/eo.php @@ -0,0 +1,3 @@ + "WebDAV-a URL: http://" +); diff --git a/core/l10n/eo.php b/core/l10n/eo.php index 0c114816ef..b61dbf1427 100644 --- a/core/l10n/eo.php +++ b/core/l10n/eo.php @@ -1,13 +1,21 @@ "Ne proviziĝis tipon de kategorio.", "No category to add?" => "Ĉu neniu kategorio estas aldonota?", "This category already exists: " => "Ĉi tiu kategorio jam ekzistas: ", +"Object type not provided." => "Ne proviziĝis tipon de objekto.", +"%s ID not provided." => "Ne proviziĝis ID-on de %s.", "No categories selected for deletion." => "Neniu kategorio elektiĝis por forigo.", "Settings" => "Agordo", "seconds ago" => "sekundoj antaŭe", "1 minute ago" => "antaŭ 1 minuto", +"{minutes} minutes ago" => "antaŭ {minutes} minutoj", +"1 hour ago" => "antaŭ 1 horo", +"{hours} hours ago" => "antaŭ {hours} horoj", "today" => "hodiaŭ", "yesterday" => "hieraŭ", +"{days} days ago" => "antaŭ {days} tagoj", "last month" => "lastamonate", +"{months} months ago" => "antaŭ {months} monatoj", "months ago" => "monatoj antaŭe", "last year" => "lastajare", "years ago" => "jaroj antaŭe", @@ -16,10 +24,15 @@ "No" => "Ne", "Yes" => "Jes", "Ok" => "Akcepti", +"The object type is not specified." => "Ne indikiĝis tipo de la objekto.", "Error" => "Eraro", +"The app name is not specified." => "Ne indikiĝis nomo de la aplikaĵo.", +"The required file {file} is not installed!" => "La necesa dosiero {file} ne instaliĝis!", "Error while sharing" => "Eraro dum kunhavigo", "Error while unsharing" => "Eraro dum malkunhavigo", "Error while changing permissions" => "Eraro dum ŝanĝo de permesoj", +"Shared with you and the group {group} by {owner}" => "Kunhavigita kun vi kaj la grupo {group} de {owner}", +"Shared with you by {owner}" => "Kunhavigita kun vi de {owner}", "Share with" => "Kunhavigi kun", "Share with link" => "Kunhavigi per ligilo", "Password protect" => "Protekti per pasvorto", @@ -29,6 +42,7 @@ "Share via email:" => "Kunhavigi per retpoŝto:", "No people found" => "Ne troviĝis gento", "Resharing is not allowed" => "Rekunhavigo ne permesatas", +"Shared in {item} with {user}" => "Kunhavigita en {item} kun {user}", "Unshare" => "Malkunhavigi", "can edit" => "povas redakti", "access control" => "alirkontrolo", @@ -42,6 +56,7 @@ "ownCloud password reset" => "La pasvorto de ownCloud restariĝis.", "Use the following link to reset your password: {link}" => "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", "You will receive a link to reset your password via Email." => "Vi ricevos ligilon retpoŝte por rekomencigi vian pasvorton.", +"Request failed!" => "Peto malsukcesis!", "Username" => "Uzantonomo", "Request reset" => "Peti rekomencigon", "Your password was reset" => "Via pasvorto rekomencis", @@ -90,10 +105,14 @@ "December" => "Decembro", "web services under your control" => "TTT-servoj sub via kontrolo", "Log out" => "Elsaluti", +"Please change your password to secure your account again." => "Bonvolu ŝanĝi vian pasvorton por sekurigi vian konton ree.", "Lost your password?" => "Ĉu vi perdis vian pasvorton?", "remember" => "memori", "Log in" => "Ensaluti", "You are logged out." => "Vi estas elsalutita.", "prev" => "maljena", -"next" => "jena" +"next" => "jena", +"Security Warning!" => "Sekureca averto!", +"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "Bonvolu kontroli vian pasvorton.
    Pro sekureco, oni okaze povas peti al vi enigi vian pasvorton ree.", +"Verify" => "Kontroli" ); diff --git a/l10n/ar/files.po b/l10n/ar/files.po index c7236bc6f2..5e2107a9a3 100644 --- a/l10n/ar/files.po +++ b/l10n/ar/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "" msgid "Files" msgstr "الملفات" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" -msgstr "" +msgstr "إلغاء مشاركة" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "محذوف" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "إغلق" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "الاسم" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "حجم" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "معدل" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/bg_BG/files.po b/l10n/bg_BG/files.po index fa9a6ce363..c2e3a6dc7a 100644 --- a/l10n/bg_BG/files.po +++ b/l10n/bg_BG/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Грешка при запис на диска" msgid "Files" msgstr "Файлове" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Изтриване" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Грешка при качване" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Качването е отменено." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Неправилно име – \"/\" не е позволено." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Име" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Размер" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Променено" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/ca/files.po b/l10n/ca/files.po index ae6a05ec45..4275de50fa 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Ha fallat en escriure al disc" msgid "Files" msgstr "Fitxers" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Deixa de compartir" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Suprimeix" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Reanomena" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} ja existeix" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "substitueix" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugereix un nom" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancel·la" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "s'ha substituït {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "desfés" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "s'ha substituït {old_name} per {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "no compartits {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "eliminats {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "s'estan generant fitxers ZIP, pot trigar una estona." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Error en la pujada" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Tanca" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendents" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 fitxer pujant" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} fitxers en pujada" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "La pujada s'ha cancel·lat." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "El nom no és vàlid, no es permet '/'." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "El nom de la carpeta no és vàlid. L'ús de \"Compartit\" està reservat per a OwnCloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} fitxers escannejats" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "error durant l'escaneig" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nom" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Mida" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificat" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 carpeta" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} carpetes" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fitxer" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} fitxers" diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index f49b0a0b12..9a02c9fbf0 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Zápis na disk selhal" msgid "Files" msgstr "Soubory" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Zrušit sdílení" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Smazat" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Přejmenovat" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} již existuje" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "nahradit" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "navrhnout název" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "zrušit" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "nahrazeno {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "zpět" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "nahrazeno {new_name} s {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "sdílení zrušeno pro {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "smazáno {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generuji ZIP soubor, může to nějakou dobu trvat." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nelze odeslat Váš soubor, protože je to adresář nebo má velikost 0 bajtů" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Chyba odesílání" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zavřít" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Čekající" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "odesílá se 1 soubor" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "odesílám {count} souborů" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Odesílání zrušeno." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Probíhá odesílání souboru. Opuštění stránky vyústí ve zrušení nahrávání." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Neplatný název, znak '/' není povolen" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Neplatný název složky. Použití názvu \"Shared\" je rezervováno pro interní úžití službou Owncloud." -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "prozkoumáno {count} souborů" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "chyba při prohledávání" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Název" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Velikost" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Změněno" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 složka" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} složky" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 soubor" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} soubory" diff --git a/l10n/da/files.po b/l10n/da/files.po index 4baf20dd7f..6a8a2bc88e 100644 --- a/l10n/da/files.po +++ b/l10n/da/files.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" @@ -58,132 +58,134 @@ msgstr "Fejl ved skrivning til disk." msgid "Files" msgstr "Filer" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Fjern deling" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Slet" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Omdøb" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} eksisterer allerede" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "erstat" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "foreslå navn" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "fortryd" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "erstattede {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "fortryd" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "erstattede {new_name} med {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "ikke delte {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "slettede {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "genererer ZIP-fil, det kan tage lidt tid." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kunne ikke uploade din fil, da det enten er en mappe eller er tom" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Fejl ved upload" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Luk" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Afventer" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 fil uploades" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} filer uploades" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Upload afbrudt." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ugyldigt navn, '/' er ikke tilladt." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} filer skannet" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "fejl under scanning" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Navn" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Størrelse" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Ændret" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 mappe" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} mapper" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fil" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} filer" diff --git a/l10n/de/files.po b/l10n/de/files.po index 7ed252fd69..0134a285f0 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -23,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" @@ -67,132 +67,134 @@ msgstr "Fehler beim Schreiben auf die Festplatte" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Löschen" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Umbenennen" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} existiert bereits" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ersetzen" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Name vorschlagen" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "abbrechen" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} wurde ersetzt" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "rückgängig machen" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{old_name} ersetzt durch {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "Freigabe von {files} aufgehoben" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} gelöscht" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Erstelle ZIP-Datei. Dies kann eine Weile dauern." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Deine Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Fehler beim Upload" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Schließen" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ausstehend" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "Eine Datei wird hoch geladen" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} Dateien werden hochgeladen" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Upload abgebrochen." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ungültiger Name: \"/\" ist nicht erlaubt." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} Dateien wurden gescannt" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Name" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Größe" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Bearbeitet" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 Ordner" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} Ordner" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 Datei" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} Dateien" diff --git a/l10n/de_DE/files.po b/l10n/de_DE/files.po index 1eb593a172..0b8ace46ae 100644 --- a/l10n/de_DE/files.po +++ b/l10n/de_DE/files.po @@ -24,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:02+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" @@ -68,132 +68,134 @@ msgstr "Fehler beim Schreiben auf die Festplatte" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Löschen" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Umbenennen" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} existiert bereits" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ersetzen" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Name vorschlagen" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "abbrechen" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} wurde ersetzt" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "rückgängig machen" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{old_name} wurde ersetzt durch {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "Freigabe für {files} beendet" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} gelöscht" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Erstelle ZIP-Datei. Dies kann eine Weile dauern." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ihre Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Fehler beim Upload" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Schließen" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ausstehend" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 Datei wird hochgeladen" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} Dateien wurden hochgeladen" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Upload abgebrochen." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Der Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ungültiger Name: \"/\" ist nicht erlaubt." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} Dateien wurden gescannt" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Name" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Größe" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Bearbeitet" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 Ordner" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} Ordner" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 Datei" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} Dateien" diff --git a/l10n/el/files.po b/l10n/el/files.po index f867d19c3e..f5d245b261 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" @@ -57,132 +57,134 @@ msgstr "Αποτυχία εγγραφής στο δίσκο" msgid "Files" msgstr "Αρχεία" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Διακοπή κοινής χρήσης" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Διαγραφή" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Μετονομασία" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} υπάρχει ήδη" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "αντικατέστησε" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "συνιστώμενο όνομα" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "ακύρωση" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} αντικαταστάθηκε" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "αναίρεση" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "αντικαταστάθηκε το {new_name} με {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "μη διαμοιρασμένα {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "διαγραμμένα {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "παραγωγή αρχείου ZIP, ίσως διαρκέσει αρκετά." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Αδυναμία στην αποστολή του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Σφάλμα Αποστολής" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Κλείσιμο" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Εκκρεμεί" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 αρχείο ανεβαίνει" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} αρχεία ανεβαίνουν" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Η αποστολή ακυρώθηκε." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Έξοδος από την σελίδα τώρα θα ακυρώσει την αποστολή." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Μη έγκυρο όνομα, το '/' δεν επιτρέπεται." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} αρχεία ανιχνεύτηκαν" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "σφάλμα κατά την ανίχνευση" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Όνομα" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Μέγεθος" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Τροποποιήθηκε" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 φάκελος" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} φάκελοι" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 αρχείο" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} αρχεία" diff --git a/l10n/eo/core.po b/l10n/eo/core.po index 4204fc32e0..b6504a6e24 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 20:03+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Ne proviziĝis tipon de kategorio." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -36,13 +36,13 @@ msgstr "Ĉi tiu kategorio jam ekzistas: " #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Ne proviziĝis tipon de objekto." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "Ne proviziĝis ID-on de %s." #: ajax/vcategories/addToFavorites.php:35 #, php-format @@ -58,59 +58,59 @@ msgstr "Neniu kategorio elektiĝis por forigo." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Agordo" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekundoj antaŭe" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "antaŭ 1 minuto" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" -msgstr "" +msgstr "antaŭ {minutes} minutoj" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "antaŭ 1 horo" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "antaŭ {hours} horoj" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "hodiaŭ" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "hieraŭ" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" -msgstr "" +msgstr "antaŭ {days} tagoj" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "lastamonate" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "antaŭ {months} monatoj" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "monatoj antaŭe" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "lastajare" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "jaroj antaŭe" @@ -137,21 +137,21 @@ msgstr "Akcepti" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Ne indikiĝis tipo de la objekto." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 +#: js/share.js:539 msgid "Error" msgstr "Eraro" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "Ne indikiĝis nomo de la aplikaĵo." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "La necesa dosiero {file} ne instaliĝis!" #: js/share.js:124 msgid "Error while sharing" @@ -167,11 +167,11 @@ msgstr "Eraro dum ŝanĝo de permesoj" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr "Kunhavigita kun vi kaj la grupo {group} de {owner}" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "Kunhavigita kun vi de {owner}" #: js/share.js:158 msgid "Share with" @@ -212,7 +212,7 @@ msgstr "Rekunhavigo ne permesatas" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "Kunhavigita en {item} kun {user}" #: js/share.js:292 msgid "Unshare" @@ -242,15 +242,15 @@ msgstr "forigi" msgid "share" msgstr "kunhavigi" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:343 js/share.js:514 js/share.js:516 msgid "Password protected" msgstr "Protektita per pasvorto" -#: js/share.js:525 +#: js/share.js:527 msgid "Error unsetting expiration date" msgstr "Eraro dum malagordado de limdato" -#: js/share.js:537 +#: js/share.js:539 msgid "Error setting expiration date" msgstr "Eraro dum agordado de limdato" @@ -272,7 +272,7 @@ msgstr "" #: lostpassword/templates/lostpassword.php:8 msgid "Request failed!" -msgstr "" +msgstr "Peto malsukcesis!" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -405,87 +405,87 @@ msgstr "Datumbaza gastigo" msgid "Finish setup" msgstr "Fini la instalon" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "dimanĉo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "lundo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "mardo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "merkredo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "ĵaŭdo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "vendredo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "sabato" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januaro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februaro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Marto" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Aprilo" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Majo" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Junio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Julio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Aŭgusto" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Septembro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktobro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Novembro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Decembro" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "TTT-servoj sub via kontrolo" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Elsaluti" @@ -501,7 +501,7 @@ msgstr "" #: templates/login.php:10 msgid "Please change your password to secure your account again." -msgstr "" +msgstr "Bonvolu ŝanĝi vian pasvorton por sekurigi vian konton ree." #: templates/login.php:15 msgid "Lost your password?" @@ -529,14 +529,14 @@ msgstr "jena" #: templates/verify.php:5 msgid "Security Warning!" -msgstr "" +msgstr "Sekureca averto!" #: templates/verify.php:6 msgid "" "Please verify your password.
    For security reasons you may be " "occasionally asked to enter your password again." -msgstr "" +msgstr "Bonvolu kontroli vian pasvorton.
    Pro sekureco, oni okaze povas peti al vi enigi vian pasvorton ree." #: templates/verify.php:16 msgid "Verify" -msgstr "" +msgstr "Kontroli" diff --git a/l10n/eo/files.po b/l10n/eo/files.po index 6ad03a6507..d084a3d78e 100644 --- a/l10n/eo/files.po +++ b/l10n/eo/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -53,134 +53,136 @@ msgstr "Malsukcesis skribo al disko" msgid "Files" msgstr "Dosieroj" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Malkunhavigi" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Forigi" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Alinomigi" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" -msgstr "" +msgstr "{new_name} jam ekzistas" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "anstataŭigi" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugesti nomon" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "nuligi" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" -msgstr "" +msgstr "anstataŭiĝis {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "malfari" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" -msgstr "" +msgstr "anstataŭiĝis {new_name} per {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" -msgstr "" +msgstr "malkunhaviĝis {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" +msgstr "foriĝis {files}" + +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." msgstr "" -#: js/files.js:171 +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Alŝuta eraro" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Fermi" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Traktotaj" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 dosiero estas alŝutata" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" -msgstr "" +msgstr "{count} dosieroj alŝutatas" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "La alŝuto nuliĝis." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nevalida nomo, “/” ne estas permesata." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nevalida nomo de dosierujo. Uzo de “Shared” rezervitas de Owncloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" -msgstr "" +msgstr "{count} dosieroj skaniĝis" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "eraro dum skano" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nomo" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Grando" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modifita" -#: js/files.js:804 -msgid "1 folder" -msgstr "" - -#: js/files.js:806 -msgid "{count} folders" -msgstr "" - #: js/files.js:814 -msgid "1 file" -msgstr "" +msgid "1 folder" +msgstr "1 dosierujo" #: js/files.js:816 +msgid "{count} folders" +msgstr "{count} dosierujoj" + +#: js/files.js:824 +msgid "1 file" +msgstr "1 dosiero" + +#: js/files.js:826 msgid "{count} files" -msgstr "" +msgstr "{count} dosierujoj" #: templates/admin.php:5 msgid "File handling" @@ -228,7 +230,7 @@ msgstr "Dosierujo" #: templates/index.php:11 msgid "From link" -msgstr "" +msgstr "El ligilo" #: templates/index.php:22 msgid "Upload" diff --git a/l10n/eo/user_webdavauth.po b/l10n/eo/user_webdavauth.po index a01835c79f..cb6f7a4738 100644 --- a/l10n/eo/user_webdavauth.po +++ b/l10n/eo/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 19:41+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV-a URL: http://" diff --git a/l10n/es/files.po b/l10n/es/files.po index 292d7e54e7..8f2e46f3f6 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" @@ -57,132 +57,134 @@ msgstr "La escritura en disco ha fallado" msgid "Files" msgstr "Archivos" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Dejar de compartir" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Eliminar" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Renombrar" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} ya existe" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "reemplazar" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugerir nombre" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "reemplazado {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "deshacer" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "reemplazado {new_name} con {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} descompartidos" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} eliminados" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generando un fichero ZIP, puede llevar un tiempo." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No ha sido posible subir tu archivo porque es un directorio o tiene 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Error al subir el archivo" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "cerrrar" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendiente" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "subiendo 1 archivo" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "Subiendo {count} archivos" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Subida cancelada." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "La subida del archivo está en proceso. Salir de la página ahora cancelará la subida." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nombre no válido, '/' no está permitido." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} archivos escaneados" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "error escaneando" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nombre" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamaño" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificado" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 carpeta" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} carpetas" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 archivo" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} archivos" diff --git a/l10n/es_AR/files.po b/l10n/es_AR/files.po index ee8ec30a8b..95ef241cb6 100644 --- a/l10n/es_AR/files.po +++ b/l10n/es_AR/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "Error al escribir en el disco" msgid "Files" msgstr "Archivos" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Dejar de compartir" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Borrar" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Cambiar nombre" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} ya existe" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "reemplazar" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugerir nombre" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "reemplazado {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "deshacer" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "reemplazado {new_name} con {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} se dejaron de compartir" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} borrados" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generando un archivo ZIP, puede llevar un tiempo." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Error al subir el archivo" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Cerrar" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendiente" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "Subiendo 1 archivo" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "Subiendo {count} archivos" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "La subida fue cancelada" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nombre no válido, no se permite '/' en él." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nombre del directorio inválido. Usar \"Shared\" está reservado por ownCloud." -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} archivos escaneados" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "error mientras se escaneaba" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nombre" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamaño" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificado" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 directorio" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} directorios" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 archivo" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} archivos" diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index 6cf7b1f9df..2e801aef5d 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Kettale kirjutamine ebaõnnestus" msgid "Files" msgstr "Failid" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Lõpeta jagamine" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Kustuta" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "ümber" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} on juba olemas" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "asenda" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "soovita nime" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "loobu" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "asendatud nimega {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "tagasi" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "asendas nime {old_name} nimega {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "jagamata {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "kustutatud {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-faili loomine, see võib veidi aega võtta." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Üleslaadimise viga" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Sulge" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ootel" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 faili üleslaadimisel" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} faili üleslaadimist" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Üleslaadimine tühistati." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Vigane nimi, '/' pole lubatud." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} faili skännitud" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "viga skännimisel" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nimi" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Suurus" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Muudetud" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 kaust" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} kausta" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fail" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} faili" diff --git a/l10n/eu/files.po b/l10n/eu/files.po index 9d0b945285..a726851e13 100644 --- a/l10n/eu/files.po +++ b/l10n/eu/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Errore bat izan da diskoan idazterakoan" msgid "Files" msgstr "Fitxategiak" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Ez partekatu" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Ezabatu" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Berrizendatu" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ordeztu" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "aholkatu izena" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "ezeztatu" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "desegin" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-fitxategia sortzen ari da, denbora har dezake" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Igotzean errore bat suertatu da" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Itxi" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Zain" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "fitxategi 1 igotzen" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Igoera ezeztatuta" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Baliogabeko izena, '/' ezin da erabili. " - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "errore bat egon da eskaneatzen zen bitartean" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Izena" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamaina" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Aldatuta" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/fa/files.po b/l10n/fa/files.po index eb07a8b386..769af8c342 100644 --- a/l10n/fa/files.po +++ b/l10n/fa/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "نوشتن بر روی دیسک سخت ناموفق بود" msgid "Files" msgstr "فایل ها" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "پاک کردن" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "تغییرنام" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "جایگزین" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "لغو" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "بازگشت" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "در حال ساخت فایل فشرده ممکن است زمان زیادی به طول بیانجامد" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "خطا در بار گذاری" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "بستن" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "در انتظار" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "بار گذاری لغو شد" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "نام نامناسب '/' غیرفعال است" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "نام" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "اندازه" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "تغییر یافته" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/fi_FI/files.po b/l10n/fi_FI/files.po index 5c840fb95f..697ee9b096 100644 --- a/l10n/fi_FI/files.po +++ b/l10n/fi_FI/files.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" @@ -56,132 +56,134 @@ msgstr "Levylle kirjoitus epäonnistui" msgid "Files" msgstr "Tiedostot" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Peru jakaminen" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Poista" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Nimeä uudelleen" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} on jo olemassa" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "korvaa" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "ehdota nimeä" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "peru" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "kumoa" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "luodaan ZIP-tiedostoa, tämä saattaa kestää hetken." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Lähetysvirhe." -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Sulje" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Odottaa" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Lähetys peruttu." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Virheellinen nimi, merkki '/' ei ole sallittu." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nimi" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Koko" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Muutettu" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 kansio" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} kansiota" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 tiedosto" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} tiedostoa" diff --git a/l10n/fr/files.po b/l10n/fr/files.po index 29b78b65c8..0db7fb69f6 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" @@ -61,132 +61,134 @@ msgstr "Erreur d'écriture sur le disque" msgid "Files" msgstr "Fichiers" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Ne plus partager" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Supprimer" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Renommer" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} existe déjà" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "remplacer" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Suggérer un nom" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "annuler" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} a été replacé" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "annuler" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{new_name} a été remplacé par {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "Fichiers non partagés : {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "Fichiers supprimés : {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Fichier ZIP en cours d'assemblage ; cela peut prendre du temps." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossible de charger vos fichiers car il s'agit d'un dossier ou le fichier fait 0 octet." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Erreur de chargement" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Fermer" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "En cours" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 fichier en cours de téléchargement" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} fichiers téléversés" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Chargement annulé." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nom invalide, '/' n'est pas autorisé." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} fichiers indexés" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "erreur lors de l'indexation" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nom" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Taille" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modifié" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 dossier" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} dossiers" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fichier" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} fichiers" diff --git a/l10n/gl/files.po b/l10n/gl/files.po index 1c30fdcd66..d839df2c6d 100644 --- a/l10n/gl/files.po +++ b/l10n/gl/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Erro ao escribir no disco" msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Deixar de compartir" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Eliminar" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Mudar o nome" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "xa existe un {new_name}" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "substituír" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "suxerir nome" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "substituír {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "desfacer" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "substituír {new_name} polo {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} sen compartir" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} eliminados" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "xerando un ficheiro ZIP, o que pode levar un anaco." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Erro na subida" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Pechar" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendentes" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 ficheiro subíndose" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} ficheiros subíndose" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Subida cancelada." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "A subida do ficheiro está en curso. Saír agora da páxina cancelará a subida." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nome non válido, '/' non está permitido." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} ficheiros escaneados" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "erro mentres analizaba" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nome" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamaño" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificado" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 cartafol" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} cartafoles" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ficheiro" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} ficheiros" diff --git a/l10n/he/files.po b/l10n/he/files.po index bc7c52ce98..b8f2350e69 100644 --- a/l10n/he/files.po +++ b/l10n/he/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "הכתיבה לכונן נכשלה" msgid "Files" msgstr "קבצים" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "הסר שיתוף" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "מחיקה" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "יוצר קובץ ZIP, אנא המתן." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "שגיאת העלאה" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "סגירה" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "ממתין" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "ההעלאה בוטלה." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "שם לא חוקי, '/' אסור לשימוש." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "שם" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "גודל" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "זמן שינוי" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/hi/files.po b/l10n/hi/files.po index fe227425a6..9ec701fa3a 100644 --- a/l10n/hi/files.po +++ b/l10n/hi/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/hr/files.po b/l10n/hr/files.po index 89affe304c..4183f7f3a1 100644 --- a/l10n/hr/files.po +++ b/l10n/hr/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Neuspjelo pisanje na disk" msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Prekini djeljenje" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Briši" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Promjeni ime" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "zamjeni" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "predloži ime" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "odustani" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "vrati" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generiranje ZIP datoteke, ovo može potrajati." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nemoguće poslati datoteku jer je prazna ili je direktorij" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Pogreška pri slanju" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zatvori" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "U tijeku" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 datoteka se učitava" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Slanje poništeno." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Učitavanje datoteke. Napuštanjem stranice će prekinuti učitavanje." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Neispravan naziv, znak '/' nije dozvoljen." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "grečka prilikom skeniranja" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Naziv" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Veličina" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Zadnja promjena" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po index f4a6649f60..2b2f6202fd 100644 --- a/l10n/hu_HU/files.po +++ b/l10n/hu_HU/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Nem írható lemezre" msgid "Files" msgstr "Fájlok" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nem oszt meg" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Törlés" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "cserél" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "mégse" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "visszavon" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-fájl generálása, ez eltarthat egy ideig." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Feltöltési hiba" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Bezár" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Folyamatban" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Feltöltés megszakítva" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Érvénytelen név, a '/' nem megengedett" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Név" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Méret" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Módosítva" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/ia/files.po b/l10n/ia/files.po index 63466eaa70..8dfdf38562 100644 --- a/l10n/ia/files.po +++ b/l10n/ia/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "" msgid "Files" msgstr "Files" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Deler" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Clauder" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nomine" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Dimension" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificate" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/id/files.po b/l10n/id/files.po index 276ed6737d..23087ff74c 100644 --- a/l10n/id/files.po +++ b/l10n/id/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Gagal menulis ke disk" msgid "Files" msgstr "Berkas" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "batalkan berbagi" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Hapus" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "mengganti" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "batalkan" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "batal dikerjakan" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "membuat berkas ZIP, ini mungkin memakan waktu." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Gagal mengunggah berkas anda karena berupa direktori atau mempunyai ukuran 0 byte" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Terjadi Galat Pengunggahan" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "tutup" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Menunggu" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Pengunggahan dibatalkan." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Kesalahan nama, '/' tidak diijinkan." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nama" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Ukuran" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Dimodifikasi" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/it/files.po b/l10n/it/files.po index 995acf8669..36379bcbea 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Scrittura su disco non riuscita" msgid "Files" msgstr "File" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Rimuovi condivisione" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Elimina" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Rinomina" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} esiste già" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "sostituisci" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "suggerisci nome" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "annulla" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "sostituito {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "annulla" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "sostituito {new_name} con {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "non condivisi {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "eliminati {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "creazione file ZIP, potrebbe richiedere del tempo." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossibile inviare il file poiché è una cartella o ha dimensione 0 byte" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Errore di invio" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Chiudi" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "In corso" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 file in fase di caricamento" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} file in fase di caricamentoe" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Invio annullato" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nome non valido" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nome della cartella non valido. L'uso di \"Shared\" è riservato a ownCloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} file analizzati" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "errore durante la scansione" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nome" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Dimensione" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificato" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 cartella" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} cartelle" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 file" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} file" diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po index 9f067ba1ae..a1f5fe2d2b 100644 --- a/l10n/ja_JP/files.po +++ b/l10n/ja_JP/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "ディスクへの書き込みに失敗しました" msgid "Files" msgstr "ファイル" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "共有しない" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "削除" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "名前の変更" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} はすでに存在しています" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "置き換え" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "推奨名称" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "キャンセル" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} を置換" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "元に戻す" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{old_name} を {new_name} に置換" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "未共有 {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "削除 {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIPファイルを生成中です、しばらくお待ちください。" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "ディレクトリもしくは0バイトのファイルはアップロードできません" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "アップロードエラー" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "閉じる" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "保留" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "ファイルを1つアップロード中" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} ファイルをアップロード中" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "アップロードはキャンセルされました。" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "無効な名前、'/' は使用できません。" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} ファイルをスキャン" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "スキャン中のエラー" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "名前" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "サイズ" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "更新日時" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 フォルダ" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} フォルダ" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ファイル" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} ファイル" diff --git a/l10n/ka_GE/files.po b/l10n/ka_GE/files.po index 9416ea7490..4f49781aab 100644 --- a/l10n/ka_GE/files.po +++ b/l10n/ka_GE/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:02+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "შეცდომა დისკზე ჩაწერისას" msgid "Files" msgstr "ფაილები" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "გაზიარების მოხსნა" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "წაშლა" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "გადარქმევა" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} უკვე არსებობს" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "შეცვლა" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "სახელის შემოთავაზება" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "უარყოფა" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} შეცვლილია" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "დაბრუნება" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{new_name} შეცვლილია {old_name}–ით" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "გაზიარება მოხსნილი {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "წაშლილი {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-ფაილის გენერირება, ამას ჭირდება გარკვეული დრო." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "თქვენი ფაილის ატვირთვა ვერ მოხერხდა. ის არის საქაღალდე და შეიცავს 0 ბაიტს" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "შეცდომა ატვირთვისას" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "დახურვა" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "მოცდის რეჟიმში" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 ფაილის ატვირთვა" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} ფაილი იტვირთება" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "ატვირთვა შეჩერებულ იქნა." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "არასწორი სახელი, '/' არ დაიშვება." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} ფაილი სკანირებულია" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "შეცდომა სკანირებისას" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "სახელი" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "ზომა" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "შეცვლილია" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 საქაღალდე" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} საქაღალდე" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ფაილი" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} ფაილი" diff --git a/l10n/ko/files.po b/l10n/ko/files.po index b80f13128e..130e47f86c 100644 --- a/l10n/ko/files.po +++ b/l10n/ko/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "디스크에 쓰지 못했습니다" msgid "Files" msgstr "파일" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "공유해제" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "삭제" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "이름변경" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} 이미 존재함" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "대체" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "이름을 제안" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "취소" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} 으로 대체" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "복구" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{old_name}이 {new_name}으로 대체됨" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} 공유해제" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} 삭제됨" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP파일 생성에 시간이 걸릴 수 있습니다." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "업로드 에러" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "닫기" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "보류 중" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 파일 업로드중" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} 파일 업로드중" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "업로드 취소." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "잘못된 이름, '/' 은 허용이 되지 않습니다." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} 파일 스캔되었습니다." -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "스캔하는 도중 에러" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "이름" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "크기" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "수정됨" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 폴더" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} 폴더" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 파일" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} 파일" diff --git a/l10n/ku_IQ/files.po b/l10n/ku_IQ/files.po index 4e0e760a4d..c0defb5ff3 100644 --- a/l10n/ku_IQ/files.po +++ b/l10n/ku_IQ/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "داخستن" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "ناو" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/lb/files.po b/l10n/lb/files.po index 0d03eea1bf..c7272f47c0 100644 --- a/l10n/lb/files.po +++ b/l10n/lb/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "Konnt net op den Disk schreiwen" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Läschen" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ersetzen" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "ofbriechen" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "réckgängeg man" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Et gëtt eng ZIP-File generéiert, dëst ka bëssen daueren." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kann deng Datei net eroplueden well et en Dossier ass oder 0 byte grouss ass." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Fehler beim eroplueden" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zoumaachen" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Upload ofgebrach." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ongültege Numm, '/' net erlaabt." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Numm" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Gréisst" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Geännert" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/lt_LT/files.po b/l10n/lt_LT/files.po index f2e3f601cb..f8f471300e 100644 --- a/l10n/lt_LT/files.po +++ b/l10n/lt_LT/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Nepavyko įrašyti į diską" msgid "Files" msgstr "Failai" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nebesidalinti" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Ištrinti" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Pervadinti" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} jau egzistuoja" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "pakeisti" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "pasiūlyti pavadinimą" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "atšaukti" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "pakeiskite {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "anuliuoti" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "pakeiskite {new_name} į {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "nebesidalinti {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "ištrinti {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "kuriamas ZIP archyvas, tai gali užtrukti šiek tiek laiko." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Įkėlimo klaida" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Užverti" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Laukiantis" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "įkeliamas 1 failas" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} įkeliami failai" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Įkėlimas atšauktas." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Pavadinime negali būti naudojamas ženklas \"/\"." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} praskanuoti failai" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "klaida skanuojant" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Pavadinimas" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Dydis" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Pakeista" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 aplankalas" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} aplankalai" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 failas" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} failai" diff --git a/l10n/lv/files.po b/l10n/lv/files.po index c154d31f30..f14459f5d4 100644 --- a/l10n/lv/files.po +++ b/l10n/lv/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Nav iespējams saglabāt" msgid "Files" msgstr "Faili" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Pārtraukt līdzdalīšanu" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Izdzēst" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Pārdēvēt" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "aizvietot" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Ieteiktais nosaukums" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "atcelt" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "vienu soli atpakaļ" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "lai uzģenerētu ZIP failu, kāds brīdis ir jāpagaida" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nav iespējams augšuplādēt jūsu failu, jo tāds jau eksistē vai arī failam nav izmēra (0 baiti)" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Augšuplādēšanas laikā radās kļūda" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Gaida savu kārtu" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Augšuplāde ir atcelta" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Šis simbols '/', nav atļauts." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nosaukums" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Izmērs" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Izmainīts" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/mk/files.po b/l10n/mk/files.po index 29c94ce88c..94552927a6 100644 --- a/l10n/mk/files.po +++ b/l10n/mk/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Неуспеав да запишам на диск" msgid "Files" msgstr "Датотеки" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Избриши" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Се генерира ZIP фајлот, ќе треба извесно време." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Грешка при преземање" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Затвои" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Чека" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Преземањето е прекинато." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "неисправно име, '/' не е дозволено." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Име" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Големина" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Променето" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/ms_MY/files.po b/l10n/ms_MY/files.po index abdda74617..a82fa33e2c 100644 --- a/l10n/ms_MY/files.po +++ b/l10n/ms_MY/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Gagal untuk disimpan" msgid "Files" msgstr "fail" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Padam" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ganti" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "Batal" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "sedang menghasilkan fail ZIP, mungkin mengambil sedikit masa." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Muat naik ralat" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Tutup" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Dalam proses" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Muatnaik dibatalkan." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "penggunaa nama tidak sah, '/' tidak dibenarkan." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nama " -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Saiz" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Dimodifikasi" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/nb_NO/files.po b/l10n/nb_NO/files.po index fb0cb0530a..00340792cd 100644 --- a/l10n/nb_NO/files.po +++ b/l10n/nb_NO/files.po @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -59,132 +59,134 @@ msgstr "Klarte ikke å skrive til disk" msgid "Files" msgstr "Filer" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Avslutt deling" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Slett" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Omdøp" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} finnes allerede" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "erstatt" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "foreslå navn" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "avbryt" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "erstatt {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "angre" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "erstatt {new_name} med {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "slettet {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "opprettet ZIP-fil, dette kan ta litt tid" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kan ikke laste opp filen din siden det er en mappe eller den har 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Opplasting feilet" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Lukk" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ventende" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 fil lastes opp" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} filer laster opp" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Opplasting avbrutt." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ugyldig navn, '/' er ikke tillatt. " - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} filer lest inn" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "feil under skanning" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Navn" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Størrelse" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Endret" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 mappe" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} mapper" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fil" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} filer" diff --git a/l10n/nl/files.po b/l10n/nl/files.po index abf7c6eac4..0ae2725ed1 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -61,132 +61,134 @@ msgstr "Schrijven naar schijf mislukt" msgid "Files" msgstr "Bestanden" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Stop delen" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Verwijder" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Hernoem" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} bestaat al" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "vervang" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Stel een naam voor" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "annuleren" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "verving {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "ongedaan maken" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "verving {new_name} met {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "delen gestopt {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "verwijderde {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "aanmaken ZIP-file, dit kan enige tijd duren." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "uploaden van de file mislukt, het is of een directory of de bestandsgrootte is 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Upload Fout" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Sluit" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Wachten" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 bestand wordt ge-upload" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} bestanden aan het uploaden" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Uploaden geannuleerd." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ongeldige naam, '/' is niet toegestaan." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} bestanden gescanned" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "Fout tijdens het scannen" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Naam" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Bestandsgrootte" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Laatst aangepast" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 map" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} mappen" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 bestand" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} bestanden" diff --git a/l10n/nn_NO/files.po b/l10n/nn_NO/files.po index fd805408f7..04aa8f58b6 100644 --- a/l10n/nn_NO/files.po +++ b/l10n/nn_NO/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "" msgid "Files" msgstr "Filer" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Slett" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Lukk" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Namn" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Storleik" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Endra" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/oc/files.po b/l10n/oc/files.po index 7bc4c45373..b16d14fcb5 100644 --- a/l10n/oc/files.po +++ b/l10n/oc/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "L'escriptura sul disc a fracassat" msgid "Files" msgstr "Fichièrs" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Non parteja" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Escafa" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Torna nomenar" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "remplaça" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "nom prepausat" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "anulla" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "defar" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Fichièr ZIP a se far, aquò pòt trigar un briu." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossible d'amontcargar lo teu fichièr qu'es un repertòri o que ten pas que 0 octet." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Error d'amontcargar" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Al esperar" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 fichièr al amontcargar" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Amontcargar anullat." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. " -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nom invalid, '/' es pas permis." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "error pendant l'exploracion" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nom" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Talha" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificat" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/pl/files.po b/l10n/pl/files.po index 7dfe7b9385..f09de78d3d 100644 --- a/l10n/pl/files.po +++ b/l10n/pl/files.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" @@ -57,132 +57,134 @@ msgstr "Błąd zapisu na dysk" msgid "Files" msgstr "Pliki" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nie udostępniaj" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Usuwa element" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Zmień nazwę" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} już istnieje" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "zastap" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "zasugeruj nazwę" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "anuluj" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "zastąpiony {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "wróć" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "zastąpiony {new_name} z {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "Udostępniane wstrzymane {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "usunięto {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Generowanie pliku ZIP, może potrwać pewien czas." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nie można wczytać pliku jeśli jest katalogiem lub ma 0 bajtów" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Błąd wczytywania" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zamknij" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Oczekujące" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 plik wczytany" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} przesyłanie plików" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Wczytywanie anulowane." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Wysyłanie pliku jest w toku. Teraz opuszczając stronę wysyłanie zostanie anulowane." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nieprawidłowa nazwa '/' jest niedozwolone." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} pliki skanowane" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "Wystąpił błąd podczas skanowania" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nazwa" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Rozmiar" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Czas modyfikacji" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 folder" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} foldery" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 plik" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} pliki" diff --git a/l10n/pl_PL/files.po b/l10n/pl_PL/files.po index 7459cfd637..a8b37951e1 100644 --- a/l10n/pl_PL/files.po +++ b/l10n/pl_PL/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po index 2436c2687b..8a4dc474a0 100644 --- a/l10n/pt_BR/files.po +++ b/l10n/pt_BR/files.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:01+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -58,132 +58,134 @@ msgstr "Falha ao escrever no disco" msgid "Files" msgstr "Arquivos" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Descompartilhar" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Excluir" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Renomear" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} já existe" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "substituir" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugerir nome" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "substituído {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "desfazer" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "Substituído {old_name} por {new_name} " -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} não compartilhados" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} apagados" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "gerando arquivo ZIP, isso pode levar um tempo." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Erro de envio" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Fechar" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendente" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "enviando 1 arquivo" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "Enviando {count} arquivos" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Envio cancelado." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Upload em andamento. Sair da página agora resultará no cancelamento do envio." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nome inválido, '/' não é permitido." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} arquivos scaneados" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "erro durante verificação" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nome" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamanho" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificado" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 pasta" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} pastas" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 arquivo" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} arquivos" diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index a1c776b479..af49192a4b 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Duarte Velez Grilo , 2012. # , 2012. # Helder Meneses , 2012. @@ -11,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" @@ -55,132 +56,134 @@ msgstr "Falhou a escrita no disco" msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Deixar de partilhar" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Apagar" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Renomear" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "O nome {new_name} já existe" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "substituir" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "Sugira um nome" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "{new_name} substituido" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "desfazer" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "substituido {new_name} por {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "{files} não partilhado(s)" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} eliminado(s)" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "a gerar o ficheiro ZIP, poderá demorar algum tempo." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Não é possível fazer o envio do ficheiro devido a ser uma pasta ou ter 0 bytes" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Erro no envio" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Fechar" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pendente" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "A enviar 1 ficheiro" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "A carregar {count} ficheiros" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "O envio foi cancelado." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Envio de ficheiro em progresso. Irá cancelar o envio se sair da página agora." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nome inválido, '/' não permitido." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nome de pasta inválido! O uso de \"Shared\" (Partilhado) está reservado pelo OwnCloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} ficheiros analisados" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "erro ao analisar" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nome" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Tamanho" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificado" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 pasta" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} pastas" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ficheiro" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} ficheiros" diff --git a/l10n/ro/files.po b/l10n/ro/files.po index 59aef20b3d..bd191bd7f6 100644 --- a/l10n/ro/files.po +++ b/l10n/ro/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Eroare la scriere pe disc" msgid "Files" msgstr "Fișiere" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Anulează partajarea" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Șterge" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Redenumire" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "înlocuire" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "sugerează nume" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "anulare" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "Anulează ultima acțiune" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "se generază fișierul ZIP, va dura ceva timp." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nu s-a putut încărca fișierul tău deoarece pare să fie un director sau are 0 bytes." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Eroare la încărcare" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Închide" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "În așteptare" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "un fișier se încarcă" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Încărcare anulată." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Nume invalid, '/' nu este permis." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "eroare la scanarea" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Nume" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Dimensiune" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Modificat" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/ru/files.po b/l10n/ru/files.po index 806ee4afdb..880fc8a162 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" @@ -59,132 +59,134 @@ msgstr "Ошибка записи на диск" msgid "Files" msgstr "Файлы" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Отменить публикацию" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Удалить" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Переименовать" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} уже существует" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "заменить" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "предложить название" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "отмена" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "заменено {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "отмена" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "заменено {new_name} на {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "не опубликованные {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "удаленные {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "создание ZIP-файла, это может занять некоторое время." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Не удается загрузить файл размером 0 байт в каталог" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Ошибка загрузки" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Закрыть" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ожидание" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "загружается 1 файл" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} файлов загружается" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Загрузка отменена." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Неверное имя, '/' не допускается." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Не правильное имя папки. Имя \"Shared\" резервировано в Owncloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} файлов просканировано" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "ошибка во время санирования" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Название" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Размер" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Изменён" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 папка" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} папок" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 файл" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} файлов" diff --git a/l10n/ru_RU/files.po b/l10n/ru_RU/files.po index f7b4ade0f6..22c0f16561 100644 --- a/l10n/ru_RU/files.po +++ b/l10n/ru_RU/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Не удалось записать на диск" msgid "Files" msgstr "Файлы" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Скрыть" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Удалить" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Переименовать" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{новое_имя} уже существует" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "отмена" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "подобрать название" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "отменить" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "заменено {новое_имя}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "отменить действие" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "заменено {новое_имя} с {старое_имя}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "Cовместное использование прекращено {файлы}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "удалено {файлы}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Создание ZIP-файла, это может занять некоторое время." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Невозможно загрузить файл,\n так как он имеет нулевой размер или является директорией" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Ошибка загрузки" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Закрыть" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Ожидающий решения" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "загрузка 1 файла" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{количество} загружено файлов" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Загрузка отменена" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Процесс загрузки файла. Если покинуть страницу сейчас, загрузка будет отменена." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Неправильное имя, '/' не допускается." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Некорректное имя папки. Нименование \"Опубликовано\" зарезервировано ownCloud" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{количество} файлов отсканировано" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "ошибка при сканировании" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Имя" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Размер" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Изменен" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 папка" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{количество} папок" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 файл" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{количество} файлов" diff --git a/l10n/si_LK/files.po b/l10n/si_LK/files.po index 92e9855423..be2b925353 100644 --- a/l10n/si_LK/files.po +++ b/l10n/si_LK/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:02+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "තැටිගත කිරීම අසාර්ථකයි" msgid "Files" msgstr "ගොනු" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "නොබෙදු" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "මකන්න" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "නැවත නම් කරන්න" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ප්‍රතිස්ථාපනය කරන්න" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "නමක් යෝජනා කරන්න" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "අත් හරින්න" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "නිෂ්ප්‍රභ කරන්න" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ගොනුවක් සෑදෙමින් පවතී. කෙටි වේලාවක් ගත විය හැක" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "උඩුගත කිරීමේ දෝශයක්" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "වසන්න" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 ගොනුවක් උඩගත කෙරේ" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "උඩුගත කිරීම අත් හරින්න ලදී" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "අවලංගු නමක්. '/' ට අවසර නැත" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "පරීක්ෂා කිරීමේදී දෝෂයක්" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "නම" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "ප්‍රමාණය" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "වෙනස් කළ" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 ෆොල්ඩරයක්" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ගොනුවක්" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po index ec58f5c02b..5818cd909b 100644 --- a/l10n/sk_SK/files.po +++ b/l10n/sk_SK/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Zápis na disk sa nepodaril" msgid "Files" msgstr "Súbory" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Nezdielať" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Odstrániť" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Premenovať" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} už existuje" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "nahradiť" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "pomôcť s menom" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "zrušiť" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "prepísaný {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "vrátiť" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "prepísaný {new_name} súborom {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "zdieľanie zrušené pre {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "zmazané {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "generujem ZIP-súbor, môže to chvíľu trvať." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nemôžem nahrať súbor lebo je to priečinok alebo má 0 bajtov." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Chyba odosielania" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zavrieť" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Čaká sa" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 súbor sa posiela " -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} súborov odosielaných" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Odosielanie zrušené" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Opustenie stránky zruší práve prebiehajúce odosielanie súboru." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Chybný názov, \"/\" nie je povolené" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} súborov prehľadaných" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "chyba počas kontroly" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Meno" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Veľkosť" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Upravené" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 priečinok" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} priečinkov" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 súbor" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} súborov" diff --git a/l10n/sl/files.po b/l10n/sl/files.po index 7d47ab5f1a..6965f7fe5b 100644 --- a/l10n/sl/files.po +++ b/l10n/sl/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Pisanje na disk je spodletelo" msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Odstrani iz souporabe" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Izbriši" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Preimenuj" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} že obstaja" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "zamenjaj" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "predlagaj ime" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "prekliči" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "zamenjano je ime {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "razveljavi" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "zamenjano ime {new_name} z imenom {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "odstranjeno iz souporabe {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "izbrisano {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Ustvarjanje datoteke ZIP. To lahko traja nekaj časa." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Pošiljanje ni mogoče, saj gre za mapo, ali pa je datoteka velikosti 0 bajtov." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Napaka med nalaganjem" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zapri" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "V čakanju ..." -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "Pošiljanje 1 datoteke" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "nalagam {count} datotek" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Pošiljanje je preklicano." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Neveljavno ime. Znak '/' ni dovoljen." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} files scanned" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "napaka med pregledovanjem datotek" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Ime" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Velikost" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Spremenjeno" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 mapa" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} map" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 datoteka" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} datotek" diff --git a/l10n/sr/files.po b/l10n/sr/files.po index 8b4d82dafa..9680cc0fa4 100644 --- a/l10n/sr/files.po +++ b/l10n/sr/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "Није успело записивање на диск" msgid "Files" msgstr "Фајлови" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Укини дељење" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Обриши" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Преименуј" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} већ постоји" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "замени" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "предложи назив" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "поништи" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "замењена са {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "врати" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "замењено {new_name} са {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "укинуто дељење над {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "обриши {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "генерисање ЗИП датотеке, потрајаће неко време." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Није могуће послати датотеку или зато што је директоријуму или јој је величина 0 бајта" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Грешка у слању" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Затвори" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "На чекању" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 датотека се шаље" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "Шаље се {count} датотека" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Слање је прекинуто." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Слање датотеке је у току. Ако сада напустите страну слање ће бити прекинуто." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Грешка у имену, '/' није дозвољено." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} датотека се скенира" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "грешка у скенирању" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Име" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Величина" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Задња измена" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 директоријум" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} директоријума" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 датотека" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} датотека" diff --git a/l10n/sr@latin/files.po b/l10n/sr@latin/files.po index 653d11b478..c74c47a242 100644 --- a/l10n/sr@latin/files.po +++ b/l10n/sr@latin/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "" msgid "Files" msgstr "Fajlovi" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Obriši" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Zatvori" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Ime" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Veličina" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Zadnja izmena" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/sv/files.po b/l10n/sv/files.po index 258d024923..3d1c98ce1c 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" @@ -57,132 +57,134 @@ msgstr "Misslyckades spara till disk" msgid "Files" msgstr "Filer" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Sluta dela" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Radera" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Byt namn" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} finns redan" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "ersätt" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "föreslå namn" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "avbryt" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "ersatt {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "ångra" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "ersatt {new_name} med {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "stoppad delning {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "raderade {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "genererar ZIP-fil, det kan ta lite tid." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kunde inte ladda upp dina filer eftersom det antingen är en mapp eller har 0 bytes." -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Uppladdningsfel" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Stäng" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Väntar" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 filuppladdning" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} filer laddas upp" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Uppladdning avbruten." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Ogiltigt namn, '/' är inte tillåten." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} filer skannade" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "fel vid skanning" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Namn" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Storlek" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Ändrad" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 mapp" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} mappar" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 fil" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} filer" diff --git a/l10n/ta_LK/files.po b/l10n/ta_LK/files.po index a2e3bc061f..4f7d243f4e 100644 --- a/l10n/ta_LK/files.po +++ b/l10n/ta_LK/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:02+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" @@ -52,132 +52,134 @@ msgstr "வட்டில் எழுத முடியவில்லை" msgid "Files" msgstr "கோப்புகள்" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "பகிரப்படாதது" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "அழிக்க" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "பெயர்மாற்றம்" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} ஏற்கனவே உள்ளது" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "மாற்றிடுக" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "பெயரை பரிந்துரைக்க" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "இரத்து செய்க" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "மாற்றப்பட்டது {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "முன் செயல் நீக்கம் " -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "{new_name} ஆனது {old_name} இனால் மாற்றப்பட்டது" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "பகிரப்படாதது {கோப்புகள்}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "நீக்கப்பட்டது {கோப்புகள்}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr " ZIP கோப்பு உருவாக்கப்படுகின்றது, இது சில நேரம் ஆகலாம்." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "அடைவு அல்லது 0 bytes ஐ கொண்டுள்ளதால் உங்களுடைய கோப்பை பதிவேற்ற முடியவில்லை" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "பதிவேற்றல் வழு" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "மூடுக" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "நிலுவையிலுள்ள" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 கோப்பு பதிவேற்றப்படுகிறது" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{எண்ணிக்கை} கோப்புகள் பதிவேற்றப்படுகின்றது" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "செல்லுபடியற்ற பெயர், '/ ' அனுமதிக்கப்படமாட்டாது" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{எண்ணிக்கை} கோப்புகள் வருடப்பட்டது" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "வருடும் போதான வழு" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "பெயர்" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "அளவு" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "மாற்றப்பட்டது" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 கோப்புறை" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{எண்ணிக்கை} கோப்புறைகள்" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 கோப்பு" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{எண்ணிக்கை} கோப்புகள்" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 82689756f5..56d454f990 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 2a4bd33393..3d1b04ec5c 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 57014648fe..f8e2747aef 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 24b32bd5d6..522cf83723 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index b55d108883..c5b079fd8e 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 37b040560e..37ea370e04 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index d8b9e3ee3d..0745f27520 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 2fd3329664..91af1ab43b 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 31cf2a3a89..bf39bb3089 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 4654a2e6ed..c0d3a4fd82 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/files.po b/l10n/th_TH/files.po index a77f7915b4..ae327f9958 100644 --- a/l10n/th_TH/files.po +++ b/l10n/th_TH/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "เขียนข้อมูลลงแผ่นดิสก์ล้ msgid "Files" msgstr "ไฟล์" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "ยกเลิกการแชร์ข้อมูล" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "ลบ" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "เปลี่ยนชื่อ" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} มีอยู่แล้วในระบบ" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "แทนที่" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "แนะนำชื่อ" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "ยกเลิก" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "แทนที่ {new_name} แล้ว" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "เลิกทำ" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "แทนที่ {new_name} ด้วย {old_name} แล้ว" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "ยกเลิกการแชร์แล้ว {files} ไฟล์" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "ลบไฟล์แล้ว {files} ไฟล์" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "กำลังสร้างไฟล์บีบอัด ZIP อาจใช้เวลาสักครู่" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "ไม่สามารถอัพโหลดไฟล์ของคุณได้ เนื่องจากไฟล์ดังกล่าวเป็นไดเร็กทอรี่หรือมีขนาด 0 ไบต์" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "เกิดข้อผิดพลาดในการอัพโหลด" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "ปิด" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "อยู่ระหว่างดำเนินการ" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "กำลังอัพโหลดไฟล์ 1 ไฟล์" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "กำลังอัพโหลด {count} ไฟล์" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "การอัพโหลดถูกยกเลิก" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "ชื่อที่ใช้ไม่ถูกต้อง '/' ไม่อนุญาตให้ใช้งาน" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "สแกนไฟล์แล้ว {count} ไฟล์" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "พบข้อผิดพลาดในระหว่างการสแกนไฟล์" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "ชื่อ" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "ขนาด" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "ปรับปรุงล่าสุด" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 โฟลเดอร์" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} โฟลเดอร์" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 ไฟล์" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} ไฟล์" diff --git a/l10n/tr/files.po b/l10n/tr/files.po index 896335e170..b3be208531 100644 --- a/l10n/tr/files.po +++ b/l10n/tr/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "Diske yazılamadı" msgid "Files" msgstr "Dosyalar" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Paylaşılmayan" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Sil" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "İsim değiştir." -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "değiştir" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "iptal" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "geri al" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "ZIP dosyası oluşturuluyor, biraz sürebilir." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Yükleme hatası" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Kapat" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Bekliyor" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Yükleme iptal edildi." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Geçersiz isim, '/' işaretine izin verilmiyor." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Ad" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Boyut" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Değiştirilme" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/uk/files.po b/l10n/uk/files.po index e84a0bbc72..c1e2cd3499 100644 --- a/l10n/uk/files.po +++ b/l10n/uk/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Невдалося записати на диск" msgid "Files" msgstr "Файли" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Заборонити доступ" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Видалити" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Перейменувати" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} вже існує" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "заміна" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "запропонуйте назву" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "відміна" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "замінено {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "відмінити" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "замінено {new_name} на {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "видалено {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Створення ZIP-файлу, це може зайняти певний час." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Помилка завантаження" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Закрити" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Очікування" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 файл завантажується" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} файлів завантажується" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Завантаження перервано." -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Некоректне ім'я, '/' не дозволено." - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} файлів проскановано" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "помилка при скануванні" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Ім'я" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Розмір" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Змінено" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 папка" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} папок" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 файл" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} файлів" diff --git a/l10n/vi/files.po b/l10n/vi/files.po index db3f0397f8..c44fa3bfe7 100644 --- a/l10n/vi/files.po +++ b/l10n/vi/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "Không thể ghi " msgid "Files" msgstr "Tập tin" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "Không chia sẽ" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "Xóa" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "Sửa tên" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} đã tồn tại" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "thay thế" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "tên gợi ý" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "hủy" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "đã thay thế {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "lùi lại" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "đã thay thế {new_name} bằng {old_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "hủy chia sẽ {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "đã xóa {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "Tạo tập tin ZIP, điều này có thể làm mất một chút thời gian" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Không thể tải lên tập tin này do nó là một thư mục hoặc kích thước tập tin bằng 0 byte" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "Tải lên lỗi" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "Đóng" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Chờ" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 tệp tin đang được tải lên" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} tập tin đang tải lên" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "Hủy tải lên" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "Tên không hợp lệ ,không được phép dùng '/'" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} tập tin đã được quét" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "lỗi trong khi quét" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "Tên" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "Kích cỡ" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "Thay đổi" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 thư mục" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} thư mục" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 tập tin" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} tập tin" diff --git a/l10n/zh_CN.GB2312/files.po b/l10n/zh_CN.GB2312/files.po index 07d0156047..6439e83d1d 100644 --- a/l10n/zh_CN.GB2312/files.po +++ b/l10n/zh_CN.GB2312/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" @@ -53,132 +53,134 @@ msgstr "写磁盘失败" msgid "Files" msgstr "文件" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "取消共享" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "删除" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "重命名" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} 已存在" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "替换" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "推荐名称" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "取消" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "已替换 {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "撤销" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "已用 {old_name} 替换 {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "未分享的 {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "已删除的 {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "正在生成ZIP文件,这可能需要点时间" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "不能上传你指定的文件,可能因为它是个文件夹或者大小为0" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "上传错误" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "关闭" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "Pending" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1 个文件正在上传" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} 个文件正在上传" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "上传取消了" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "文件正在上传。关闭页面会取消上传。" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "非法文件名,\"/\"是不被许可的" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} 个文件已扫描" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "扫描出错" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "名字" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "大小" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "修改日期" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1 个文件夹" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} 个文件夹" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 个文件" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} 个文件" diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index d030c9aec7..2cfc623310 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -55,132 +55,134 @@ msgstr "写入磁盘失败" msgid "Files" msgstr "文件" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "取消分享" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "删除" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "重命名" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "{new_name} 已存在" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "替换" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "建议名称" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "取消" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "替换 {new_name}" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "撤销" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "已将 {old_name}替换成 {new_name}" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "取消了共享 {files}" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "删除了 {files}" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "正在生成 ZIP 文件,可能需要一些时间" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "无法上传文件,因为它是一个目录或者大小为 0 字节" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "上传错误" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "关闭" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "操作等待中" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "1个文件上传中" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "{count} 个文件上传中" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "上传已取消" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "文件正在上传中。现在离开此页会导致上传动作被取消。" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "非法的名称,不允许使用‘/’。" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "{count} 个文件已扫描。" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "扫描时出错" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "名称" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "大小" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "修改日期" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "1个文件夹" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "{count} 个文件夹" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "1 个文件" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "{count} 个文件" diff --git a/l10n/zh_HK/files.po b/l10n/zh_HK/files.po index 30c72a4f28..12b52971df 100644 --- a/l10n/zh_HK/files.po +++ b/l10n/zh_HK/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/zh_TW/files.po b/l10n/zh_TW/files.po index de17ff6194..10f9f22e38 100644 --- a/l10n/zh_TW/files.po +++ b/l10n/zh_TW/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -54,132 +54,134 @@ msgstr "寫入硬碟失敗" msgid "Files" msgstr "檔案" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "取消共享" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "刪除" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "重新命名" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "取代" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "取消" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "產生壓縮檔, 它可能需要一段時間." -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "無法上傳您的檔案因為它可能是一個目錄或檔案大小為0" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "上傳發生錯誤" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "關閉" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "上傳取消" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "檔案上傳中. 離開此頁面將會取消上傳." -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "無效的名稱, '/'是不被允許的" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "名稱" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "大小" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "修改" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" diff --git a/l10n/zu_ZA/files.po b/l10n/zu_ZA/files.po index 0a58388a36..3e5e478458 100644 --- a/l10n/zu_ZA/files.po +++ b/l10n/zu_ZA/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 23:01+0000\n" +"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"PO-Revision-Date: 2012-11-23 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" @@ -51,132 +51,134 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:108 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" msgstr "" -#: js/fileactions.js:110 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:66 msgid "Delete" msgstr "" -#: js/fileactions.js:172 +#: js/fileactions.js:181 msgid "Rename" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "replace" msgstr "" -#: js/filelist.js:198 +#: js/filelist.js:201 msgid "suggest name" msgstr "" -#: js/filelist.js:198 js/filelist.js:200 +#: js/filelist.js:201 js/filelist.js:203 msgid "cancel" msgstr "" -#: js/filelist.js:247 +#: js/filelist.js:250 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:247 js/filelist.js:249 js/filelist.js:281 js/filelist.js:283 +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" msgstr "" -#: js/filelist.js:249 +#: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:281 +#: js/filelist.js:284 msgid "unshared {files}" msgstr "" -#: js/filelist.js:283 +#: js/filelist.js:286 msgid "deleted {files}" msgstr "" -#: js/files.js:171 +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:206 +#: js/files.js:218 msgid "Upload Error" msgstr "" -#: js/files.js:223 +#: js/files.js:235 msgid "Close" msgstr "" -#: js/files.js:242 js/files.js:356 js/files.js:386 +#: js/files.js:254 js/files.js:368 js/files.js:398 msgid "Pending" msgstr "" -#: js/files.js:262 +#: js/files.js:274 msgid "1 file uploading" msgstr "" -#: js/files.js:265 js/files.js:319 js/files.js:334 +#: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" msgstr "" -#: js/files.js:337 js/files.js:370 +#: js/files.js:349 js/files.js:382 msgid "Upload cancelled." msgstr "" -#: js/files.js:439 +#: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:509 -msgid "Invalid name, '/' is not allowed." -msgstr "" - -#: js/files.js:513 +#: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:694 +#: js/files.js:704 msgid "{count} files scanned" msgstr "" -#: js/files.js:702 +#: js/files.js:712 msgid "error while scanning" msgstr "" -#: js/files.js:775 templates/index.php:50 +#: js/files.js:785 templates/index.php:50 msgid "Name" msgstr "" -#: js/files.js:776 templates/index.php:58 +#: js/files.js:786 templates/index.php:58 msgid "Size" msgstr "" -#: js/files.js:777 templates/index.php:60 +#: js/files.js:787 templates/index.php:60 msgid "Modified" msgstr "" -#: js/files.js:804 +#: js/files.js:814 msgid "1 folder" msgstr "" -#: js/files.js:806 +#: js/files.js:816 msgid "{count} folders" msgstr "" -#: js/files.js:814 +#: js/files.js:824 msgid "1 file" msgstr "" -#: js/files.js:816 +#: js/files.js:826 msgid "{count} files" msgstr "" From 0f6181627835572ce70fddfc4decc14b1213a715 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 24 Nov 2012 18:07:26 +0100 Subject: [PATCH 342/481] A new function to create nice error page. And use it for fatal db errors --- lib/db.php | 48 ++++++++---------------------------------------- lib/template.php | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/lib/db.php b/lib/db.php index 687c49a021..09b4934940 100644 --- a/lib/db.php +++ b/lib/db.php @@ -168,11 +168,7 @@ class OC_DB { try{ self::$PDO=new PDO($dsn, $user, $pass, $opts); }catch(PDOException $e) { - $error['error']='can not connect to database, using '.$type.'. ('.$e->getMessage().')'; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( 'can not connect to database, using '.$type.'. ('.$e->getMessage().')' ); } // We always, really always want associative arrays self::$PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); @@ -268,11 +264,7 @@ class OC_DB { if( PEAR::isError( self::$MDB2 )) { OC_Log::write('core', self::$MDB2->getUserInfo(), OC_Log::FATAL); OC_Log::write('core', self::$MDB2->getMessage(), OC_Log::FATAL); - $error['error']='can not connect to database, using '.$type.'. ('.self::$MDB2->getUserInfo().')'; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( 'can not connect to database, using '.$type.'. ('.self::$MDB2->getUserInfo().')' ); } // We always, really always want associative arrays @@ -332,11 +324,7 @@ class OC_DB { $entry .= 'Offending command was: '.htmlentities($query).'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - $error['error']=$entry; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( $entry ); } }else{ try{ @@ -346,11 +334,7 @@ class OC_DB { $entry .= 'Offending command was: '.htmlentities($query).'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - $error['error']=$entry; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( $entry ); } $result=new PDOStatementWrapper($result); } @@ -463,11 +447,7 @@ class OC_DB { // Die in case something went wrong if( $definition instanceof MDB2_Schema_Error ) { - $error['error']=$definition->getMessage().': '.$definition->getUserInfo(); - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( $definition->getMessage().': '.$definition->getUserInfo() ); } if(OC_Config::getValue('dbtype', 'sqlite')==='oci') { unset($definition['charset']); //or MDB2 tries SHUTDOWN IMMEDIATE @@ -479,11 +459,7 @@ class OC_DB { // Die in case something went wrong if( $ret instanceof MDB2_Error ) { - $error['error']=self::$MDB2->getDebugOutput().' '.$ret->getMessage() . ': ' . $ret->getUserInfo(); - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( self::$MDB2->getDebugOutput().' '.$ret->getMessage() . ': ' . $ret->getUserInfo() ); } return true; @@ -596,11 +572,7 @@ class OC_DB { $entry .= 'Offending command was: ' . $query . '
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: '.$entry); - $error['error']=$entry; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( $entry ); } if($result->numRows() == 0) { @@ -632,11 +604,7 @@ class OC_DB { $entry .= 'Offending command was: ' . $query.'
    '; OC_Log::write('core', $entry, OC_Log::FATAL); error_log('DB error: ' . $entry); - $error['error']=$entry; - $error['hint']=''; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); + OC_Template::printErrorPage( $entry ); } return $result->execute(); diff --git a/lib/template.php b/lib/template.php index a10cabf593..868d5f2ba2 100644 --- a/lib/template.php +++ b/lib/template.php @@ -496,4 +496,19 @@ class OC_Template{ } return $content->printPage(); } + + /** + * @brief Print a fatal error page and terminates the script + * @param string $error The error message to show + * @param string $hint An option hint message + */ + public static function printErrorPage( $error, $hint = '' ) { + $error['error']=$error; + $error['hint']=$hint; + $errors[]=$error; + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); + } + + } From e450933650762145314ab01f1ecd0a1a373e9ccd Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 24 Nov 2012 18:25:05 +0100 Subject: [PATCH 343/481] remove left over tag --- lib/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/db.php b/lib/db.php index 09b4934940..f79768a664 100644 --- a/lib/db.php +++ b/lib/db.php @@ -168,7 +168,7 @@ class OC_DB { try{ self::$PDO=new PDO($dsn, $user, $pass, $opts); }catch(PDOException $e) { - OC_Template::printErrorPage( 'can not connect to database, using '.$type.'. ('.$e->getMessage().')' ); + OC_Template::printErrorPage( 'can not connect to database, using '.$type.'. ('.$e->getMessage().')' ); } // We always, really always want associative arrays self::$PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); From ebe3c9130d101fb5c5ec4007eef3ed78716d840b Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 24 Nov 2012 20:58:51 +0100 Subject: [PATCH 344/481] add a few more indexes. This is just a first step. More work is needed here but this should improve perfomance already for big installations. --- db_structure.xml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/db_structure.xml b/db_structure.xml index 851c8aa998..e1080cd235 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -46,6 +46,13 @@ ascending + + appconfig_config_key_index + + configkey + ascending + + @@ -257,6 +264,13 @@ true 64 + + group_admin_uid + + uid + ascending + + @@ -580,6 +594,21 @@ false + + share_file_target_index + + file_target + ascending + + + uid_owner + ascending + + + share_type + ascending + + From 1857d5f9141332e0b15f151810522afa78ca0186 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 25 Nov 2012 00:03:37 +0100 Subject: [PATCH 345/481] [tx-robot] updated from transifex --- apps/files/l10n/cs_CZ.php | 1 + apps/files/l10n/es.php | 2 ++ apps/files/l10n/it.php | 1 + apps/files/l10n/nl.php | 2 ++ apps/files/l10n/pt_PT.php | 1 + apps/files/l10n/sl.php | 2 ++ apps/files/l10n/zh_CN.php | 2 ++ l10n/cs_CZ/files.po | 8 ++++---- l10n/es/files.po | 11 ++++++----- l10n/it/files.po | 8 ++++---- l10n/nl/files.po | 10 +++++----- l10n/pt_PT/files.po | 8 ++++---- l10n/sl/files.po | 10 +++++----- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/zh_CN/files.po | 11 ++++++----- 24 files changed, 55 insertions(+), 42 deletions(-) diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index 75613a34d2..22a9353290 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "nahrazeno {new_name} s {old_name}", "unshared {files}" => "sdílení zrušeno pro {files}", "deleted {files}" => "smazáno {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny.", "generating ZIP-file, it may take some time." => "generuji ZIP soubor, může to nějakou dobu trvat.", "Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář nebo má velikost 0 bajtů", "Upload Error" => "Chyba odesílání", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index 7bc4fa64ae..e946c7e7cc 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}", "unshared {files}" => "{files} descompartidos", "deleted {files}" => "{files} eliminados", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre Invalido, \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ", "generating ZIP-file, it may take some time." => "generando un fichero ZIP, puede llevar un tiempo.", "Unable to upload your file as it is a directory or has 0 bytes" => "No ha sido posible subir tu archivo porque es un directorio o tiene 0 bytes", "Upload Error" => "Error al subir el archivo", @@ -28,6 +29,7 @@ "{count} files uploading" => "Subiendo {count} archivos", "Upload cancelled." => "Subida cancelada.", "File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Salir de la página ahora cancelará la subida.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nombre de la carpeta invalido. El uso de \"Shared\" esta reservado para Owncloud", "{count} files scanned" => "{count} archivos escaneados", "error while scanning" => "error escaneando", "Name" => "Nombre", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index ff213aec29..3b5ba8377f 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "sostituito {new_name} con {old_name}", "unshared {files}" => "non condivisi {files}", "deleted {files}" => "eliminati {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti.", "generating ZIP-file, it may take some time." => "creazione file ZIP, potrebbe richiedere del tempo.", "Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile inviare il file poiché è una cartella o ha dimensione 0 byte", "Upload Error" => "Errore di invio", diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index fee3f0831c..14c3315c56 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "verving {new_name} met {old_name}", "unshared {files}" => "delen gestopt {files}", "deleted {files}" => "verwijderde {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan.", "generating ZIP-file, it may take some time." => "aanmaken ZIP-file, dit kan enige tijd duren.", "Unable to upload your file as it is a directory or has 0 bytes" => "uploaden van de file mislukt, het is of een directory of de bestandsgrootte is 0 bytes", "Upload Error" => "Upload Fout", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} bestanden aan het uploaden", "Upload cancelled." => "Uploaden geannuleerd.", "File upload is in progress. Leaving the page now will cancel the upload." => "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Folder naam niet toegestaan. Het gebruik van \"Shared\" is aan Owncloud voorbehouden", "{count} files scanned" => "{count} bestanden gescanned", "error while scanning" => "Fout tijdens het scannen", "Name" => "Naam", diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index 266a282d6e..5d14cccc4b 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "substituido {new_name} por {old_name}", "unshared {files}" => "{files} não partilhado(s)", "deleted {files}" => "{files} eliminado(s)", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.", "generating ZIP-file, it may take some time." => "a gerar o ficheiro ZIP, poderá demorar algum tempo.", "Unable to upload your file as it is a directory or has 0 bytes" => "Não é possível fazer o envio do ficheiro devido a ser uma pasta ou ter 0 bytes", "Upload Error" => "Erro no envio", diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index 62cf7f7206..84754792e0 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "zamenjano ime {new_name} z imenom {old_name}", "unshared {files}" => "odstranjeno iz souporabe {files}", "deleted {files}" => "izbrisano {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime, znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.", "generating ZIP-file, it may take some time." => "Ustvarjanje datoteke ZIP. To lahko traja nekaj časa.", "Unable to upload your file as it is a directory or has 0 bytes" => "Pošiljanje ni mogoče, saj gre za mapo, ali pa je datoteka velikosti 0 bajtov.", "Upload Error" => "Napaka med nalaganjem", @@ -28,6 +29,7 @@ "{count} files uploading" => "nalagam {count} datotek", "Upload cancelled." => "Pošiljanje je preklicano.", "File upload is in progress. Leaving the page now will cancel the upload." => "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Neveljavno ime datoteke. Uporaba mape \"Share\" je rezervirana za ownCloud.", "{count} files scanned" => "{count} files scanned", "error while scanning" => "napaka med pregledovanjem datotek", "Name" => "Ime", diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index 03efc3f22e..f74692c6f9 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "已将 {old_name}替换成 {new_name}", "unshared {files}" => "取消了共享 {files}", "deleted {files}" => "删除了 {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。", "generating ZIP-file, it may take some time." => "正在生成 ZIP 文件,可能需要一些时间", "Unable to upload your file as it is a directory or has 0 bytes" => "无法上传文件,因为它是一个目录或者大小为 0 字节", "Upload Error" => "上传错误", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} 个文件上传中", "Upload cancelled." => "上传已取消", "File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "无效的文件夹名称。”Shared“ 是 Owncloud 保留字符。", "{count} files scanned" => "{count} 个文件已扫描。", "error while scanning" => "扫描时出错", "Name" => "名称", diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index 9a02c9fbf0..16c8466439 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 09:30+0000\n" +"Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -106,7 +106,7 @@ msgstr "smazáno {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/es/files.po b/l10n/es/files.po index 8f2e46f3f6..0e76c469e7 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Agustin Ferrario <>, 2012. # , 2012. # Javier Llorente , 2012. # , 2012. @@ -13,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 15:20+0000\n" +"Last-Translator: Agustin Ferrario <>\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -109,7 +110,7 @@ msgstr "{files} eliminados" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nombre Invalido, \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos " #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -150,7 +151,7 @@ msgstr "La subida del archivo está en proceso. Salir de la página ahora cancel #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nombre de la carpeta invalido. El uso de \"Shared\" esta reservado para Owncloud" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/it/files.po b/l10n/it/files.po index 36379bcbea..6eccce4b06 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-23 23:07+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -107,7 +107,7 @@ msgstr "eliminati {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/nl/files.po b/l10n/nl/files.po index 0ae2725ed1..3473a57fd9 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 08:05+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -113,7 +113,7 @@ msgstr "verwijderde {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -154,7 +154,7 @@ msgstr "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de u #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Folder naam niet toegestaan. Het gebruik van \"Shared\" is aan Owncloud voorbehouden" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index af49192a4b..a9d8bb471e 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 15:29+0000\n" +"Last-Translator: Mouxy \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -108,7 +108,7 @@ msgstr "{files} eliminado(s)" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/sl/files.po b/l10n/sl/files.po index 6965f7fe5b..0548027dda 100644 --- a/l10n/sl/files.po +++ b/l10n/sl/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 11:33+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -107,7 +107,7 @@ msgstr "izbrisano {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Neveljavno ime, znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -148,7 +148,7 @@ msgstr "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošilja #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Neveljavno ime datoteke. Uporaba mape \"Share\" je rezervirana za ownCloud." #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 56d454f990..c3e74226aa 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 3d1b04ec5c..3b81dada19 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index f8e2747aef..7444a9eda7 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 522cf83723..1f436bcd76 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index c5b079fd8e..82e901ba5a 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 37ea370e04..519effc51a 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 0745f27520..61386b6b7a 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 91af1ab43b..2ed7cfd45c 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index bf39bb3089..892bdd0802 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index c0d3a4fd82..cd37e3c189 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index 2cfc623310..e55a10f86e 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -4,6 +4,7 @@ # # Translators: # , 2012. +# Dianjin Wang <1132321739qq@gmail.com>, 2012. # , 2012. # , 2012. # , 2011, 2012. @@ -11,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"PO-Revision-Date: 2012-11-24 10:07+0000\n" +"Last-Translator: Dianjin Wang <1132321739qq@gmail.com>\n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -107,7 +108,7 @@ msgstr "删除了 {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。" #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -148,7 +149,7 @@ msgstr "文件正在上传中。现在离开此页会导致上传动作被取消 #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "无效的文件夹名称。”Shared“ 是 Owncloud 保留字符。" #: js/files.js:704 msgid "{count} files scanned" From ffd14dfd0931857fb49ec5b1cedb9dbe1bac392a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 24 Nov 2012 20:45:53 +0100 Subject: [PATCH 346/481] add sample configuration for user backends --- config/config.sample.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/config.sample.php b/config/config.sample.php index 0ef90a0469..f531d5f146 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -119,4 +119,10 @@ $CONFIG = array( 'writable' => true, ), ), + 'user_backends'=>array( + array( + 'class'=>'OC_User_IMAP', + 'arguments'=>array('{imap.gmail.com:993/imap/ssl}INBOX') + ) + ) ); From eaf8399aafdbe1afe3303adad47415eb0d0c53cb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 25 Nov 2012 14:44:52 +0100 Subject: [PATCH 347/481] make sure the output buffer is closed when handeling webdav --- apps/files/appinfo/remote.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php index 400a978fb1..0ab7e7674c 100644 --- a/apps/files/appinfo/remote.php +++ b/apps/files/appinfo/remote.php @@ -27,6 +27,8 @@ $RUNTIME_APPTYPES=array('filesystem', 'authentication', 'logging'); OC_App::loadApps($RUNTIME_APPTYPES); +ob_end_clean(); + // Backends $authBackend = new OC_Connector_Sabre_Auth(); $lockBackend = new OC_Connector_Sabre_Locks(); From f712ca61dfdec7ed80d405115d6eb48e405fe894 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 25 Nov 2012 15:09:07 +0100 Subject: [PATCH 348/481] remove the index on the share table because of problems with the index size. Thanks to icewind for spotting this. --- db_structure.xml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index e1080cd235..e1da6448c8 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -594,21 +594,6 @@ false - - share_file_target_index - - file_target - ascending - - - uid_owner - ascending - - - share_type - ascending - - From 789220407768da586b8c3a1c4759b7ab59325b00 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Mon, 26 Nov 2012 00:02:04 +0100 Subject: [PATCH 349/481] [tx-robot] updated from transifex --- apps/files/l10n/ca.php | 1 + apps/files/l10n/de.php | 2 + apps/files/l10n/de_DE.php | 2 + apps/files/l10n/eu.php | 16 ++++- apps/files/l10n/fr.php | 2 + apps/files/l10n/ta_LK.php | 2 + apps/files_external/l10n/ta_LK.php | 24 +++++++ apps/user_webdavauth/l10n/eu.php | 3 + apps/user_webdavauth/l10n/fr.php | 3 + core/l10n/eu.php | 7 +- core/l10n/fr.php | 11 +++ l10n/ca/files.po | 8 +-- l10n/de/files.po | 9 +-- l10n/de_DE/files.po | 9 +-- l10n/eu/core.po | 96 ++++++++++++------------- l10n/eu/files.po | 36 +++++----- l10n/eu/settings.po | 10 +-- l10n/eu/user_webdavauth.po | 9 +-- l10n/fr/core.po | 108 ++++++++++++++-------------- l10n/fr/files.po | 10 +-- l10n/fr/lib.po | 22 +++--- l10n/fr/user_webdavauth.po | 9 +-- l10n/ta_LK/files.po | 10 +-- l10n/ta_LK/files_external.po | 51 ++++++------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- lib/l10n/fr.php | 6 +- settings/l10n/eu.php | 2 + 36 files changed, 284 insertions(+), 204 deletions(-) create mode 100644 apps/files_external/l10n/ta_LK.php create mode 100644 apps/user_webdavauth/l10n/eu.php create mode 100644 apps/user_webdavauth/l10n/fr.php diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index a2d5bddbfc..de72d3f46f 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "s'ha substituït {old_name} per {new_name}", "unshared {files}" => "no compartits {files}", "deleted {files}" => "eliminats {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.", "generating ZIP-file, it may take some time." => "s'estan generant fitxers ZIP, pot trigar una estona.", "Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes", "Upload Error" => "Error en la pujada", diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 4abfc8c432..88c1e792ae 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{old_name} ersetzt durch {new_name}", "unshared {files}" => "Freigabe von {files} aufgehoben", "deleted {files}" => "{files} gelöscht", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.", "generating ZIP-file, it may take some time." => "Erstelle ZIP-Datei. Dies kann eine Weile dauern.", "Unable to upload your file as it is a directory or has 0 bytes" => "Deine Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist.", "Upload Error" => "Fehler beim Upload", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} Dateien werden hochgeladen", "Upload cancelled." => "Upload abgebrochen.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten.", "{count} files scanned" => "{count} Dateien wurden gescannt", "error while scanning" => "Fehler beim Scannen", "Name" => "Name", diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 7ba7600a0d..427380e5a2 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{old_name} wurde ersetzt durch {new_name}", "unshared {files}" => "Freigabe für {files} beendet", "deleted {files}" => "{files} gelöscht", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.", "generating ZIP-file, it may take some time." => "Erstelle ZIP-Datei. Dies kann eine Weile dauern.", "Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist.", "Upload Error" => "Fehler beim Upload", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} Dateien wurden hochgeladen", "Upload cancelled." => "Upload abgebrochen.", "File upload is in progress. Leaving the page now will cancel the upload." => "Der Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten.", "{count} files scanned" => "{count} Dateien wurden gescannt", "error while scanning" => "Fehler beim Scannen", "Name" => "Name", diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index dddb58e9cb..062ae33fb6 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -7,25 +7,38 @@ "Missing a temporary folder" => "Aldi baterako karpeta falta da", "Failed to write to disk" => "Errore bat izan da diskoan idazterakoan", "Files" => "Fitxategiak", -"Unshare" => "Ez partekatu", +"Unshare" => "Ez elkarbanatu", "Delete" => "Ezabatu", "Rename" => "Berrizendatu", +"{new_name} already exists" => "{new_name} dagoeneko existitzen da", "replace" => "ordeztu", "suggest name" => "aholkatu izena", "cancel" => "ezeztatu", +"replaced {new_name}" => "ordezkatua {new_name}", "undo" => "desegin", +"replaced {new_name} with {old_name}" => " {new_name}-k {old_name} ordezkatu du", +"unshared {files}" => "elkarbanaketa utzita {files}", +"deleted {files}" => "ezabatuta {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.", "generating ZIP-file, it may take some time." => "ZIP-fitxategia sortzen ari da, denbora har dezake", "Unable to upload your file as it is a directory or has 0 bytes" => "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu", "Upload Error" => "Igotzean errore bat suertatu da", "Close" => "Itxi", "Pending" => "Zain", "1 file uploading" => "fitxategi 1 igotzen", +"{count} files uploading" => "{count} fitxategi igotzen", "Upload cancelled." => "Igoera ezeztatuta", "File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Karpeta izen baliogabea. \"Shared\" karpetaren erabilera Owncloudek erreserbatuta dauka", +"{count} files scanned" => "{count} fitxategi eskaneatuta", "error while scanning" => "errore bat egon da eskaneatzen zen bitartean", "Name" => "Izena", "Size" => "Tamaina", "Modified" => "Aldatuta", +"1 folder" => "karpeta bat", +"{count} folders" => "{count} karpeta", +"1 file" => "fitxategi bat", +"{count} files" => "{count} fitxategi", "File handling" => "Fitxategien kudeaketa", "Maximum upload size" => "Igo daitekeen gehienezko tamaina", "max. possible: " => "max, posiblea:", @@ -37,6 +50,7 @@ "New" => "Berria", "Text file" => "Testu fitxategia", "Folder" => "Karpeta", +"From link" => "Estekatik", "Upload" => "Igo", "Cancel upload" => "Ezeztatu igoera", "Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!", diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index 5170272c45..97643c6363 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{new_name} a été remplacé par {old_name}", "unshared {files}" => "Fichiers non partagés : {files}", "deleted {files}" => "Fichiers supprimés : {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", "generating ZIP-file, it may take some time." => "Fichier ZIP en cours d'assemblage ; cela peut prendre du temps.", "Unable to upload your file as it is a directory or has 0 bytes" => "Impossible de charger vos fichiers car il s'agit d'un dossier ou le fichier fait 0 octet.", "Upload Error" => "Erreur de chargement", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} fichiers téléversés", "Upload cancelled." => "Chargement annulé.", "File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nom de répertoire invalide. \"Shared\" est réservé par ownCloud", "{count} files scanned" => "{count} fichiers indexés", "error while scanning" => "erreur lors de l'indexation", "Name" => "Nom", diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php index 0bd4b173c0..d9b6b021be 100644 --- a/apps/files/l10n/ta_LK.php +++ b/apps/files/l10n/ta_LK.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{new_name} ஆனது {old_name} இனால் மாற்றப்பட்டது", "unshared {files}" => "பகிரப்படாதது {கோப்புகள்}", "deleted {files}" => "நீக்கப்பட்டது {கோப்புகள்}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது.", "generating ZIP-file, it may take some time." => " ZIP கோப்பு உருவாக்கப்படுகின்றது, இது சில நேரம் ஆகலாம்.", "Unable to upload your file as it is a directory or has 0 bytes" => "அடைவு அல்லது 0 bytes ஐ கொண்டுள்ளதால் உங்களுடைய கோப்பை பதிவேற்ற முடியவில்லை", "Upload Error" => "பதிவேற்றல் வழு", @@ -28,6 +29,7 @@ "{count} files uploading" => "{எண்ணிக்கை} கோப்புகள் பதிவேற்றப்படுகின்றது", "Upload cancelled." => "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது", "File upload is in progress. Leaving the page now will cancel the upload." => "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "செல்லுபடியற்ற கோப்புறை பெயர். \"பகிர்வின்\" பாவனை Owncloud இனால் ஒதுக்கப்பட்டுள்ளது", "{count} files scanned" => "{எண்ணிக்கை} கோப்புகள் வருடப்பட்டது", "error while scanning" => "வருடும் போதான வழு", "Name" => "பெயர்", diff --git a/apps/files_external/l10n/ta_LK.php b/apps/files_external/l10n/ta_LK.php new file mode 100644 index 0000000000..1e01b22efa --- /dev/null +++ b/apps/files_external/l10n/ta_LK.php @@ -0,0 +1,24 @@ + "அனுமதி வழங்கப்பட்டது", +"Error configuring Dropbox storage" => "Dropbox சேமிப்பை தகவமைப்பதில் வழு", +"Grant access" => "அனுமதியை வழங்கல்", +"Fill out all required fields" => "தேவையான எல்லா புலங்களையும் நிரப்புக", +"Please provide a valid Dropbox app key and secret." => "தயவுசெய்து ஒரு செல்லுபடியான Dropbox செயலி சாவி மற்றும் இரகசியத்தை வழங்குக. ", +"Error configuring Google Drive storage" => "Google இயக்க சேமிப்பகத்தை தகமைப்பதில் வழு", +"External Storage" => "வெளி சேமிப்பு", +"Mount point" => "ஏற்றப்புள்ளி", +"Backend" => "பின்நிலை", +"Configuration" => "தகவமைப்பு", +"Options" => "தெரிவுகள்", +"Applicable" => "பயன்படத்தக்க", +"Add mount point" => "ஏற்றப்புள்ளியை சேர்க்க", +"None set" => "தொகுப்பில்லா", +"All Users" => "பயனாளர்கள் எல்லாம்", +"Groups" => "குழுக்கள்", +"Users" => "பயனாளர்", +"Delete" => "நீக்குக", +"Enable User External Storage" => "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக", +"Allow users to mount their own external storage" => "பயனாளர் அவர்களுடைய சொந்த வெளியக சேமிப்பை ஏற்ற அனுமதிக்க", +"SSL root certificates" => "SSL வேர் சான்றிதழ்கள்", +"Import Root Certificate" => "வேர் சான்றிதழை இறக்குமதி செய்க" +); diff --git a/apps/user_webdavauth/l10n/eu.php b/apps/user_webdavauth/l10n/eu.php new file mode 100644 index 0000000000..9bd32954b0 --- /dev/null +++ b/apps/user_webdavauth/l10n/eu.php @@ -0,0 +1,3 @@ + "WebDAV URL: http://" +); diff --git a/apps/user_webdavauth/l10n/fr.php b/apps/user_webdavauth/l10n/fr.php new file mode 100644 index 0000000000..759d45b230 --- /dev/null +++ b/apps/user_webdavauth/l10n/fr.php @@ -0,0 +1,3 @@ + "URL WebDAV : http://" +); diff --git a/core/l10n/eu.php b/core/l10n/eu.php index 6622a822d0..8bc5d690d5 100644 --- a/core/l10n/eu.php +++ b/core/l10n/eu.php @@ -1,6 +1,9 @@ "Kategoria mota ez da zehaztu.", "No category to add?" => "Ez dago gehitzeko kategoriarik?", "This category already exists: " => "Kategoria hau dagoeneko existitzen da:", +"Object type not provided." => "Objetu mota ez da zehaztu.", +"%s ID not provided." => "%s ID mota ez da zehaztu.", "No categories selected for deletion." => "Ez da ezabatzeko kategoriarik hautatu.", "Settings" => "Ezarpenak", "seconds ago" => "segundu", @@ -96,5 +99,7 @@ "Log in" => "Hasi saioa", "You are logged out." => "Zure saioa bukatu da.", "prev" => "aurrekoa", -"next" => "hurrengoa" +"next" => "hurrengoa", +"Security Warning!" => "Segurtasun abisua", +"Verify" => "Egiaztatu" ); diff --git a/core/l10n/fr.php b/core/l10n/fr.php index a513ad1965..f02a7b0087 100644 --- a/core/l10n/fr.php +++ b/core/l10n/fr.php @@ -1,15 +1,23 @@ "Type de catégorie non spécifié.", "No category to add?" => "Pas de catégorie à ajouter ?", "This category already exists: " => "Cette catégorie existe déjà : ", +"Object type not provided." => "Type d'objet non spécifié.", +"%s ID not provided." => "L'identifiant de %s n'est pas spécifié.", +"Error adding %s to favorites." => "Erreur lors de l'ajout de %s aux favoris.", "No categories selected for deletion." => "Aucune catégorie sélectionnée pour suppression", +"Error removing %s from favorites." => "Erreur lors de la suppression de %s des favoris.", "Settings" => "Paramètres", "seconds ago" => "il y a quelques secondes", "1 minute ago" => "il y a une minute", "{minutes} minutes ago" => "il y a {minutes} minutes", +"1 hour ago" => "Il y a une heure", +"{hours} hours ago" => "Il y a {hours} heures", "today" => "aujourd'hui", "yesterday" => "hier", "{days} days ago" => "il y a {days} jours", "last month" => "le mois dernier", +"{months} months ago" => "Il y a {months} mois", "months ago" => "il y a plusieurs mois", "last year" => "l'année dernière", "years ago" => "il y a plusieurs années", @@ -18,7 +26,10 @@ "No" => "Non", "Yes" => "Oui", "Ok" => "Ok", +"The object type is not specified." => "Le type d'objet n'est pas spécifié.", "Error" => "Erreur", +"The app name is not specified." => "Le nom de l'application n'est pas spécifié.", +"The required file {file} is not installed!" => "Le fichier requis {file} n'est pas installé !", "Error while sharing" => "Erreur lors de la mise en partage", "Error while unsharing" => "Erreur lors de l'annulation du partage", "Error while changing permissions" => "Erreur lors du changement des permissions", diff --git a/l10n/ca/files.po b/l10n/ca/files.po index 4275de50fa..f8f8371902 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 10:24+0000\n" +"Last-Translator: rogerc \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -107,7 +107,7 @@ msgstr "eliminats {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/de/files.po b/l10n/de/files.po index 0134a285f0..1a69a4a4cf 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -5,6 +5,7 @@ # Translators: # , 2012. # , 2012. +# I Robot , 2012. # I Robot , 2012. # Jan-Christoph Borchardt , 2012. # Jan-Christoph Borchardt , 2011. @@ -23,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 00:10+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" @@ -119,7 +120,7 @@ msgstr "{files} gelöscht" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -160,7 +161,7 @@ msgstr "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload a #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten." #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/de_DE/files.po b/l10n/de_DE/files.po index 0b8ace46ae..336308b77b 100644 --- a/l10n/de_DE/files.po +++ b/l10n/de_DE/files.po @@ -6,6 +6,7 @@ # , 2012. # , 2012. # , 2012. +# I Robot , 2012. # I Robot , 2012. # Jan-Christoph Borchardt , 2012. # Jan-Christoph Borchardt , 2011. @@ -24,8 +25,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 00:13+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" @@ -120,7 +121,7 @@ msgstr "{files} gelöscht" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -161,7 +162,7 @@ msgstr "Der Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upl #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten." #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/eu/core.po b/l10n/eu/core.po index 3aa27daaa8..1c55b9ec27 100644 --- a/l10n/eu/core.po +++ b/l10n/eu/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 23:01+0000\n" +"Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,7 +21,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Kategoria mota ez da zehaztu." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -35,13 +35,13 @@ msgstr "Kategoria hau dagoeneko existitzen da:" #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Objetu mota ez da zehaztu." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "%s ID mota ez da zehaztu." #: ajax/vcategories/addToFavorites.php:35 #, php-format @@ -57,59 +57,59 @@ msgstr "Ez da ezabatzeko kategoriarik hautatu." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Ezarpenak" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "segundu" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "orain dela minutu 1" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "gaur" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "atzo" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "joan den hilabetean" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "hilabete" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "joan den urtean" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "urte" @@ -139,8 +139,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 +#: js/share.js:539 msgid "Error" msgstr "Errorea" @@ -241,15 +241,15 @@ msgstr "ezabatu" msgid "share" msgstr "elkarbanatu" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:343 js/share.js:514 js/share.js:516 msgid "Password protected" msgstr "Pasahitzarekin babestuta" -#: js/share.js:525 +#: js/share.js:527 msgid "Error unsetting expiration date" msgstr "Errorea izan da muga data kentzean" -#: js/share.js:537 +#: js/share.js:539 msgid "Error setting expiration date" msgstr "Errore bat egon da muga data ezartzean" @@ -404,87 +404,87 @@ msgstr "Datubasearen hostalaria" msgid "Finish setup" msgstr "Bukatu konfigurazioa" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Igandea" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Astelehena" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Asteartea" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Asteazkena" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Osteguna" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Ostirala" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Larunbata" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Urtarrila" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Otsaila" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Martxoa" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Apirila" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Maiatza" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Ekaina" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Uztaila" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Abuztua" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Iraila" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Urria" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Azaroa" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Abendua" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "web zerbitzuak zure kontrolpean" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Saioa bukatu" @@ -528,7 +528,7 @@ msgstr "hurrengoa" #: templates/verify.php:5 msgid "Security Warning!" -msgstr "" +msgstr "Segurtasun abisua" #: templates/verify.php:6 msgid "" @@ -538,4 +538,4 @@ msgstr "" #: templates/verify.php:16 msgid "Verify" -msgstr "" +msgstr "Egiaztatu" diff --git a/l10n/eu/files.po b/l10n/eu/files.po index a726851e13..2f667de1c6 100644 --- a/l10n/eu/files.po +++ b/l10n/eu/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 23:00+0000\n" +"Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,7 +55,7 @@ msgstr "Fitxategiak" #: js/fileactions.js:117 templates/index.php:64 msgid "Unshare" -msgstr "Ez partekatu" +msgstr "Ez elkarbanatu" #: js/fileactions.js:119 templates/index.php:66 msgid "Delete" @@ -67,7 +67,7 @@ msgstr "Berrizendatu" #: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" -msgstr "" +msgstr "{new_name} dagoeneko existitzen da" #: js/filelist.js:201 js/filelist.js:203 msgid "replace" @@ -83,7 +83,7 @@ msgstr "ezeztatu" #: js/filelist.js:250 msgid "replaced {new_name}" -msgstr "" +msgstr "ordezkatua {new_name}" #: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" @@ -91,21 +91,21 @@ msgstr "desegin" #: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" -msgstr "" +msgstr " {new_name}-k {old_name} ordezkatu du" #: js/filelist.js:284 msgid "unshared {files}" -msgstr "" +msgstr "elkarbanaketa utzita {files}" #: js/filelist.js:286 msgid "deleted {files}" -msgstr "" +msgstr "ezabatuta {files}" #: js/files.js:33 msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -133,7 +133,7 @@ msgstr "fitxategi 1 igotzen" #: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" -msgstr "" +msgstr "{count} fitxategi igotzen" #: js/files.js:349 js/files.js:382 msgid "Upload cancelled." @@ -146,11 +146,11 @@ msgstr "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du. #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Karpeta izen baliogabea. \"Shared\" karpetaren erabilera Owncloudek erreserbatuta dauka" #: js/files.js:704 msgid "{count} files scanned" -msgstr "" +msgstr "{count} fitxategi eskaneatuta" #: js/files.js:712 msgid "error while scanning" @@ -170,19 +170,19 @@ msgstr "Aldatuta" #: js/files.js:814 msgid "1 folder" -msgstr "" +msgstr "karpeta bat" #: js/files.js:816 msgid "{count} folders" -msgstr "" +msgstr "{count} karpeta" #: js/files.js:824 msgid "1 file" -msgstr "" +msgstr "fitxategi bat" #: js/files.js:826 msgid "{count} files" -msgstr "" +msgstr "{count} fitxategi" #: templates/admin.php:5 msgid "File handling" @@ -230,7 +230,7 @@ msgstr "Karpeta" #: templates/index.php:11 msgid "From link" -msgstr "" +msgstr "Estekatik" #: templates/index.php:22 msgid "Upload" diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po index 1606e178d6..93adee8ec6 100644 --- a/l10n/eu/settings.po +++ b/l10n/eu/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 22:46+0000\n" +"Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -100,7 +100,7 @@ msgstr "Gehitu zure aplikazioa" #: templates/apps.php:11 msgid "More Apps" -msgstr "" +msgstr "App gehiago" #: templates/apps.php:27 msgid "Select an App" @@ -141,7 +141,7 @@ msgstr "Erantzun" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "" +msgstr "Dagoeneko %s erabili duzu eskuragarri duzun %setatik" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" diff --git a/l10n/eu/user_webdavauth.po b/l10n/eu/user_webdavauth.po index a21e5c32e9..eca9edb6ff 100644 --- a/l10n/eu/user_webdavauth.po +++ b/l10n/eu/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 22:56+0000\n" +"Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV URL: http://" diff --git a/l10n/fr/core.po b/l10n/fr/core.po index bbe6c0ef45..28f66a6fa2 100644 --- a/l10n/fr/core.po +++ b/l10n/fr/core.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 00:59+0000\n" +"Last-Translator: Romain DEP. \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Type de catégorie non spécifié." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -41,18 +41,18 @@ msgstr "Cette catégorie existe déjà : " #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Type d'objet non spécifié." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "L'identifiant de %s n'est pas spécifié." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Erreur lors de l'ajout de %s aux favoris." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -61,61 +61,61 @@ msgstr "Aucune catégorie sélectionnée pour suppression" #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Erreur lors de la suppression de %s des favoris." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Paramètres" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "il y a quelques secondes" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "il y a une minute" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "il y a {minutes} minutes" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "Il y a une heure" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "Il y a {hours} heures" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "aujourd'hui" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "hier" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "il y a {days} jours" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "le mois dernier" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "Il y a {months} mois" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "il y a plusieurs mois" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "l'année dernière" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "il y a plusieurs années" @@ -142,21 +142,21 @@ msgstr "Ok" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Le type d'objet n'est pas spécifié." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 +#: js/share.js:539 msgid "Error" msgstr "Erreur" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "Le nom de l'application n'est pas spécifié." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "Le fichier requis {file} n'est pas installé !" #: js/share.js:124 msgid "Error while sharing" @@ -247,15 +247,15 @@ msgstr "supprimer" msgid "share" msgstr "partager" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:343 js/share.js:514 js/share.js:516 msgid "Password protected" msgstr "Protégé par un mot de passe" -#: js/share.js:525 +#: js/share.js:527 msgid "Error unsetting expiration date" msgstr "Un erreur est survenue pendant la suppression de la date d'expiration" -#: js/share.js:537 +#: js/share.js:539 msgid "Error setting expiration date" msgstr "Erreur lors de la spécification de la date d'expiration" @@ -410,87 +410,87 @@ msgstr "Serveur de la base de données" msgid "Finish setup" msgstr "Terminer l'installation" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Dimanche" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Lundi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Mardi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mercredi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Jeudi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Vendredi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Samedi" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "janvier" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "février" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "mars" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "avril" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "juin" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "juillet" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "août" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "septembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "octobre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "novembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "décembre" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "services web sous votre contrôle" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Se déconnecter" diff --git a/l10n/fr/files.po b/l10n/fr/files.po index 0db7fb69f6..58459bcd52 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 01:02+0000\n" +"Last-Translator: Romain DEP. \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -113,7 +113,7 @@ msgstr "Fichiers supprimés : {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -154,7 +154,7 @@ msgstr "L'envoi du fichier est en cours. Quitter cette page maintenant annulera #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nom de répertoire invalide. \"Shared\" est réservé par ownCloud" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/fr/lib.po b/l10n/fr/lib.po index b4788144e0..7617ac30e7 100644 --- a/l10n/fr/lib.po +++ b/l10n/fr/lib.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 00:56+0000\n" +"Last-Translator: Romain DEP. \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +43,19 @@ msgstr "Applications" msgid "Admin" msgstr "Administration" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "Téléchargement ZIP désactivé." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Les fichiers nécessitent d'être téléchargés un par un." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Retour aux Fichiers" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "Les fichiers sélectionnés sont trop volumineux pour être compressés." @@ -98,12 +98,12 @@ msgstr "il y a %d minutes" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "Il y a une heure" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "Il y a %d heures" #: template.php:108 msgid "today" @@ -125,7 +125,7 @@ msgstr "le mois dernier" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "Il y a %d mois" #: template.php:113 msgid "last year" @@ -151,4 +151,4 @@ msgstr "la vérification des mises à jour est désactivée" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Impossible de trouver la catégorie \"%s\"" diff --git a/l10n/fr/user_webdavauth.po b/l10n/fr/user_webdavauth.po index b47a063ca3..ef3cebf770 100644 --- a/l10n/fr/user_webdavauth.po +++ b/l10n/fr/user_webdavauth.po @@ -4,13 +4,14 @@ # # Translators: # Robert Di Rosa <>, 2012. +# Romain DEP. , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-12 00:01+0100\n" -"PO-Revision-Date: 2012-11-11 10:15+0000\n" -"Last-Translator: Robert Di Rosa <>\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 00:28+0000\n" +"Last-Translator: Romain DEP. \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,4 +21,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "URL WebDAV : http://" diff --git a/l10n/ta_LK/files.po b/l10n/ta_LK/files.po index 4f7d243f4e..8305b7c9cd 100644 --- a/l10n/ta_LK/files.po +++ b/l10n/ta_LK/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 16:24+0000\n" +"Last-Translator: suganthi \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -104,7 +104,7 @@ msgstr "நீக்கப்பட்டது {கோப்புகள்}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -145,7 +145,7 @@ msgstr "கோப்பு பதிவேற்றம் செயல்பா #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "செல்லுபடியற்ற கோப்புறை பெயர். \"பகிர்வின்\" பாவனை Owncloud இனால் ஒதுக்கப்பட்டுள்ளது" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/ta_LK/files_external.po b/l10n/ta_LK/files_external.po index 469c1e516e..8bbabf7c15 100644 --- a/l10n/ta_LK/files_external.po +++ b/l10n/ta_LK/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-16 02:03+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"PO-Revision-Date: 2012-11-25 17:04+0000\n" +"Last-Translator: suganthi \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: js/dropbox.js:7 js/dropbox.js:25 js/google.js:7 js/google.js:23 msgid "Access granted" -msgstr "" +msgstr "அனுமதி வழங்கப்பட்டது" #: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 msgid "Error configuring Dropbox storage" -msgstr "" +msgstr "Dropbox சேமிப்பை தகவமைப்பதில் வழு" #: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 msgid "Grant access" -msgstr "" +msgstr "அனுமதியை வழங்கல்" #: js/dropbox.js:73 js/google.js:72 msgid "Fill out all required fields" -msgstr "" +msgstr "தேவையான எல்லா புலங்களையும் நிரப்புக" #: js/dropbox.js:85 msgid "Please provide a valid Dropbox app key and secret." -msgstr "" +msgstr "தயவுசெய்து ஒரு செல்லுபடியான Dropbox செயலி சாவி மற்றும் இரகசியத்தை வழங்குக. " #: js/google.js:26 js/google.js:73 js/google.js:78 msgid "Error configuring Google Drive storage" -msgstr "" +msgstr "Google இயக்க சேமிப்பகத்தை தகமைப்பதில் வழு" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "வெளி சேமிப்பு" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "ஏற்றப்புள்ளி" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "பின்நிலை" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "தகவமைப்பு" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "தெரிவுகள்" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "பயன்படத்தக்க" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "ஏற்றப்புள்ளியை சேர்க்க" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "தொகுப்பில்லா" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "பயனாளர்கள் எல்லாம்" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "குழுக்கள்" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "பயனாளர்" #: templates/settings.php:77 templates/settings.php:107 msgid "Delete" -msgstr "" +msgstr "நீக்குக" #: templates/settings.php:87 msgid "Enable User External Storage" -msgstr "" +msgstr "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக" #: templates/settings.php:88 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "பயனாளர் அவர்களுடைய சொந்த வெளியக சேமிப்பை ஏற்ற அனுமதிக்க" #: templates/settings.php:99 msgid "SSL root certificates" -msgstr "" +msgstr "SSL வேர் சான்றிதழ்கள்" #: templates/settings.php:113 msgid "Import Root Certificate" -msgstr "" +msgstr "வேர் சான்றிதழை இறக்குமதி செய்க" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index c3e74226aa..b09dccc2a7 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 3b81dada19..423f7f4273 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 7444a9eda7..55cd072fc3 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 1f436bcd76..a08e7852bc 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 82e901ba5a..f1a671c7ee 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 519effc51a..e2a5cec27b 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 61386b6b7a..66bfa23b0c 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 2ed7cfd45c..20ea64dcbe 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 892bdd0802..40a4786ac1 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index cd37e3c189..3740c1853c 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" +"POT-Creation-Date: 2012-11-26 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/lib/l10n/fr.php b/lib/l10n/fr.php index ad5a034f5b..218c22c1d5 100644 --- a/lib/l10n/fr.php +++ b/lib/l10n/fr.php @@ -18,13 +18,17 @@ "seconds ago" => "à l'instant", "1 minute ago" => "il y a 1 minute", "%d minutes ago" => "il y a %d minutes", +"1 hour ago" => "Il y a une heure", +"%d hours ago" => "Il y a %d heures", "today" => "aujourd'hui", "yesterday" => "hier", "%d days ago" => "il y a %d jours", "last month" => "le mois dernier", +"%d months ago" => "Il y a %d mois", "last year" => "l'année dernière", "years ago" => "il y a plusieurs années", "%s is available. Get more information" => "%s est disponible. Obtenez plus d'informations", "up to date" => "À jour", -"updates check is disabled" => "la vérification des mises à jour est désactivée" +"updates check is disabled" => "la vérification des mises à jour est désactivée", +"Could not find category \"%s\"" => "Impossible de trouver la catégorie \"%s\"" ); diff --git a/settings/l10n/eu.php b/settings/l10n/eu.php index bfef1a0447..d6c87e0928 100644 --- a/settings/l10n/eu.php +++ b/settings/l10n/eu.php @@ -18,6 +18,7 @@ "Saving..." => "Gordetzen...", "__language_name__" => "Euskera", "Add your App" => "Gehitu zure aplikazioa", +"More Apps" => "App gehiago", "Select an App" => "Aukeratu programa bat", "See application page at apps.owncloud.com" => "Ikusi programen orria apps.owncloud.com en", "-licensed by " => "-lizentziatua ", @@ -27,6 +28,7 @@ "Problems connecting to help database." => "Arazoak daude laguntza datubasera konektatzeko.", "Go there manually." => "Joan hara eskuz.", "Answer" => "Erantzun", +"You have used %s of the available %s" => "Dagoeneko %s erabili duzu eskuragarri duzun %setatik", "Desktop and Mobile Syncing Clients" => "Mahaigain eta mugikorren sinkronizazio bezeroak", "Download" => "Deskargatu", "Your password was changed" => "Zere pasahitza aldatu da", From fdc7a8b2043daeb74f9dc4d7221e13760787c1c0 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 15 Nov 2012 18:25:31 +0100 Subject: [PATCH 350/481] make sure path starts with / --- apps/files/ajax/newfile.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index b87079f271..411654af60 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -65,6 +65,9 @@ if($source) { $target=$dir.'/'.$filename; $result=OC_Filesystem::file_put_contents($target, $sourceStream); if($result) { + if($target[0] != '/') { + $target = '/'.$target; + } $meta = OC_FileCache::get($target); $mime=$meta['mimetype']; $id = OC_FileCache::getId($target); From 776be8d9f78e7c10099f068415f153fa69014166 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 15 Nov 2012 18:26:08 +0100 Subject: [PATCH 351/481] all but the first parameter are introduced by & --- apps/files/js/files.js | 2 +- core/js/eventsource.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 28d4b49670..dbd9a64715 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -864,7 +864,7 @@ function getMimeIcon(mime, ready){ if(getMimeIcon.cache[mime]){ ready(getMimeIcon.cache[mime]); }else{ - $.get( OC.filePath('files','ajax','mimeicon.php')+'?mime='+mime, function(path){ + $.get( OC.filePath('files','ajax','mimeicon.php')+'&mime='+mime, function(path){ getMimeIcon.cache[mime]=path; ready(getMimeIcon.cache[mime]); }); diff --git a/core/js/eventsource.js b/core/js/eventsource.js index e3ad7e3a67..7a744f7a6c 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -42,7 +42,7 @@ OC.EventSource=function(src,data){ } dataStr+='requesttoken='+OC.EventSource.requesttoken; if(!this.useFallBack && typeof EventSource !='undefined'){ - this.source=new EventSource(src+'?'+dataStr); + this.source=new EventSource(src+'&'+dataStr); this.source.onmessage=function(e){ for(var i=0;i'); this.iframe.attr('id',iframeId); this.iframe.hide(); - this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); + this.iframe.attr('src',src+'&fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ @@ -90,7 +90,7 @@ OC.EventSource.prototype={ lastLength:0,//for fallback listen:function(type,callback){ if(callback && callback.call){ - + if(type){ if(this.useFallBack){ if(!this.listeners[type]){ From 4764876192bae91eaba86f3e0ca9f4c7ea8d20be Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 16 Nov 2012 20:28:03 +0100 Subject: [PATCH 352/481] check whether to join url with ? or & --- core/js/eventsource.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 7a744f7a6c..2bd080fba7 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -42,7 +42,13 @@ OC.EventSource=function(src,data){ } dataStr+='requesttoken='+OC.EventSource.requesttoken; if(!this.useFallBack && typeof EventSource !='undefined'){ - this.source=new EventSource(src+'&'+dataStr); + var joinChar = '&'; + if(src.indexOf('?') == -1) { + joinChar = '?'; + } + alert(src.indexOf('?')); + alert(joinChar); + this.source=new EventSource(src+joinChar+dataStr); this.source.onmessage=function(e){ for(var i=0;i'); this.iframe.attr('id',iframeId); this.iframe.hide(); - this.iframe.attr('src',src+'&fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); + + var joinChar = '&'; + if(src.indexOf('?') == -1) { + joinChar = '?'; + } + alert(src.indexOf('?')); this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ From e5ad774ab0058ef22396990771138b249355156e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 16 Nov 2012 20:28:58 +0100 Subject: [PATCH 353/481] coding style --- core/js/eventsource.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 2bd080fba7..844c327e12 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -65,7 +65,8 @@ OC.EventSource=function(src,data){ if(src.indexOf('?') == -1) { joinChar = '?'; } - alert(src.indexOf('?')); this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); + alert(src.indexOf('?')); + this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ From 4c707d1b1f970556e24107f28750ad8b4069c7e4 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 23 Nov 2012 12:18:38 +0100 Subject: [PATCH 354/481] remove debug output --- core/js/eventsource.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 844c327e12..0c2a995f33 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -46,8 +46,6 @@ OC.EventSource=function(src,data){ if(src.indexOf('?') == -1) { joinChar = '?'; } - alert(src.indexOf('?')); - alert(joinChar); this.source=new EventSource(src+joinChar+dataStr); this.source.onmessage=function(e){ for(var i=0;i Date: Mon, 26 Nov 2012 14:13:23 +0100 Subject: [PATCH 355/481] use normalizePath to have a proper target path --- apps/files/ajax/newfile.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index 411654af60..2bac9bb20b 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -65,9 +65,7 @@ if($source) { $target=$dir.'/'.$filename; $result=OC_Filesystem::file_put_contents($target, $sourceStream); if($result) { - if($target[0] != '/') { - $target = '/'.$target; - } + $target = OC_Filesystem::normalizePath($target); $meta = OC_FileCache::get($target); $mime=$meta['mimetype']; $id = OC_FileCache::getId($target); From d251f04b98c3be9ecb6435af15628f0ccf09cfe3 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 27 Nov 2012 00:10:47 +0100 Subject: [PATCH 356/481] [tx-robot] updated from transifex --- apps/files/l10n/fi_FI.php | 1 + apps/files/l10n/ja_JP.php | 2 + apps/files/l10n/ru.php | 1 + apps/files/l10n/ru_RU.php | 1 + apps/files/l10n/sv.php | 2 + apps/files/l10n/uk.php | 5 + apps/files/l10n/vi.php | 2 + apps/files_external/l10n/uk.php | 1 + apps/user_webdavauth/l10n/zh_TW.php | 3 + core/l10n/eu.php | 21 ++ core/l10n/uk.php | 68 +++- l10n/eu/core.po | 56 +-- l10n/eu/lib.po | 24 +- l10n/fi_FI/files.po | 8 +- l10n/ja_JP/files.po | 10 +- l10n/ru/files.po | 9 +- l10n/ru_RU/files.po | 8 +- l10n/sq/core.po | 539 ++++++++++++++++++++++++++++ l10n/sq/files.po | 269 ++++++++++++++ l10n/sq/files_encryption.po | 34 ++ l10n/sq/files_external.po | 106 ++++++ l10n/sq/files_sharing.po | 48 +++ l10n/sq/files_versions.po | 42 +++ l10n/sq/lib.po | 152 ++++++++ l10n/sq/settings.po | 243 +++++++++++++ l10n/sq/user_ldap.po | 170 +++++++++ l10n/sq/user_webdavauth.po | 22 ++ l10n/sv/files.po | 10 +- l10n/templates/core.pot | 12 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/uk/core.po | 219 +++++------ l10n/uk/files.po | 16 +- l10n/uk/files_external.po | 6 +- l10n/uk/lib.po | 31 +- l10n/uk/settings.po | 6 +- l10n/vi/files.po | 11 +- l10n/zh_TW/lib.po | 25 +- l10n/zh_TW/user_webdavauth.po | 9 +- lib/l10n/eu.php | 7 +- lib/l10n/uk.php | 10 +- lib/l10n/zh_TW.php | 7 +- settings/l10n/uk.php | 1 + 50 files changed, 1995 insertions(+), 240 deletions(-) create mode 100644 apps/user_webdavauth/l10n/zh_TW.php create mode 100644 l10n/sq/core.po create mode 100644 l10n/sq/files.po create mode 100644 l10n/sq/files_encryption.po create mode 100644 l10n/sq/files_external.po create mode 100644 l10n/sq/files_sharing.po create mode 100644 l10n/sq/files_versions.po create mode 100644 l10n/sq/lib.po create mode 100644 l10n/sq/settings.po create mode 100644 l10n/sq/user_ldap.po create mode 100644 l10n/sq/user_webdavauth.po diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index 781cfaca3c..cbc0fe45ff 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -15,6 +15,7 @@ "suggest name" => "ehdota nimeä", "cancel" => "peru", "undo" => "kumoa", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja.", "generating ZIP-file, it may take some time." => "luodaan ZIP-tiedostoa, tämä saattaa kestää hetken.", "Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio", "Upload Error" => "Lähetysvirhe.", diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index 50df005091..9c0c202d73 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{old_name} を {new_name} に置換", "unshared {files}" => "未共有 {files}", "deleted {files}" => "削除 {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。", "generating ZIP-file, it may take some time." => "ZIPファイルを生成中です、しばらくお待ちください。", "Unable to upload your file as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのファイルはアップロードできません", "Upload Error" => "アップロードエラー", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} ファイルをアップロード中", "Upload cancelled." => "アップロードはキャンセルされました。", "File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "無効なフォルダ名です。\"Shared\" の利用は ownCloud が予約済みです。", "{count} files scanned" => "{count} ファイルをスキャン", "error while scanning" => "スキャン中のエラー", "Name" => "名前", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 6961c538b4..3413fa691b 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "заменено {new_name} на {old_name}", "unshared {files}" => "не опубликованные {files}", "deleted {files}" => "удаленные {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", "generating ZIP-file, it may take some time." => "создание ZIP-файла, это может занять некоторое время.", "Unable to upload your file as it is a directory or has 0 bytes" => "Не удается загрузить файл размером 0 байт в каталог", "Upload Error" => "Ошибка загрузки", diff --git a/apps/files/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php index 59021ea99a..018dfa8f7a 100644 --- a/apps/files/l10n/ru_RU.php +++ b/apps/files/l10n/ru_RU.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "заменено {новое_имя} с {старое_имя}", "unshared {files}" => "Cовместное использование прекращено {файлы}", "deleted {files}" => "удалено {файлы}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Некорректное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не допустимы.", "generating ZIP-file, it may take some time." => "Создание ZIP-файла, это может занять некоторое время.", "Unable to upload your file as it is a directory or has 0 bytes" => "Невозможно загрузить файл,\n так как он имеет нулевой размер или является директорией", "Upload Error" => "Ошибка загрузки", diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index dbac36b9a9..4b5cbe9ed4 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "ersatt {new_name} med {old_name}", "unshared {files}" => "stoppad delning {files}", "deleted {files}" => "raderade {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.", "generating ZIP-file, it may take some time." => "genererar ZIP-fil, det kan ta lite tid.", "Unable to upload your file as it is a directory or has 0 bytes" => "Kunde inte ladda upp dina filer eftersom det antingen är en mapp eller har 0 bytes.", "Upload Error" => "Uppladdningsfel", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} filer laddas upp", "Upload cancelled." => "Uppladdning avbruten.", "File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Ogiltigt mappnamn. Ordet \"Delad\" är reserverat av ownCloud.", "{count} files scanned" => "{count} filer skannade", "error while scanning" => "fel vid skanning", "Name" => "Namn", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index ac826d27cb..4eb130736c 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -17,7 +17,9 @@ "replaced {new_name}" => "замінено {new_name}", "undo" => "відмінити", "replaced {new_name} with {old_name}" => "замінено {new_name} на {old_name}", +"unshared {files}" => "неопубліковано {files}", "deleted {files}" => "видалено {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.", "generating ZIP-file, it may take some time." => "Створення ZIP-файлу, це може зайняти певний час.", "Unable to upload your file as it is a directory or has 0 bytes" => "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт", "Upload Error" => "Помилка завантаження", @@ -27,6 +29,7 @@ "{count} files uploading" => "{count} файлів завантажується", "Upload cancelled." => "Завантаження перервано.", "File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Невірне ім'я каталогу. Використання \"Shared\" зарезервовано Owncloud", "{count} files scanned" => "{count} файлів проскановано", "error while scanning" => "помилка при скануванні", "Name" => "Ім'я", @@ -36,8 +39,10 @@ "{count} folders" => "{count} папок", "1 file" => "1 файл", "{count} files" => "{count} файлів", +"File handling" => "Робота з файлами", "Maximum upload size" => "Максимальний розмір відвантажень", "max. possible: " => "макс.можливе:", +"Needed for multi-file and folder downloads." => "Необхідно для мульти-файлового та каталогового завантаження.", "Enable ZIP-download" => "Активувати ZIP-завантаження", "0 is unlimited" => "0 є безліміт", "Maximum input size for ZIP files" => "Максимальний розмір завантажуємого ZIP файлу", diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php index 9140a24f2f..047caae39f 100644 --- a/apps/files/l10n/vi.php +++ b/apps/files/l10n/vi.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "đã thay thế {new_name} bằng {old_name}", "unshared {files}" => "hủy chia sẽ {files}", "deleted {files}" => "đã xóa {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng.", "generating ZIP-file, it may take some time." => "Tạo tập tin ZIP, điều này có thể làm mất một chút thời gian", "Unable to upload your file as it is a directory or has 0 bytes" => "Không thể tải lên tập tin này do nó là một thư mục hoặc kích thước tập tin bằng 0 byte", "Upload Error" => "Tải lên lỗi", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} tập tin đang tải lên", "Upload cancelled." => "Hủy tải lên", "File upload is in progress. Leaving the page now will cancel the upload." => "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Tên thư mục không hợp lệ. Sử dụng \"Chia sẻ\" được dành riêng bởi Owncloud", "{count} files scanned" => "{count} tập tin đã được quét", "error while scanning" => "lỗi trong khi quét", "Name" => "Tên", diff --git a/apps/files_external/l10n/uk.php b/apps/files_external/l10n/uk.php index ea8f2b2665..478342380e 100644 --- a/apps/files_external/l10n/uk.php +++ b/apps/files_external/l10n/uk.php @@ -10,6 +10,7 @@ "Backend" => "Backend", "Configuration" => "Налаштування", "Options" => "Опції", +"Applicable" => "Придатний", "Add mount point" => "Додати точку монтування", "None set" => "Не встановлено", "All Users" => "Усі користувачі", diff --git a/apps/user_webdavauth/l10n/zh_TW.php b/apps/user_webdavauth/l10n/zh_TW.php new file mode 100644 index 0000000000..79740561e5 --- /dev/null +++ b/apps/user_webdavauth/l10n/zh_TW.php @@ -0,0 +1,3 @@ + "WebDAV 網址 http://" +); diff --git a/core/l10n/eu.php b/core/l10n/eu.php index 8bc5d690d5..0dbf3d4169 100644 --- a/core/l10n/eu.php +++ b/core/l10n/eu.php @@ -4,13 +4,20 @@ "This category already exists: " => "Kategoria hau dagoeneko existitzen da:", "Object type not provided." => "Objetu mota ez da zehaztu.", "%s ID not provided." => "%s ID mota ez da zehaztu.", +"Error adding %s to favorites." => "Errorea gertatu da %s gogokoetara gehitzean.", "No categories selected for deletion." => "Ez da ezabatzeko kategoriarik hautatu.", +"Error removing %s from favorites." => "Errorea gertatu da %s gogokoetatik ezabatzean.", "Settings" => "Ezarpenak", "seconds ago" => "segundu", "1 minute ago" => "orain dela minutu 1", +"{minutes} minutes ago" => "orain dela {minutes} minutu", +"1 hour ago" => "orain dela ordu bat", +"{hours} hours ago" => "orain dela {hours} ordu", "today" => "gaur", "yesterday" => "atzo", +"{days} days ago" => "orain dela {days} egun", "last month" => "joan den hilabetean", +"{months} months ago" => "orain dela {months} hilabete", "months ago" => "hilabete", "last year" => "joan den urtean", "years ago" => "urte", @@ -19,10 +26,15 @@ "No" => "Ez", "Yes" => "Bai", "Ok" => "Ados", +"The object type is not specified." => "Objetu mota ez dago zehaztuta.", "Error" => "Errorea", +"The app name is not specified." => "App izena ez dago zehaztuta.", +"The required file {file} is not installed!" => "Beharrezkoa den {file} fitxategia ez dago instalatuta!", "Error while sharing" => "Errore bat egon da elkarbanatzean", "Error while unsharing" => "Errore bat egon da elkarbanaketa desegitean", "Error while changing permissions" => "Errore bat egon da baimenak aldatzean", +"Shared with you and the group {group} by {owner}" => "{owner}-k zu eta {group} taldearekin partekatuta", +"Shared with you by {owner}" => "{owner}-k zurekin partekatuta", "Share with" => "Elkarbanatu honekin", "Share with link" => "Elkarbanatu lotura batekin", "Password protect" => "Babestu pasahitzarekin", @@ -32,6 +44,7 @@ "Share via email:" => "Elkarbanatu eposta bidez:", "No people found" => "Ez da inor aurkitu", "Resharing is not allowed" => "Berriz elkarbanatzea ez dago baimendua", +"Shared in {item} with {user}" => "{user}ekin {item}-n partekatuta", "Unshare" => "Ez elkarbanatu", "can edit" => "editatu dezake", "access control" => "sarrera kontrola", @@ -45,6 +58,8 @@ "ownCloud password reset" => "ownCloud-en pasahitza berrezarri", "Use the following link to reset your password: {link}" => "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", "You will receive a link to reset your password via Email." => "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez.", +"Reset email send." => "Berrezartzeko eposta bidali da.", +"Request failed!" => "Eskariak huts egin du!", "Username" => "Erabiltzaile izena", "Request reset" => "Eskaera berrezarri da", "Your password was reset" => "Zure pasahitza berrezarri da", @@ -61,6 +76,8 @@ "Edit categories" => "Editatu kategoriak", "Add" => "Gehitu", "Security Warning" => "Segurtasun abisua", +"No secure random number generator is available, please enable the PHP OpenSSL extension." => "Ez dago hausazko zenbaki sortzaile segururik eskuragarri, mesedez gatiu PHP OpenSSL extensioa.", +"Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "Hausazko zenbaki sortzaile segururik gabe erasotzaile batek pasahitza berrezartzeko kodeak iragarri ditzake eta zure kontuaz jabetu.", "Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "Zure data karpeta eta zure fitxategiak internetetik zuzenean eskuragarri egon daitezke. ownCloudek emandako .htaccess fitxategia ez du bere lana egiten. Aholkatzen dizugu zure web zerbitzaria ongi konfiguratzea data karpeta eskuragarri ez izateko edo data karpeta web zerbitzariaren dokumentu errotik mugitzea.", "Create an admin account" => "Sortu kudeatzaile kontu bat", "Advanced" => "Aurreratua", @@ -94,6 +111,9 @@ "December" => "Abendua", "web services under your control" => "web zerbitzuak zure kontrolpean", "Log out" => "Saioa bukatu", +"Automatic logon rejected!" => "Saio hasiera automatikoa ez onartuta!", +"If you did not change your password recently, your account may be compromised!" => "Zure pasahitza orain dela gutxi ez baduzu aldatu, zure kontua arriskuan egon daiteke!", +"Please change your password to secure your account again." => "Mesedez aldatu zure pasahitza zure kontua berriz segurtatzeko.", "Lost your password?" => "Galdu duzu pasahitza?", "remember" => "gogoratu", "Log in" => "Hasi saioa", @@ -101,5 +121,6 @@ "prev" => "aurrekoa", "next" => "hurrengoa", "Security Warning!" => "Segurtasun abisua", +"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "Mesedez egiaztatu zure pasahitza.
    Segurtasun arrazoiengatik noizbehinka zure pasahitza berriz sartzea eska diezazukegu.", "Verify" => "Egiaztatu" ); diff --git a/core/l10n/uk.php b/core/l10n/uk.php index fd5b7be8dc..904ab03bf8 100644 --- a/core/l10n/uk.php +++ b/core/l10n/uk.php @@ -1,22 +1,67 @@ "Не вказано тип категорії.", +"No category to add?" => "Відсутні категорії для додавання?", +"This category already exists: " => "Ця категорія вже існує: ", +"Object type not provided." => "Не вказано тип об'єкту.", +"%s ID not provided." => "%s ID не вказано.", +"Error adding %s to favorites." => "Помилка при додаванні %s до обраного.", +"No categories selected for deletion." => "Жодної категорії не обрано для видалення.", +"Error removing %s from favorites." => "Помилка при видалені %s із обраного.", "Settings" => "Налаштування", "seconds ago" => "секунди тому", "1 minute ago" => "1 хвилину тому", +"{minutes} minutes ago" => "{minutes} хвилин тому", +"1 hour ago" => "1 годину тому", +"{hours} hours ago" => "{hours} години тому", "today" => "сьогодні", "yesterday" => "вчора", +"{days} days ago" => "{days} днів тому", "last month" => "минулого місяця", +"{months} months ago" => "{months} місяців тому", "months ago" => "місяці тому", "last year" => "минулого року", "years ago" => "роки тому", +"Choose" => "Обрати", "Cancel" => "Відмінити", "No" => "Ні", "Yes" => "Так", +"Ok" => "Ok", +"The object type is not specified." => "Не визначено тип об'єкту.", "Error" => "Помилка", +"The app name is not specified." => "Не визначено ім'я програми.", +"The required file {file} is not installed!" => "Необхідний файл {file} не встановлено!", +"Error while sharing" => "Помилка під час публікації", +"Error while unsharing" => "Помилка під час відміни публікації", +"Error while changing permissions" => "Помилка при зміні повноважень", +"Shared with you and the group {group} by {owner}" => " {owner} опублікував для Вас та для групи {group}", +"Shared with you by {owner}" => "{owner} опублікував для Вас", +"Share with" => "Опублікувати для", +"Share with link" => "Опублікувати через посилання", +"Password protect" => "Захистити паролем", "Password" => "Пароль", +"Set expiration date" => "Встановити термін дії", +"Expiration date" => "Термін дії", +"Share via email:" => "Опублікувати через електронну пошту:", +"No people found" => "Жодної людини не знайдено", +"Resharing is not allowed" => "Пере-публікація не дозволяється", +"Shared in {item} with {user}" => "Опубліковано {item} для {user}", "Unshare" => "Заборонити доступ", +"can edit" => "може редагувати", +"access control" => "контроль доступу", "create" => "створити", +"update" => "оновити", +"delete" => "видалити", +"share" => "опублікувати", +"Password protected" => "Захищено паролем", +"Error unsetting expiration date" => "Помилка при відміні терміна дії", +"Error setting expiration date" => "Помилка при встановленні терміна дії", +"ownCloud password reset" => "скидання пароля ownCloud", +"Use the following link to reset your password: {link}" => "Використовуйте наступне посилання для скидання пароля: {link}", "You will receive a link to reset your password via Email." => "Ви отримаєте посилання для скидання вашого паролю на e-mail.", +"Reset email send." => "Лист скидання відправлено.", +"Request failed!" => "Невдалий запит!", "Username" => "Ім'я користувача", +"Request reset" => "Запит скидання", "Your password was reset" => "Ваш пароль був скинутий", "To login page" => "До сторінки входу", "New password" => "Новий пароль", @@ -26,12 +71,24 @@ "Apps" => "Додатки", "Admin" => "Адміністратор", "Help" => "Допомога", +"Access forbidden" => "Доступ заборонено", +"Cloud not found" => "Cloud не знайдено", +"Edit categories" => "Редагувати категорії", "Add" => "Додати", +"Security Warning" => "Попередження про небезпеку", +"No secure random number generator is available, please enable the PHP OpenSSL extension." => "Не доступний безпечний генератор випадкових чисел, будь ласка, активуйте PHP OpenSSL додаток.", +"Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "Без безпечного генератора випадкових чисел зловмисник може визначити токени скидання пароля і заволодіти Вашим обліковим записом.", +"Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "Ваш каталог з даними та Ваші файли можливо доступні з Інтернету. Файл .htaccess, наданий з ownCloud, не працює. Ми наполегливо рекомендуємо Вам налаштувати свій веб-сервер таким чином, щоб каталог data більше не був доступний, або перемістити каталог data за межі кореневого каталогу документів веб-сервера.", +"Create an admin account" => "Створити обліковий запис адміністратора", +"Advanced" => "Додатково", +"Data folder" => "Каталог даних", "Configure the database" => "Налаштування бази даних", "will be used" => "буде використано", "Database user" => "Користувач бази даних", "Database password" => "Пароль для бази даних", "Database name" => "Назва бази даних", +"Database tablespace" => "Таблиця бази даних", +"Database host" => "Хост бази даних", "Finish setup" => "Завершити налаштування", "Sunday" => "Неділя", "Monday" => "Понеділок", @@ -54,7 +111,16 @@ "December" => "Грудень", "web services under your control" => "веб-сервіс під вашим контролем", "Log out" => "Вихід", +"Automatic logon rejected!" => "Автоматичний вхід в систему відхилений!", +"If you did not change your password recently, your account may be compromised!" => "Якщо Ви не міняли пароль останнім часом, Ваш обліковий запис може бути скомпрометованим!", +"Please change your password to secure your account again." => "Будь ласка, змініть свій пароль, щоб знову захистити Ваш обліковий запис.", "Lost your password?" => "Забули пароль?", "remember" => "запам'ятати", -"Log in" => "Вхід" +"Log in" => "Вхід", +"You are logged out." => "Ви вийшли з системи.", +"prev" => "попередній", +"next" => "наступний", +"Security Warning!" => "Попередження про небезпеку!", +"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "Будь ласка, повторно введіть свій пароль.
    З питань безпеки, Вам інколи доведеться повторно вводити свій пароль.", +"Verify" => "Підтвердити" ); diff --git a/l10n/eu/core.po b/l10n/eu/core.po index 1c55b9ec27..0aa8ffd8d1 100644 --- a/l10n/eu/core.po +++ b/l10n/eu/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 23:01+0000\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-25 23:09+0000\n" "Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" @@ -46,7 +46,7 @@ msgstr "%s ID mota ez da zehaztu." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Errorea gertatu da %s gogokoetara gehitzean." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -55,7 +55,7 @@ msgstr "Ez da ezabatzeko kategoriarik hautatu." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Errorea gertatu da %s gogokoetatik ezabatzean." #: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" @@ -71,15 +71,15 @@ msgstr "orain dela minutu 1" #: js/js.js:706 msgid "{minutes} minutes ago" -msgstr "" +msgstr "orain dela {minutes} minutu" #: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "orain dela ordu bat" #: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "orain dela {hours} ordu" #: js/js.js:709 msgid "today" @@ -91,7 +91,7 @@ msgstr "atzo" #: js/js.js:711 msgid "{days} days ago" -msgstr "" +msgstr "orain dela {days} egun" #: js/js.js:712 msgid "last month" @@ -99,7 +99,7 @@ msgstr "joan den hilabetean" #: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "orain dela {months} hilabete" #: js/js.js:714 msgid "months ago" @@ -136,21 +136,21 @@ msgstr "Ados" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Objetu mota ez dago zehaztuta." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Errorea" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "App izena ez dago zehaztuta." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "Beharrezkoa den {file} fitxategia ez dago instalatuta!" #: js/share.js:124 msgid "Error while sharing" @@ -166,11 +166,11 @@ msgstr "Errore bat egon da baimenak aldatzean" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr "{owner}-k zu eta {group} taldearekin partekatuta" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "{owner}-k zurekin partekatuta" #: js/share.js:158 msgid "Share with" @@ -211,7 +211,7 @@ msgstr "Berriz elkarbanatzea ez dago baimendua" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "{user}ekin {item}-n partekatuta" #: js/share.js:292 msgid "Unshare" @@ -241,15 +241,15 @@ msgstr "ezabatu" msgid "share" msgstr "elkarbanatu" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "Pasahitzarekin babestuta" -#: js/share.js:527 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "Errorea izan da muga data kentzean" -#: js/share.js:539 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "Errore bat egon da muga data ezartzean" @@ -267,11 +267,11 @@ msgstr "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez." #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." -msgstr "" +msgstr "Berrezartzeko eposta bidali da." #: lostpassword/templates/lostpassword.php:8 msgid "Request failed!" -msgstr "" +msgstr "Eskariak huts egin du!" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -342,13 +342,13 @@ msgstr "Segurtasun abisua" msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." -msgstr "" +msgstr "Ez dago hausazko zenbaki sortzaile segururik eskuragarri, mesedez gatiu PHP OpenSSL extensioa." #: templates/installation.php:26 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." -msgstr "" +msgstr "Hausazko zenbaki sortzaile segururik gabe erasotzaile batek pasahitza berrezartzeko kodeak iragarri ditzake eta zure kontuaz jabetu." #: templates/installation.php:32 msgid "" @@ -490,17 +490,17 @@ msgstr "Saioa bukatu" #: templates/login.php:8 msgid "Automatic logon rejected!" -msgstr "" +msgstr "Saio hasiera automatikoa ez onartuta!" #: templates/login.php:9 msgid "" "If you did not change your password recently, your account may be " "compromised!" -msgstr "" +msgstr "Zure pasahitza orain dela gutxi ez baduzu aldatu, zure kontua arriskuan egon daiteke!" #: templates/login.php:10 msgid "Please change your password to secure your account again." -msgstr "" +msgstr "Mesedez aldatu zure pasahitza zure kontua berriz segurtatzeko." #: templates/login.php:15 msgid "Lost your password?" @@ -534,7 +534,7 @@ msgstr "Segurtasun abisua" msgid "" "Please verify your password.
    For security reasons you may be " "occasionally asked to enter your password again." -msgstr "" +msgstr "Mesedez egiaztatu zure pasahitza.
    Segurtasun arrazoiengatik noizbehinka zure pasahitza berriz sartzea eska diezazukegu." #: templates/verify.php:16 msgid "Verify" diff --git a/l10n/eu/lib.po b/l10n/eu/lib.po index d5e5423a86..9442caf83a 100644 --- a/l10n/eu/lib.po +++ b/l10n/eu/lib.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-25 23:10+0000\n" +"Last-Translator: asieriko \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,19 +42,19 @@ msgstr "Aplikazioak" msgid "Admin" msgstr "Admin" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "ZIP deskarga ez dago gaituta." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Fitxategiak banan-banan deskargatu behar dira." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Itzuli fitxategietara" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "Hautatuko fitxategiak oso handiak dira zip fitxategia sortzeko." @@ -80,7 +80,7 @@ msgstr "Testua" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "Irudiak" #: template.php:103 msgid "seconds ago" @@ -97,12 +97,12 @@ msgstr "orain dela %d minutu" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "orain dela ordu bat" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "orain dela %d ordu" #: template.php:108 msgid "today" @@ -124,7 +124,7 @@ msgstr "joan den hilabetea" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "orain dela %d hilabete" #: template.php:113 msgid "last year" @@ -150,4 +150,4 @@ msgstr "eguneraketen egiaztapena ez dago gaituta" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Ezin da \"%s\" kategoria aurkitu" diff --git a/l10n/fi_FI/files.po b/l10n/fi_FI/files.po index 697ee9b096..1072d44d60 100644 --- a/l10n/fi_FI/files.po +++ b/l10n/fi_FI/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 19:12+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -108,7 +108,7 @@ msgstr "" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po index a1f5fe2d2b..3309dc415c 100644 --- a/l10n/ja_JP/files.po +++ b/l10n/ja_JP/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 01:15+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -106,7 +106,7 @@ msgstr "削除 {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。" #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -147,7 +147,7 @@ msgstr "ファイル転送を実行中です。今このページから移動す #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "無効なフォルダ名です。\"Shared\" の利用は ownCloud が予約済みです。" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/ru/files.po b/l10n/ru/files.po index 880fc8a162..bb7209b951 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -6,6 +6,7 @@ # Denis , 2012. # , 2012. # , 2012. +# , 2012. # Nick Remeslennikov , 2012. # , 2012. # , 2011. @@ -15,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 16:49+0000\n" +"Last-Translator: mPolr \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -111,7 +112,7 @@ msgstr "удаленные {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/ru_RU/files.po b/l10n/ru_RU/files.po index 22c0f16561..a2b13fb41d 100644 --- a/l10n/ru_RU/files.po +++ b/l10n/ru_RU/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 06:47+0000\n" +"Last-Translator: AnnaSch \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -105,7 +105,7 @@ msgstr "удалено {файлы}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Некорректное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не допустимы." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/sq/core.po b/l10n/sq/core.po new file mode 100644 index 0000000000..57c778722b --- /dev/null +++ b/l10n/sq/core.po @@ -0,0 +1,539 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2011-07-25 16:05+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 +msgid "Category type not provided." +msgstr "" + +#: ajax/vcategories/add.php:30 +msgid "No category to add?" +msgstr "" + +#: ajax/vcategories/add.php:37 +msgid "This category already exists: " +msgstr "" + +#: ajax/vcategories/addToFavorites.php:26 ajax/vcategories/delete.php:27 +#: ajax/vcategories/favorites.php:24 +#: ajax/vcategories/removeFromFavorites.php:26 +msgid "Object type not provided." +msgstr "" + +#: ajax/vcategories/addToFavorites.php:30 +#: ajax/vcategories/removeFromFavorites.php:30 +#, php-format +msgid "%s ID not provided." +msgstr "" + +#: ajax/vcategories/addToFavorites.php:35 +#, php-format +msgid "Error adding %s to favorites." +msgstr "" + +#: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 +msgid "No categories selected for deletion." +msgstr "" + +#: ajax/vcategories/removeFromFavorites.php:35 +#, php-format +msgid "Error removing %s from favorites." +msgstr "" + +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 +msgid "Settings" +msgstr "" + +#: js/js.js:704 +msgid "seconds ago" +msgstr "" + +#: js/js.js:705 +msgid "1 minute ago" +msgstr "" + +#: js/js.js:706 +msgid "{minutes} minutes ago" +msgstr "" + +#: js/js.js:707 +msgid "1 hour ago" +msgstr "" + +#: js/js.js:708 +msgid "{hours} hours ago" +msgstr "" + +#: js/js.js:709 +msgid "today" +msgstr "" + +#: js/js.js:710 +msgid "yesterday" +msgstr "" + +#: js/js.js:711 +msgid "{days} days ago" +msgstr "" + +#: js/js.js:712 +msgid "last month" +msgstr "" + +#: js/js.js:713 +msgid "{months} months ago" +msgstr "" + +#: js/js.js:714 +msgid "months ago" +msgstr "" + +#: js/js.js:715 +msgid "last year" +msgstr "" + +#: js/js.js:716 +msgid "years ago" +msgstr "" + +#: js/oc-dialogs.js:126 +msgid "Choose" +msgstr "" + +#: js/oc-dialogs.js:146 js/oc-dialogs.js:166 +msgid "Cancel" +msgstr "" + +#: js/oc-dialogs.js:162 +msgid "No" +msgstr "" + +#: js/oc-dialogs.js:163 +msgid "Yes" +msgstr "" + +#: js/oc-dialogs.js:180 +msgid "Ok" +msgstr "" + +#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 +#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 +msgid "The object type is not specified." +msgstr "" + +#: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 +msgid "Error" +msgstr "" + +#: js/oc-vcategories.js:179 +msgid "The app name is not specified." +msgstr "" + +#: js/oc-vcategories.js:194 +msgid "The required file {file} is not installed!" +msgstr "" + +#: js/share.js:124 +msgid "Error while sharing" +msgstr "" + +#: js/share.js:135 +msgid "Error while unsharing" +msgstr "" + +#: js/share.js:142 +msgid "Error while changing permissions" +msgstr "" + +#: js/share.js:151 +msgid "Shared with you and the group {group} by {owner}" +msgstr "" + +#: js/share.js:153 +msgid "Shared with you by {owner}" +msgstr "" + +#: js/share.js:158 +msgid "Share with" +msgstr "" + +#: js/share.js:163 +msgid "Share with link" +msgstr "" + +#: js/share.js:164 +msgid "Password protect" +msgstr "" + +#: js/share.js:168 templates/installation.php:42 templates/login.php:24 +#: templates/verify.php:13 +msgid "Password" +msgstr "" + +#: js/share.js:173 +msgid "Set expiration date" +msgstr "" + +#: js/share.js:174 +msgid "Expiration date" +msgstr "" + +#: js/share.js:206 +msgid "Share via email:" +msgstr "" + +#: js/share.js:208 +msgid "No people found" +msgstr "" + +#: js/share.js:235 +msgid "Resharing is not allowed" +msgstr "" + +#: js/share.js:271 +msgid "Shared in {item} with {user}" +msgstr "" + +#: js/share.js:292 +msgid "Unshare" +msgstr "" + +#: js/share.js:304 +msgid "can edit" +msgstr "" + +#: js/share.js:306 +msgid "access control" +msgstr "" + +#: js/share.js:309 +msgid "create" +msgstr "" + +#: js/share.js:312 +msgid "update" +msgstr "" + +#: js/share.js:315 +msgid "delete" +msgstr "" + +#: js/share.js:318 +msgid "share" +msgstr "" + +#: js/share.js:349 js/share.js:520 js/share.js:522 +msgid "Password protected" +msgstr "" + +#: js/share.js:533 +msgid "Error unsetting expiration date" +msgstr "" + +#: js/share.js:545 +msgid "Error setting expiration date" +msgstr "" + +#: lostpassword/controller.php:47 +msgid "ownCloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:2 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Reset email send." +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Request failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 +#: templates/login.php:20 +msgid "Username" +msgstr "" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + +#: strings.php:5 +msgid "Personal" +msgstr "" + +#: strings.php:6 +msgid "Users" +msgstr "" + +#: strings.php:7 +msgid "Apps" +msgstr "" + +#: strings.php:8 +msgid "Admin" +msgstr "" + +#: strings.php:9 +msgid "Help" +msgstr "" + +#: templates/403.php:12 +msgid "Access forbidden" +msgstr "" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "" + +#: templates/edit_categories_dialog.php:4 +msgid "Edit categories" +msgstr "" + +#: templates/edit_categories_dialog.php:16 +msgid "Add" +msgstr "" + +#: templates/installation.php:23 templates/installation.php:31 +msgid "Security Warning" +msgstr "" + +#: templates/installation.php:24 +msgid "" +"No secure random number generator is available, please enable the PHP " +"OpenSSL extension." +msgstr "" + +#: templates/installation.php:26 +msgid "" +"Without a secure random number generator an attacker may be able to predict " +"password reset tokens and take over your account." +msgstr "" + +#: templates/installation.php:32 +msgid "" +"Your data directory and your files are probably accessible from the " +"internet. The .htaccess file that ownCloud provides is not working. We " +"strongly suggest that you configure your webserver in a way that the data " +"directory is no longer accessible or you move the data directory outside the" +" webserver document root." +msgstr "" + +#: templates/installation.php:36 +msgid "Create an admin account" +msgstr "" + +#: templates/installation.php:48 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:50 +msgid "Data folder" +msgstr "" + +#: templates/installation.php:57 +msgid "Configure the database" +msgstr "" + +#: templates/installation.php:62 templates/installation.php:73 +#: templates/installation.php:83 templates/installation.php:93 +msgid "will be used" +msgstr "" + +#: templates/installation.php:105 +msgid "Database user" +msgstr "" + +#: templates/installation.php:109 +msgid "Database password" +msgstr "" + +#: templates/installation.php:113 +msgid "Database name" +msgstr "" + +#: templates/installation.php:121 +msgid "Database tablespace" +msgstr "" + +#: templates/installation.php:127 +msgid "Database host" +msgstr "" + +#: templates/installation.php:132 +msgid "Finish setup" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Sunday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Monday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Tuesday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Wednesday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Thursday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Friday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Saturday" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "January" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "February" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "March" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "April" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "May" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "June" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "July" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "August" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "September" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "October" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "November" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "December" +msgstr "" + +#: templates/layout.guest.php:42 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:45 +msgid "Log out" +msgstr "" + +#: templates/login.php:8 +msgid "Automatic logon rejected!" +msgstr "" + +#: templates/login.php:9 +msgid "" +"If you did not change your password recently, your account may be " +"compromised!" +msgstr "" + +#: templates/login.php:10 +msgid "Please change your password to secure your account again." +msgstr "" + +#: templates/login.php:15 +msgid "Lost your password?" +msgstr "" + +#: templates/login.php:27 +msgid "remember" +msgstr "" + +#: templates/login.php:28 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "" + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "" + +#: templates/verify.php:5 +msgid "Security Warning!" +msgstr "" + +#: templates/verify.php:6 +msgid "" +"Please verify your password.
    For security reasons you may be " +"occasionally asked to enter your password again." +msgstr "" + +#: templates/verify.php:16 +msgid "Verify" +msgstr "" diff --git a/l10n/sq/files.po b/l10n/sq/files.po new file mode 100644 index 0000000000..ef9e0bd116 --- /dev/null +++ b/l10n/sq/files.po @@ -0,0 +1,269 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2011-08-13 02:19+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/upload.php:20 +msgid "There is no error, the file uploaded with success" +msgstr "" + +#: ajax/upload.php:21 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" + +#: ajax/upload.php:22 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" + +#: ajax/upload.php:23 +msgid "The uploaded file was only partially uploaded" +msgstr "" + +#: ajax/upload.php:24 +msgid "No file was uploaded" +msgstr "" + +#: ajax/upload.php:25 +msgid "Missing a temporary folder" +msgstr "" + +#: ajax/upload.php:26 +msgid "Failed to write to disk" +msgstr "" + +#: appinfo/app.php:6 +msgid "Files" +msgstr "" + +#: js/fileactions.js:117 templates/index.php:64 +msgid "Unshare" +msgstr "" + +#: js/fileactions.js:119 templates/index.php:66 +msgid "Delete" +msgstr "" + +#: js/fileactions.js:181 +msgid "Rename" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "{new_name} already exists" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "replace" +msgstr "" + +#: js/filelist.js:201 +msgid "suggest name" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "cancel" +msgstr "" + +#: js/filelist.js:250 +msgid "replaced {new_name}" +msgstr "" + +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +msgid "undo" +msgstr "" + +#: js/filelist.js:252 +msgid "replaced {new_name} with {old_name}" +msgstr "" + +#: js/filelist.js:284 +msgid "unshared {files}" +msgstr "" + +#: js/filelist.js:286 +msgid "deleted {files}" +msgstr "" + +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 +msgid "generating ZIP-file, it may take some time." +msgstr "" + +#: js/files.js:218 +msgid "Unable to upload your file as it is a directory or has 0 bytes" +msgstr "" + +#: js/files.js:218 +msgid "Upload Error" +msgstr "" + +#: js/files.js:235 +msgid "Close" +msgstr "" + +#: js/files.js:254 js/files.js:368 js/files.js:398 +msgid "Pending" +msgstr "" + +#: js/files.js:274 +msgid "1 file uploading" +msgstr "" + +#: js/files.js:277 js/files.js:331 js/files.js:346 +msgid "{count} files uploading" +msgstr "" + +#: js/files.js:349 js/files.js:382 +msgid "Upload cancelled." +msgstr "" + +#: js/files.js:451 +msgid "" +"File upload is in progress. Leaving the page now will cancel the upload." +msgstr "" + +#: js/files.js:523 +msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" +msgstr "" + +#: js/files.js:704 +msgid "{count} files scanned" +msgstr "" + +#: js/files.js:712 +msgid "error while scanning" +msgstr "" + +#: js/files.js:785 templates/index.php:50 +msgid "Name" +msgstr "" + +#: js/files.js:786 templates/index.php:58 +msgid "Size" +msgstr "" + +#: js/files.js:787 templates/index.php:60 +msgid "Modified" +msgstr "" + +#: js/files.js:814 +msgid "1 folder" +msgstr "" + +#: js/files.js:816 +msgid "{count} folders" +msgstr "" + +#: js/files.js:824 +msgid "1 file" +msgstr "" + +#: js/files.js:826 +msgid "{count} files" +msgstr "" + +#: templates/admin.php:5 +msgid "File handling" +msgstr "" + +#: templates/admin.php:7 +msgid "Maximum upload size" +msgstr "" + +#: templates/admin.php:7 +msgid "max. possible: " +msgstr "" + +#: templates/admin.php:9 +msgid "Needed for multi-file and folder downloads." +msgstr "" + +#: templates/admin.php:9 +msgid "Enable ZIP-download" +msgstr "" + +#: templates/admin.php:11 +msgid "0 is unlimited" +msgstr "" + +#: templates/admin.php:12 +msgid "Maximum input size for ZIP files" +msgstr "" + +#: templates/admin.php:15 +msgid "Save" +msgstr "" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:9 +msgid "Text file" +msgstr "" + +#: templates/index.php:10 +msgid "Folder" +msgstr "" + +#: templates/index.php:11 +msgid "From link" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "" + +#: templates/index.php:29 +msgid "Cancel upload" +msgstr "" + +#: templates/index.php:42 +msgid "Nothing in here. Upload something!" +msgstr "" + +#: templates/index.php:52 +msgid "Share" +msgstr "" + +#: templates/index.php:54 +msgid "Download" +msgstr "" + +#: templates/index.php:77 +msgid "Upload too large" +msgstr "" + +#: templates/index.php:79 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" + +#: templates/index.php:84 +msgid "Files are being scanned, please wait." +msgstr "" + +#: templates/index.php:87 +msgid "Current scanning" +msgstr "" diff --git a/l10n/sq/files_encryption.po b/l10n/sq/files_encryption.po new file mode 100644 index 0000000000..e62739f8f2 --- /dev/null +++ b/l10n/sq/files_encryption.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-08-12 22:33+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:3 +msgid "Encryption" +msgstr "" + +#: templates/settings.php:4 +msgid "Exclude the following file types from encryption" +msgstr "" + +#: templates/settings.php:5 +msgid "None" +msgstr "" + +#: templates/settings.php:10 +msgid "Enable Encryption" +msgstr "" diff --git a/l10n/sq/files_external.po b/l10n/sq/files_external.po new file mode 100644 index 0000000000..a677ece5f4 --- /dev/null +++ b/l10n/sq/files_external.po @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-08-12 22:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: js/dropbox.js:7 js/dropbox.js:25 js/google.js:7 js/google.js:23 +msgid "Access granted" +msgstr "" + +#: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 +msgid "Error configuring Dropbox storage" +msgstr "" + +#: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 +msgid "Grant access" +msgstr "" + +#: js/dropbox.js:73 js/google.js:72 +msgid "Fill out all required fields" +msgstr "" + +#: js/dropbox.js:85 +msgid "Please provide a valid Dropbox app key and secret." +msgstr "" + +#: js/google.js:26 js/google.js:73 js/google.js:78 +msgid "Error configuring Google Drive storage" +msgstr "" + +#: templates/settings.php:3 +msgid "External Storage" +msgstr "" + +#: templates/settings.php:7 templates/settings.php:19 +msgid "Mount point" +msgstr "" + +#: templates/settings.php:8 +msgid "Backend" +msgstr "" + +#: templates/settings.php:9 +msgid "Configuration" +msgstr "" + +#: templates/settings.php:10 +msgid "Options" +msgstr "" + +#: templates/settings.php:11 +msgid "Applicable" +msgstr "" + +#: templates/settings.php:23 +msgid "Add mount point" +msgstr "" + +#: templates/settings.php:54 templates/settings.php:62 +msgid "None set" +msgstr "" + +#: templates/settings.php:63 +msgid "All Users" +msgstr "" + +#: templates/settings.php:64 +msgid "Groups" +msgstr "" + +#: templates/settings.php:69 +msgid "Users" +msgstr "" + +#: templates/settings.php:77 templates/settings.php:107 +msgid "Delete" +msgstr "" + +#: templates/settings.php:87 +msgid "Enable User External Storage" +msgstr "" + +#: templates/settings.php:88 +msgid "Allow users to mount their own external storage" +msgstr "" + +#: templates/settings.php:99 +msgid "SSL root certificates" +msgstr "" + +#: templates/settings.php:113 +msgid "Import Root Certificate" +msgstr "" diff --git a/l10n/sq/files_sharing.po b/l10n/sq/files_sharing.po new file mode 100644 index 0000000000..110e4b2ac2 --- /dev/null +++ b/l10n/sq/files_sharing.po @@ -0,0 +1,48 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-08-12 22:35+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/authenticate.php:4 +msgid "Password" +msgstr "" + +#: templates/authenticate.php:6 +msgid "Submit" +msgstr "" + +#: templates/public.php:17 +#, php-format +msgid "%s shared the folder %s with you" +msgstr "" + +#: templates/public.php:19 +#, php-format +msgid "%s shared the file %s with you" +msgstr "" + +#: templates/public.php:22 templates/public.php:38 +msgid "Download" +msgstr "" + +#: templates/public.php:37 +msgid "No preview available for" +msgstr "" + +#: templates/public.php:43 +msgid "web services under your control" +msgstr "" diff --git a/l10n/sq/files_versions.po b/l10n/sq/files_versions.po new file mode 100644 index 0000000000..97616a4063 --- /dev/null +++ b/l10n/sq/files_versions.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-08-12 22:37+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: js/settings-personal.js:31 templates/settings-personal.php:10 +msgid "Expire all versions" +msgstr "" + +#: js/versions.js:16 +msgid "History" +msgstr "" + +#: templates/settings-personal.php:4 +msgid "Versions" +msgstr "" + +#: templates/settings-personal.php:7 +msgid "This will delete all existing backup versions of your files" +msgstr "" + +#: templates/settings.php:3 +msgid "Files Versioning" +msgstr "" + +#: templates/settings.php:4 +msgid "Enable" +msgstr "" diff --git a/l10n/sq/lib.po b/l10n/sq/lib.po new file mode 100644 index 0000000000..431a0e3c62 --- /dev/null +++ b/l10n/sq/lib.po @@ -0,0 +1,152 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-07-27 22:23+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: app.php:285 +msgid "Help" +msgstr "" + +#: app.php:292 +msgid "Personal" +msgstr "" + +#: app.php:297 +msgid "Settings" +msgstr "" + +#: app.php:302 +msgid "Users" +msgstr "" + +#: app.php:309 +msgid "Apps" +msgstr "" + +#: app.php:311 +msgid "Admin" +msgstr "" + +#: files.php:361 +msgid "ZIP download is turned off." +msgstr "" + +#: files.php:362 +msgid "Files need to be downloaded one by one." +msgstr "" + +#: files.php:362 files.php:387 +msgid "Back to Files" +msgstr "" + +#: files.php:386 +msgid "Selected files too large to generate zip file." +msgstr "" + +#: json.php:28 +msgid "Application is not enabled" +msgstr "" + +#: json.php:39 json.php:64 json.php:77 json.php:89 +msgid "Authentication error" +msgstr "" + +#: json.php:51 +msgid "Token expired. Please reload page." +msgstr "" + +#: search/provider/file.php:17 search/provider/file.php:35 +msgid "Files" +msgstr "" + +#: search/provider/file.php:26 search/provider/file.php:33 +msgid "Text" +msgstr "" + +#: search/provider/file.php:29 +msgid "Images" +msgstr "" + +#: template.php:103 +msgid "seconds ago" +msgstr "" + +#: template.php:104 +msgid "1 minute ago" +msgstr "" + +#: template.php:105 +#, php-format +msgid "%d minutes ago" +msgstr "" + +#: template.php:106 +msgid "1 hour ago" +msgstr "" + +#: template.php:107 +#, php-format +msgid "%d hours ago" +msgstr "" + +#: template.php:108 +msgid "today" +msgstr "" + +#: template.php:109 +msgid "yesterday" +msgstr "" + +#: template.php:110 +#, php-format +msgid "%d days ago" +msgstr "" + +#: template.php:111 +msgid "last month" +msgstr "" + +#: template.php:112 +#, php-format +msgid "%d months ago" +msgstr "" + +#: template.php:113 +msgid "last year" +msgstr "" + +#: template.php:114 +msgid "years ago" +msgstr "" + +#: updater.php:75 +#, php-format +msgid "%s is available. Get more information" +msgstr "" + +#: updater.php:77 +msgid "up to date" +msgstr "" + +#: updater.php:80 +msgid "updates check is disabled" +msgstr "" + +#: vcategories.php:188 vcategories.php:249 +#, php-format +msgid "Could not find category \"%s\"" +msgstr "" diff --git a/l10n/sq/settings.po b/l10n/sq/settings.po new file mode 100644 index 0000000000..970d7a6556 --- /dev/null +++ b/l10n/sq/settings.po @@ -0,0 +1,243 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2011-07-25 16:05+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/apps/ocs.php:20 +msgid "Unable to load list from App Store" +msgstr "" + +#: ajax/creategroup.php:10 +msgid "Group already exists" +msgstr "" + +#: ajax/creategroup.php:19 +msgid "Unable to add group" +msgstr "" + +#: ajax/enableapp.php:12 +msgid "Could not enable app. " +msgstr "" + +#: ajax/lostpassword.php:12 +msgid "Email saved" +msgstr "" + +#: ajax/lostpassword.php:14 +msgid "Invalid email" +msgstr "" + +#: ajax/openid.php:13 +msgid "OpenID Changed" +msgstr "" + +#: ajax/openid.php:15 ajax/setlanguage.php:17 ajax/setlanguage.php:20 +msgid "Invalid request" +msgstr "" + +#: ajax/removegroup.php:13 +msgid "Unable to delete group" +msgstr "" + +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +msgid "Authentication error" +msgstr "" + +#: ajax/removeuser.php:24 +msgid "Unable to delete user" +msgstr "" + +#: ajax/setlanguage.php:15 +msgid "Language changed" +msgstr "" + +#: ajax/togglegroups.php:22 +#, php-format +msgid "Unable to add user to group %s" +msgstr "" + +#: ajax/togglegroups.php:28 +#, php-format +msgid "Unable to remove user from group %s" +msgstr "" + +#: js/apps.js:28 js/apps.js:67 +msgid "Disable" +msgstr "" + +#: js/apps.js:28 js/apps.js:55 +msgid "Enable" +msgstr "" + +#: js/personal.js:69 +msgid "Saving..." +msgstr "" + +#: personal.php:42 personal.php:43 +msgid "__language_name__" +msgstr "" + +#: templates/apps.php:10 +msgid "Add your App" +msgstr "" + +#: templates/apps.php:11 +msgid "More Apps" +msgstr "" + +#: templates/apps.php:27 +msgid "Select an App" +msgstr "" + +#: templates/apps.php:31 +msgid "See application page at apps.owncloud.com" +msgstr "" + +#: templates/apps.php:32 +msgid "-licensed by " +msgstr "" + +#: templates/help.php:9 +msgid "Documentation" +msgstr "" + +#: templates/help.php:10 +msgid "Managing Big Files" +msgstr "" + +#: templates/help.php:11 +msgid "Ask a question" +msgstr "" + +#: templates/help.php:22 +msgid "Problems connecting to help database." +msgstr "" + +#: templates/help.php:23 +msgid "Go there manually." +msgstr "" + +#: templates/help.php:31 +msgid "Answer" +msgstr "" + +#: templates/personal.php:8 +#, php-format +msgid "You have used %s of the available %s" +msgstr "" + +#: templates/personal.php:12 +msgid "Desktop and Mobile Syncing Clients" +msgstr "" + +#: templates/personal.php:13 +msgid "Download" +msgstr "" + +#: templates/personal.php:19 +msgid "Your password was changed" +msgstr "" + +#: templates/personal.php:20 +msgid "Unable to change your password" +msgstr "" + +#: templates/personal.php:21 +msgid "Current password" +msgstr "" + +#: templates/personal.php:22 +msgid "New password" +msgstr "" + +#: templates/personal.php:23 +msgid "show" +msgstr "" + +#: templates/personal.php:24 +msgid "Change password" +msgstr "" + +#: templates/personal.php:30 +msgid "Email" +msgstr "" + +#: templates/personal.php:31 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:32 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:38 templates/personal.php:39 +msgid "Language" +msgstr "" + +#: templates/personal.php:44 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:51 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" + +#: templates/personal.php:61 +msgid "" +"Developed by the ownCloud community, the source code is " +"licensed under the AGPL." +msgstr "" + +#: templates/users.php:21 templates/users.php:76 +msgid "Name" +msgstr "" + +#: templates/users.php:23 templates/users.php:77 +msgid "Password" +msgstr "" + +#: templates/users.php:26 templates/users.php:78 templates/users.php:98 +msgid "Groups" +msgstr "" + +#: templates/users.php:32 +msgid "Create" +msgstr "" + +#: templates/users.php:35 +msgid "Default Quota" +msgstr "" + +#: templates/users.php:55 templates/users.php:138 +msgid "Other" +msgstr "" + +#: templates/users.php:80 templates/users.php:112 +msgid "Group Admin" +msgstr "" + +#: templates/users.php:82 +msgid "Quota" +msgstr "" + +#: templates/users.php:146 +msgid "Delete" +msgstr "" diff --git a/l10n/sq/user_ldap.po b/l10n/sq/user_ldap.po new file mode 100644 index 0000000000..16fd4ec420 --- /dev/null +++ b/l10n/sq/user_ldap.po @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-08-12 22:45+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:8 +msgid "Host" +msgstr "" + +#: templates/settings.php:8 +msgid "" +"You can omit the protocol, except you require SSL. Then start with ldaps://" +msgstr "" + +#: templates/settings.php:9 +msgid "Base DN" +msgstr "" + +#: templates/settings.php:9 +msgid "You can specify Base DN for users and groups in the Advanced tab" +msgstr "" + +#: templates/settings.php:10 +msgid "User DN" +msgstr "" + +#: templates/settings.php:10 +msgid "" +"The DN of the client user with which the bind shall be done, e.g. " +"uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " +"empty." +msgstr "" + +#: templates/settings.php:11 +msgid "Password" +msgstr "" + +#: templates/settings.php:11 +msgid "For anonymous access, leave DN and Password empty." +msgstr "" + +#: templates/settings.php:12 +msgid "User Login Filter" +msgstr "" + +#: templates/settings.php:12 +#, php-format +msgid "" +"Defines the filter to apply, when login is attempted. %%uid replaces the " +"username in the login action." +msgstr "" + +#: templates/settings.php:12 +#, php-format +msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" +msgstr "" + +#: templates/settings.php:13 +msgid "User List Filter" +msgstr "" + +#: templates/settings.php:13 +msgid "Defines the filter to apply, when retrieving users." +msgstr "" + +#: templates/settings.php:13 +msgid "without any placeholder, e.g. \"objectClass=person\"." +msgstr "" + +#: templates/settings.php:14 +msgid "Group Filter" +msgstr "" + +#: templates/settings.php:14 +msgid "Defines the filter to apply, when retrieving groups." +msgstr "" + +#: templates/settings.php:14 +msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." +msgstr "" + +#: templates/settings.php:17 +msgid "Port" +msgstr "" + +#: templates/settings.php:18 +msgid "Base User Tree" +msgstr "" + +#: templates/settings.php:19 +msgid "Base Group Tree" +msgstr "" + +#: templates/settings.php:20 +msgid "Group-Member association" +msgstr "" + +#: templates/settings.php:21 +msgid "Use TLS" +msgstr "" + +#: templates/settings.php:21 +msgid "Do not use it for SSL connections, it will fail." +msgstr "" + +#: templates/settings.php:22 +msgid "Case insensitve LDAP server (Windows)" +msgstr "" + +#: templates/settings.php:23 +msgid "Turn off SSL certificate validation." +msgstr "" + +#: templates/settings.php:23 +msgid "" +"If connection only works with this option, import the LDAP server's SSL " +"certificate in your ownCloud server." +msgstr "" + +#: templates/settings.php:23 +msgid "Not recommended, use for testing only." +msgstr "" + +#: templates/settings.php:24 +msgid "User Display Name Field" +msgstr "" + +#: templates/settings.php:24 +msgid "The LDAP attribute to use to generate the user`s ownCloud name." +msgstr "" + +#: templates/settings.php:25 +msgid "Group Display Name Field" +msgstr "" + +#: templates/settings.php:25 +msgid "The LDAP attribute to use to generate the groups`s ownCloud name." +msgstr "" + +#: templates/settings.php:27 +msgid "in bytes" +msgstr "" + +#: templates/settings.php:29 +msgid "in seconds. A change empties the cache." +msgstr "" + +#: templates/settings.php:30 +msgid "" +"Leave empty for user name (default). Otherwise, specify an LDAP/AD " +"attribute." +msgstr "" + +#: templates/settings.php:32 +msgid "Help" +msgstr "" diff --git a/l10n/sq/user_webdavauth.po b/l10n/sq/user_webdavauth.po new file mode 100644 index 0000000000..d3865a501b --- /dev/null +++ b/l10n/sq/user_webdavauth.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-09 09:06+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:4 +msgid "WebDAV URL: http://" +msgstr "" diff --git a/l10n/sv/files.po b/l10n/sv/files.po index 3d1c98ce1c..9d03aae199 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 10:00+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -109,7 +109,7 @@ msgstr "raderade {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -150,7 +150,7 @@ msgstr "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen." #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Ogiltigt mappnamn. Ordet \"Delad\" är reserverat av ownCloud." #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index b09dccc2a7..066258912d 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -137,8 +137,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "" @@ -239,15 +239,15 @@ msgstr "" msgid "share" msgstr "" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "" -#: js/share.js:527 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:539 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 423f7f4273..9e9b9c8a37 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 55cd072fc3..ae938e7936 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index a08e7852bc..914289d74f 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index f1a671c7ee..819e1fdae2 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index e2a5cec27b..1a0d45b2c1 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 66bfa23b0c..5aec951442 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 20ea64dcbe..d44ef6475c 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 40a4786ac1..9772531424 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 3740c1853c..1bb445c451 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/uk/core.po b/l10n/uk/core.po index 04d09bce07..c10c7fcfba 100644 --- a/l10n/uk/core.po +++ b/l10n/uk/core.po @@ -4,15 +4,16 @@ # # Translators: # , 2012. +# , 2012. # Soul Kim , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-26 15:28+0000\n" +"Last-Translator: skoptev \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,101 +23,101 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Не вказано тип категорії." #: ajax/vcategories/add.php:30 msgid "No category to add?" -msgstr "" +msgstr "Відсутні категорії для додавання?" #: ajax/vcategories/add.php:37 msgid "This category already exists: " -msgstr "" +msgstr "Ця категорія вже існує: " #: ajax/vcategories/addToFavorites.php:26 ajax/vcategories/delete.php:27 #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Не вказано тип об'єкту." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "%s ID не вказано." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Помилка при додаванні %s до обраного." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." -msgstr "" +msgstr "Жодної категорії не обрано для видалення." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Помилка при видалені %s із обраного." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Налаштування" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "секунди тому" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 хвилину тому" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" -msgstr "" +msgstr "{minutes} хвилин тому" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "1 годину тому" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "{hours} години тому" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "сьогодні" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "вчора" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" -msgstr "" +msgstr "{days} днів тому" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "минулого місяця" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "{months} місяців тому" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "місяці тому" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "минулого року" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "роки тому" #: js/oc-dialogs.js:126 msgid "Choose" -msgstr "" +msgstr "Обрати" #: js/oc-dialogs.js:146 js/oc-dialogs.js:166 msgid "Cancel" @@ -132,58 +133,58 @@ msgstr "Так" #: js/oc-dialogs.js:180 msgid "Ok" -msgstr "" +msgstr "Ok" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Не визначено тип об'єкту." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Помилка" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "Не визначено ім'я програми." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "Необхідний файл {file} не встановлено!" #: js/share.js:124 msgid "Error while sharing" -msgstr "" +msgstr "Помилка під час публікації" #: js/share.js:135 msgid "Error while unsharing" -msgstr "" +msgstr "Помилка під час відміни публікації" #: js/share.js:142 msgid "Error while changing permissions" -msgstr "" +msgstr "Помилка при зміні повноважень" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr " {owner} опублікував для Вас та для групи {group}" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "{owner} опублікував для Вас" #: js/share.js:158 msgid "Share with" -msgstr "" +msgstr "Опублікувати для" #: js/share.js:163 msgid "Share with link" -msgstr "" +msgstr "Опублікувати через посилання" #: js/share.js:164 msgid "Password protect" -msgstr "" +msgstr "Захистити паролем" #: js/share.js:168 templates/installation.php:42 templates/login.php:24 #: templates/verify.php:13 @@ -192,27 +193,27 @@ msgstr "Пароль" #: js/share.js:173 msgid "Set expiration date" -msgstr "" +msgstr "Встановити термін дії" #: js/share.js:174 msgid "Expiration date" -msgstr "" +msgstr "Термін дії" #: js/share.js:206 msgid "Share via email:" -msgstr "" +msgstr "Опублікувати через електронну пошту:" #: js/share.js:208 msgid "No people found" -msgstr "" +msgstr "Жодної людини не знайдено" #: js/share.js:235 msgid "Resharing is not allowed" -msgstr "" +msgstr "Пере-публікація не дозволяється" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "Опубліковано {item} для {user}" #: js/share.js:292 msgid "Unshare" @@ -220,11 +221,11 @@ msgstr "Заборонити доступ" #: js/share.js:304 msgid "can edit" -msgstr "" +msgstr "може редагувати" #: js/share.js:306 msgid "access control" -msgstr "" +msgstr "контроль доступу" #: js/share.js:309 msgid "create" @@ -232,35 +233,35 @@ msgstr "створити" #: js/share.js:312 msgid "update" -msgstr "" +msgstr "оновити" #: js/share.js:315 msgid "delete" -msgstr "" +msgstr "видалити" #: js/share.js:318 msgid "share" -msgstr "" +msgstr "опублікувати" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" -msgstr "" +msgstr "Захищено паролем" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" -msgstr "" +msgstr "Помилка при відміні терміна дії" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" -msgstr "" +msgstr "Помилка при встановленні терміна дії" #: lostpassword/controller.php:47 msgid "ownCloud password reset" -msgstr "" +msgstr "скидання пароля ownCloud" #: lostpassword/templates/email.php:2 msgid "Use the following link to reset your password: {link}" -msgstr "" +msgstr "Використовуйте наступне посилання для скидання пароля: {link}" #: lostpassword/templates/lostpassword.php:3 msgid "You will receive a link to reset your password via Email." @@ -268,11 +269,11 @@ msgstr "Ви отримаєте посилання для скидання ва #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." -msgstr "" +msgstr "Лист скидання відправлено." #: lostpassword/templates/lostpassword.php:8 msgid "Request failed!" -msgstr "" +msgstr "Невдалий запит!" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -281,7 +282,7 @@ msgstr "Ім'я користувача" #: lostpassword/templates/lostpassword.php:14 msgid "Request reset" -msgstr "" +msgstr "Запит скидання" #: lostpassword/templates/resetpassword.php:4 msgid "Your password was reset" @@ -321,15 +322,15 @@ msgstr "Допомога" #: templates/403.php:12 msgid "Access forbidden" -msgstr "" +msgstr "Доступ заборонено" #: templates/404.php:12 msgid "Cloud not found" -msgstr "" +msgstr "Cloud не знайдено" #: templates/edit_categories_dialog.php:4 msgid "Edit categories" -msgstr "" +msgstr "Редагувати категорії" #: templates/edit_categories_dialog.php:16 msgid "Add" @@ -337,19 +338,19 @@ msgstr "Додати" #: templates/installation.php:23 templates/installation.php:31 msgid "Security Warning" -msgstr "" +msgstr "Попередження про небезпеку" #: templates/installation.php:24 msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." -msgstr "" +msgstr "Не доступний безпечний генератор випадкових чисел, будь ласка, активуйте PHP OpenSSL додаток." #: templates/installation.php:26 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." -msgstr "" +msgstr "Без безпечного генератора випадкових чисел зловмисник може визначити токени скидання пароля і заволодіти Вашим обліковим записом." #: templates/installation.php:32 msgid "" @@ -358,19 +359,19 @@ msgid "" "strongly suggest that you configure your webserver in a way that the data " "directory is no longer accessible or you move the data directory outside the" " webserver document root." -msgstr "" +msgstr "Ваш каталог з даними та Ваші файли можливо доступні з Інтернету. Файл .htaccess, наданий з ownCloud, не працює. Ми наполегливо рекомендуємо Вам налаштувати свій веб-сервер таким чином, щоб каталог data більше не був доступний, або перемістити каталог data за межі кореневого каталогу документів веб-сервера." #: templates/installation.php:36 msgid "Create an admin account" -msgstr "" +msgstr "Створити обліковий запис адміністратора" #: templates/installation.php:48 msgid "Advanced" -msgstr "" +msgstr "Додатково" #: templates/installation.php:50 msgid "Data folder" -msgstr "" +msgstr "Каталог даних" #: templates/installation.php:57 msgid "Configure the database" @@ -395,113 +396,113 @@ msgstr "Назва бази даних" #: templates/installation.php:121 msgid "Database tablespace" -msgstr "" +msgstr "Таблиця бази даних" #: templates/installation.php:127 msgid "Database host" -msgstr "" +msgstr "Хост бази даних" #: templates/installation.php:132 msgid "Finish setup" msgstr "Завершити налаштування" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Неділя" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Понеділок" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вівторок" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Середа" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвер" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "П'ятниця" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Субота" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Січень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Лютий" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Березень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Квітень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Травень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Червень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Липень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Серпень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Вересень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Жовтень" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Листопад" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Грудень" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "веб-сервіс під вашим контролем" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Вихід" #: templates/login.php:8 msgid "Automatic logon rejected!" -msgstr "" +msgstr "Автоматичний вхід в систему відхилений!" #: templates/login.php:9 msgid "" "If you did not change your password recently, your account may be " "compromised!" -msgstr "" +msgstr "Якщо Ви не міняли пароль останнім часом, Ваш обліковий запис може бути скомпрометованим!" #: templates/login.php:10 msgid "Please change your password to secure your account again." -msgstr "" +msgstr "Будь ласка, змініть свій пароль, щоб знову захистити Ваш обліковий запис." #: templates/login.php:15 msgid "Lost your password?" @@ -517,26 +518,26 @@ msgstr "Вхід" #: templates/logout.php:1 msgid "You are logged out." -msgstr "" +msgstr "Ви вийшли з системи." #: templates/part.pagenavi.php:3 msgid "prev" -msgstr "" +msgstr "попередній" #: templates/part.pagenavi.php:20 msgid "next" -msgstr "" +msgstr "наступний" #: templates/verify.php:5 msgid "Security Warning!" -msgstr "" +msgstr "Попередження про небезпеку!" #: templates/verify.php:6 msgid "" "Please verify your password.
    For security reasons you may be " "occasionally asked to enter your password again." -msgstr "" +msgstr "Будь ласка, повторно введіть свій пароль.
    З питань безпеки, Вам інколи доведеться повторно вводити свій пароль." #: templates/verify.php:16 msgid "Verify" -msgstr "" +msgstr "Підтвердити" diff --git a/l10n/uk/files.po b/l10n/uk/files.po index c1e2cd3499..3c75939887 100644 --- a/l10n/uk/files.po +++ b/l10n/uk/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 15:33+0000\n" +"Last-Translator: skoptev \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -96,7 +96,7 @@ msgstr "замінено {new_name} на {old_name}" #: js/filelist.js:284 msgid "unshared {files}" -msgstr "" +msgstr "неопубліковано {files}" #: js/filelist.js:286 msgid "deleted {files}" @@ -106,7 +106,7 @@ msgstr "видалено {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -147,7 +147,7 @@ msgstr "Виконується завантаження файлу. Закрит #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Невірне ім'я каталогу. Використання \"Shared\" зарезервовано Owncloud" #: js/files.js:704 msgid "{count} files scanned" @@ -187,7 +187,7 @@ msgstr "{count} файлів" #: templates/admin.php:5 msgid "File handling" -msgstr "" +msgstr "Робота з файлами" #: templates/admin.php:7 msgid "Maximum upload size" @@ -199,7 +199,7 @@ msgstr "макс.можливе:" #: templates/admin.php:9 msgid "Needed for multi-file and folder downloads." -msgstr "" +msgstr "Необхідно для мульти-файлового та каталогового завантаження." #: templates/admin.php:9 msgid "Enable ZIP-download" diff --git a/l10n/uk/files_external.po b/l10n/uk/files_external.po index a3dbe8d1d6..ce97ceed4c 100644 --- a/l10n/uk/files_external.po +++ b/l10n/uk/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-20 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 15:12+0000\n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 15:31+0000\n" "Last-Translator: skoptev \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" @@ -65,7 +65,7 @@ msgstr "Опції" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Придатний" #: templates/settings.php:23 msgid "Add mount point" diff --git a/l10n/uk/lib.po b/l10n/uk/lib.po index f6e249e3ef..f2a86e7170 100644 --- a/l10n/uk/lib.po +++ b/l10n/uk/lib.po @@ -4,14 +4,15 @@ # # Translators: # , 2012. +# , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-26 15:40+0000\n" +"Last-Translator: skoptev \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +44,19 @@ msgstr "Додатки" msgid "Admin" msgstr "Адмін" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "ZIP завантаження вимкнено." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Файли повинні бути завантаженні послідовно." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Повернутися до файлів" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "Вибрані фали завеликі для генерування zip файлу." @@ -69,7 +70,7 @@ msgstr "Помилка автентифікації" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "" +msgstr "Строк дії токена скінчився. Будь ласка, перезавантажте сторінку." #: search/provider/file.php:17 search/provider/file.php:35 msgid "Files" @@ -81,7 +82,7 @@ msgstr "Текст" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "Зображення" #: template.php:103 msgid "seconds ago" @@ -98,12 +99,12 @@ msgstr "%d хвилин тому" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "1 годину тому" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "%d годин тому" #: template.php:108 msgid "today" @@ -125,7 +126,7 @@ msgstr "минулого місяця" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "%d місяців тому" #: template.php:113 msgid "last year" @@ -138,11 +139,11 @@ msgstr "роки тому" #: updater.php:75 #, php-format msgid "%s is available. Get more information" -msgstr "" +msgstr "%s доступно. Отримати детальну інформацію" #: updater.php:77 msgid "up to date" -msgstr "" +msgstr "оновлено" #: updater.php:80 msgid "updates check is disabled" @@ -151,4 +152,4 @@ msgstr "перевірка оновлень відключена" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Не вдалося знайти категорію \"%s\"" diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po index 9ebc9fce4a..fefdb36a52 100644 --- a/l10n/uk/settings.po +++ b/l10n/uk/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 13:10+0000\n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-26 15:30+0000\n" "Last-Translator: skoptev \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" @@ -131,7 +131,7 @@ msgstr "Проблема при з'єднані з базою допомоги" #: templates/help.php:23 msgid "Go there manually." -msgstr "" +msgstr "Перейти вручну." #: templates/help.php:31 msgid "Answer" diff --git a/l10n/vi/files.po b/l10n/vi/files.po index c44fa3bfe7..7e32322143 100644 --- a/l10n/vi/files.po +++ b/l10n/vi/files.po @@ -4,15 +4,16 @@ # # Translators: # , 2012. +# , 2012. # , 2012. # Sơn Nguyễn , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:09+0100\n" +"PO-Revision-Date: 2012-11-26 03:19+0000\n" +"Last-Translator: mattheu_9x \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -106,7 +107,7 @@ msgstr "đã xóa {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -147,7 +148,7 @@ msgstr "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi t #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Tên thư mục không hợp lệ. Sử dụng \"Chia sẻ\" được dành riêng bởi Owncloud" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/zh_TW/lib.po b/l10n/zh_TW/lib.po index 18209881c6..2bc0c14b6c 100644 --- a/l10n/zh_TW/lib.po +++ b/l10n/zh_TW/lib.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # , 2012. # ywang , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-26 09:03+0000\n" +"Last-Translator: sofiasu \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +44,19 @@ msgstr "應用程式" msgid "Admin" msgstr "管理" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "ZIP 下載已關閉" -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "檔案需要逐一下載" -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "回到檔案列表" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "選擇的檔案太大以致於無法產生壓縮檔" @@ -81,7 +82,7 @@ msgstr "文字" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "圖片" #: template.php:103 msgid "seconds ago" @@ -98,12 +99,12 @@ msgstr "%d 分鐘前" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "1小時之前" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "%d小時之前" #: template.php:108 msgid "today" @@ -125,7 +126,7 @@ msgstr "上個月" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "%d個月之前" #: template.php:113 msgid "last year" @@ -151,4 +152,4 @@ msgstr "檢查更新已停用" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "找不到分類-\"%s\"" diff --git a/l10n/zh_TW/user_webdavauth.po b/l10n/zh_TW/user_webdavauth.po index f3eed87863..5a191f76b2 100644 --- a/l10n/zh_TW/user_webdavauth.po +++ b/l10n/zh_TW/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-27 00:10+0100\n" +"PO-Revision-Date: 2012-11-26 09:00+0000\n" +"Last-Translator: sofiasu \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV 網址 http://" diff --git a/lib/l10n/eu.php b/lib/l10n/eu.php index ae1a89eb85..5d47ecbda2 100644 --- a/lib/l10n/eu.php +++ b/lib/l10n/eu.php @@ -14,16 +14,21 @@ "Token expired. Please reload page." => "Tokena iraungitu da. Mesedez birkargatu orria.", "Files" => "Fitxategiak", "Text" => "Testua", +"Images" => "Irudiak", "seconds ago" => "orain dela segundu batzuk", "1 minute ago" => "orain dela minutu 1", "%d minutes ago" => "orain dela %d minutu", +"1 hour ago" => "orain dela ordu bat", +"%d hours ago" => "orain dela %d ordu", "today" => "gaur", "yesterday" => "atzo", "%d days ago" => "orain dela %d egun", "last month" => "joan den hilabetea", +"%d months ago" => "orain dela %d hilabete", "last year" => "joan den urtea", "years ago" => "orain dela urte batzuk", "%s is available. Get more information" => "%s eskuragarri dago. Lortu informazio gehiago", "up to date" => "eguneratuta", -"updates check is disabled" => "eguneraketen egiaztapena ez dago gaituta" +"updates check is disabled" => "eguneraketen egiaztapena ez dago gaituta", +"Could not find category \"%s\"" => "Ezin da \"%s\" kategoria aurkitu" ); diff --git a/lib/l10n/uk.php b/lib/l10n/uk.php index f606c4aca4..f5d52f8682 100644 --- a/lib/l10n/uk.php +++ b/lib/l10n/uk.php @@ -11,16 +11,24 @@ "Selected files too large to generate zip file." => "Вибрані фали завеликі для генерування zip файлу.", "Application is not enabled" => "Додаток не увімкнений", "Authentication error" => "Помилка автентифікації", +"Token expired. Please reload page." => "Строк дії токена скінчився. Будь ласка, перезавантажте сторінку.", "Files" => "Файли", "Text" => "Текст", +"Images" => "Зображення", "seconds ago" => "секунди тому", "1 minute ago" => "1 хвилину тому", "%d minutes ago" => "%d хвилин тому", +"1 hour ago" => "1 годину тому", +"%d hours ago" => "%d годин тому", "today" => "сьогодні", "yesterday" => "вчора", "%d days ago" => "%d днів тому", "last month" => "минулого місяця", +"%d months ago" => "%d місяців тому", "last year" => "минулого року", "years ago" => "роки тому", -"updates check is disabled" => "перевірка оновлень відключена" +"%s is available. Get more information" => "%s доступно. Отримати детальну інформацію", +"up to date" => "оновлено", +"updates check is disabled" => "перевірка оновлень відключена", +"Could not find category \"%s\"" => "Не вдалося знайти категорію \"%s\"" ); diff --git a/lib/l10n/zh_TW.php b/lib/l10n/zh_TW.php index 16229fe03d..4dbf89c2e0 100644 --- a/lib/l10n/zh_TW.php +++ b/lib/l10n/zh_TW.php @@ -14,16 +14,21 @@ "Token expired. Please reload page." => "Token 過期. 請重新整理頁面", "Files" => "檔案", "Text" => "文字", +"Images" => "圖片", "seconds ago" => "幾秒前", "1 minute ago" => "1 分鐘前", "%d minutes ago" => "%d 分鐘前", +"1 hour ago" => "1小時之前", +"%d hours ago" => "%d小時之前", "today" => "今天", "yesterday" => "昨天", "%d days ago" => "%d 天前", "last month" => "上個月", +"%d months ago" => "%d個月之前", "last year" => "去年", "years ago" => "幾年前", "%s is available. Get more information" => "%s 已經可用. 取得 更多資訊", "up to date" => "最新的", -"updates check is disabled" => "檢查更新已停用" +"updates check is disabled" => "檢查更新已停用", +"Could not find category \"%s\"" => "找不到分類-\"%s\"" ); diff --git a/settings/l10n/uk.php b/settings/l10n/uk.php index 1b63fdbfc0..dd8ed567a7 100644 --- a/settings/l10n/uk.php +++ b/settings/l10n/uk.php @@ -26,6 +26,7 @@ "Managing Big Files" => "Управління великими файлами", "Ask a question" => "Запитати", "Problems connecting to help database." => "Проблема при з'єднані з базою допомоги", +"Go there manually." => "Перейти вручну.", "Answer" => "Відповідь", "You have used %s of the available %s" => "Ви використали %s із доступних %s", "Desktop and Mobile Syncing Clients" => "Настільні та мобільні клієнти синхронізації", From 9a441d3e3a30e03db2f4541153cf5c1943f288a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 27 Nov 2012 17:38:21 +0100 Subject: [PATCH 357/481] show drag shadow in firefox by using helper:'clone' --- apps/files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/js/files.js b/apps/files/js/files.js index dbd9a64715..d29732f9b3 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -730,7 +730,7 @@ function updateBreadcrumb(breadcrumbHtml) { //options for file drag/dropp var dragOptions={ - distance: 20, revert: 'invalid', opacity: 0.7, + distance: 20, revert: 'invalid', opacity: 0.7, helper: 'clone', stop: function(event, ui) { $('#fileList tr td.filename').addClass('ui-draggable'); } From 80d1037e427c31c165abead3696668bac8110413 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 27 Nov 2012 20:22:45 +0100 Subject: [PATCH 358/481] Group name does't need to be sanitized before storing it in the database It should only be sanitized before display --- settings/ajax/togglegroups.php | 2 +- settings/ajax/togglesubadmins.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/ajax/togglegroups.php b/settings/ajax/togglegroups.php index de941f9913..b7746fed8f 100644 --- a/settings/ajax/togglegroups.php +++ b/settings/ajax/togglegroups.php @@ -5,7 +5,7 @@ OCP\JSON::callCheck(); $success = true; $username = $_POST["username"]; -$group = OC_Util::sanitizeHTML($_POST["group"]); +$group = $_POST["group"]; if(!OC_Group::inGroup(OC_User::getUser(), 'admin') && (!OC_SubAdmin::isUserAccessible(OC_User::getUser(), $username) || !OC_SubAdmin::isGroupAccessible(OC_User::getUser(), $group))) { $l = OC_L10N::get('core'); diff --git a/settings/ajax/togglesubadmins.php b/settings/ajax/togglesubadmins.php index 7aaa90aad5..a99e805f69 100644 --- a/settings/ajax/togglesubadmins.php +++ b/settings/ajax/togglesubadmins.php @@ -4,7 +4,7 @@ OC_JSON::checkAdminUser(); OCP\JSON::callCheck(); $username = $_POST["username"]; -$group = OC_Util::sanitizeHTML($_POST["group"]); +$group = $_POST["group"]; // Toggle group if(OC_SubAdmin::isSubAdminofGroup($username, $group)) { From 5c9faf396a1afc1a35f2c922e2afb98e219f3abd Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 27 Nov 2012 23:01:26 +0100 Subject: [PATCH 359/481] Sharing: Fix false positived v. 2 --- core/js/share.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/js/share.js b/core/js/share.js index 0f71ae2241..475abb58bf 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -146,7 +146,7 @@ OC.Share={ showDropDown:function(itemType, itemSource, appendTo, link, possiblePermissions) { var data = OC.Share.loadItem(itemType, itemSource); var html = ' @@ -49,9 +64,12 @@ t( 'Name' ); ?> - - Download" /> t('Download')?> + + Download" /> + t('Download')?> + @@ -61,9 +79,17 @@ - t('Unshare')?> <?php echo $l->t('Unshare')?>" /> + + t('Unshare')?> + <?php echo $l->t('Unshare')?>" /> + - t('Delete')?> <?php echo $l->t('Delete')?>" /> + + t('Delete')?> + <?php echo $l->t('Delete')?>" /> + @@ -76,7 +102,7 @@

    - t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?> + t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?>

    diff --git a/apps/files/templates/part.breadcrumb.php b/apps/files/templates/part.breadcrumb.php index ba1432c1b8..f7b1a6076d 100644 --- a/apps/files/templates/part.breadcrumb.php +++ b/apps/files/templates/part.breadcrumb.php @@ -1,7 +1,9 @@ -
    svg" data-dir='' style='background-image:url("")'> + $dir = str_replace('+', '%20', urlencode($crumb["dir"])); ?> +
    svg" + data-dir='' + style='background-image:url("")'>
    - + - + + var publicListView = true; + + var publicListView = false; + 200) $relative_date_color = 200; $name = str_replace('+', '%20', urlencode($file['name'])); $name = str_replace('%2F', '/', $name); $directory = str_replace('+', '%20', urlencode($file['directory'])); $directory = str_replace('%2F', '/', $directory); ?> - ' data-permissions=''> - - - + ' + data-permissions=''> + + style="background-image:url()" + + style="background-image:url()" + + > + + + + + + - + @@ -35,7 +52,19 @@ - - + + + + + + + + - + Date: Fri, 30 Nov 2012 00:05:16 +0100 Subject: [PATCH 389/481] [tx-robot] updated from transifex --- apps/files/l10n/et_EE.php | 2 ++ apps/files_external/l10n/gl.php | 10 +++++----- apps/files_sharing/l10n/gl.php | 10 +++++----- apps/files_versions/l10n/gl.php | 6 +++--- apps/user_webdavauth/l10n/et_EE.php | 3 +++ l10n/ar/settings.po | 14 +++++++++----- l10n/bg_BG/settings.po | 14 +++++++++----- l10n/ca/settings.po | 14 +++++++++----- l10n/cs_CZ/settings.po | 16 ++++++++++------ l10n/da/settings.po | 14 +++++++++----- l10n/de/settings.po | 16 ++++++++++------ l10n/de_DE/settings.po | 16 ++++++++++------ l10n/el/settings.po | 16 ++++++++++------ l10n/eo/settings.po | 14 +++++++++----- l10n/es/settings.po | 14 +++++++++----- l10n/es_AR/settings.po | 16 ++++++++++------ l10n/et_EE/files.po | 10 +++++----- l10n/et_EE/settings.po | 14 +++++++++----- l10n/et_EE/user_webdavauth.po | 9 +++++---- l10n/eu/settings.po | 16 ++++++++++------ l10n/fa/settings.po | 16 ++++++++++------ l10n/fi_FI/settings.po | 16 ++++++++++------ l10n/fr/settings.po | 16 ++++++++++------ l10n/gl/files_external.po | 17 +++++++++-------- l10n/gl/files_sharing.po | 27 ++++++++++++++------------- l10n/gl/files_versions.po | 13 +++++++------ l10n/gl/settings.po | 16 ++++++++++------ l10n/he/settings.po | 14 +++++++++----- l10n/hi/settings.po | 14 +++++++++----- l10n/hr/settings.po | 14 +++++++++----- l10n/hu_HU/settings.po | 14 +++++++++----- l10n/ia/settings.po | 14 +++++++++----- l10n/id/settings.po | 14 +++++++++----- l10n/it/settings.po | 14 +++++++++----- l10n/ja_JP/settings.po | 16 ++++++++++------ l10n/ka_GE/settings.po | 14 +++++++++----- l10n/ko/settings.po | 16 ++++++++++------ l10n/ku_IQ/settings.po | 14 +++++++++----- l10n/lb/settings.po | 14 +++++++++----- l10n/lt_LT/settings.po | 14 +++++++++----- l10n/lv/settings.po | 16 ++++++++++------ l10n/mk/settings.po | 14 +++++++++----- l10n/ms_MY/settings.po | 14 +++++++++----- l10n/nb_NO/settings.po | 14 +++++++++----- l10n/nl/settings.po | 14 +++++++++----- l10n/nn_NO/settings.po | 14 +++++++++----- l10n/oc/settings.po | 14 +++++++++----- l10n/pl/settings.po | 14 +++++++++----- l10n/pl_PL/settings.po | 14 +++++++++----- l10n/pt_BR/settings.po | 16 ++++++++++------ l10n/pt_PT/settings.po | 16 ++++++++++------ l10n/ro/settings.po | 14 +++++++++----- l10n/ru/settings.po | 14 +++++++++----- l10n/ru_RU/settings.po | 16 ++++++++++------ l10n/si_LK/settings.po | 16 ++++++++++------ l10n/sk_SK/settings.po | 14 +++++++++----- l10n/sl/settings.po | 16 ++++++++++------ l10n/sq/settings.po | 16 ++++++++++------ l10n/sr/settings.po | 14 +++++++++----- l10n/sr@latin/settings.po | 14 +++++++++----- l10n/sv/settings.po | 16 ++++++++++------ l10n/ta_LK/settings.po | 16 ++++++++++------ l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 12 ++++++++---- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/settings.po | 16 ++++++++++------ l10n/tr/settings.po | 14 +++++++++----- l10n/uk/settings.po | 16 ++++++++++------ l10n/vi/settings.po | 16 ++++++++++------ l10n/zh_CN.GB2312/settings.po | 14 +++++++++----- l10n/zh_CN/settings.po | 16 ++++++++++------ l10n/zh_HK/settings.po | 16 ++++++++++------ l10n/zh_TW/settings.po | 16 ++++++++++------ l10n/zu_ZA/settings.po | 14 +++++++++----- 81 files changed, 651 insertions(+), 394 deletions(-) create mode 100644 apps/user_webdavauth/l10n/et_EE.php diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index 66b6e69d69..c89060db43 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -19,6 +19,7 @@ "replaced {new_name} with {old_name}" => "asendas nime {old_name} nimega {new_name}", "unshared {files}" => "jagamata {files}", "deleted {files}" => "kustutatud {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.", "generating ZIP-file, it may take some time." => "ZIP-faili loomine, see võib veidi aega võtta.", "Unable to upload your file as it is a directory or has 0 bytes" => "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti", "Upload Error" => "Üleslaadimise viga", @@ -28,6 +29,7 @@ "{count} files uploading" => "{count} faili üleslaadimist", "Upload cancelled." => "Üleslaadimine tühistati.", "File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Vigane kausta nimi. Nime \"Jagatud\" kasutamine on Owncloudi poolt broneeritud ", "{count} files scanned" => "{count} faili skännitud", "error while scanning" => "viga skännimisel", "Name" => "Nimi", diff --git a/apps/files_external/l10n/gl.php b/apps/files_external/l10n/gl.php index f98809bfc0..5024dac4d8 100644 --- a/apps/files_external/l10n/gl.php +++ b/apps/files_external/l10n/gl.php @@ -1,19 +1,19 @@ "Concedeuse acceso", -"Error configuring Dropbox storage" => "Erro configurando o almacenamento en Dropbox", +"Error configuring Dropbox storage" => "Produciuse un erro ao configurar o almacenamento en Dropbox", "Grant access" => "Permitir o acceso", "Fill out all required fields" => "Cubrir todos os campos obrigatorios", -"Please provide a valid Dropbox app key and secret." => "Dá o segredo e a clave correcta do aplicativo de Dropbox.", -"Error configuring Google Drive storage" => "Erro configurando o almacenamento en Google Drive", +"Please provide a valid Dropbox app key and secret." => "Dá o segredo e a chave correcta do aplicativo de Dropbox.", +"Error configuring Google Drive storage" => "Produciuse un erro ao configurar o almacenamento en Google Drive", "External Storage" => "Almacenamento externo", "Mount point" => "Punto de montaxe", "Backend" => "Infraestrutura", "Configuration" => "Configuración", "Options" => "Opcións", -"Applicable" => "Aplicable", +"Applicable" => "Aplicábel", "Add mount point" => "Engadir un punto de montaxe", "None set" => "Ningún definido", -"All Users" => "Tódolos usuarios", +"All Users" => "Todos os usuarios", "Groups" => "Grupos", "Users" => "Usuarios", "Delete" => "Eliminar", diff --git a/apps/files_sharing/l10n/gl.php b/apps/files_sharing/l10n/gl.php index fe06a5bc70..d03f1a5005 100644 --- a/apps/files_sharing/l10n/gl.php +++ b/apps/files_sharing/l10n/gl.php @@ -1,9 +1,9 @@ "Contrasinal", "Submit" => "Enviar", -"%s shared the folder %s with you" => "%s compartiu o cartafol %s contigo", -"%s shared the file %s with you" => "%s compartiu ficheiro %s contigo", -"Download" => "Baixar", -"No preview available for" => "Sen vista previa dispoñible para ", -"web services under your control" => "servizos web baixo o teu control" +"%s shared the folder %s with you" => "%s compartiu o cartafol %s con vostede", +"%s shared the file %s with you" => "%s compartiu o ficheiro %s con vostede", +"Download" => "Descargar", +"No preview available for" => "Sen vista previa dispoñíbel para", +"web services under your control" => "servizos web baixo o seu control" ); diff --git a/apps/files_versions/l10n/gl.php b/apps/files_versions/l10n/gl.php index 535a669d35..f10c1e1626 100644 --- a/apps/files_versions/l10n/gl.php +++ b/apps/files_versions/l10n/gl.php @@ -1,8 +1,8 @@ "Caducar todas as versións", -"History" => "Historia", +"Expire all versions" => "Caducan todas as versións", +"History" => "Historial", "Versions" => "Versións", -"This will delete all existing backup versions of your files" => "Isto eliminará todas as copias de seguranza que haxa dos teus ficheiros", +"This will delete all existing backup versions of your files" => "Isto eliminará todas as copias de seguranza que haxa dos seus ficheiros", "Files Versioning" => "Sistema de versión de ficheiros", "Enable" => "Activar" ); diff --git a/apps/user_webdavauth/l10n/et_EE.php b/apps/user_webdavauth/l10n/et_EE.php new file mode 100644 index 0000000000..9bd32954b0 --- /dev/null +++ b/apps/user_webdavauth/l10n/et_EE.php @@ -0,0 +1,3 @@ + "WebDAV URL: http://" +); diff --git a/l10n/ar/settings.po b/l10n/ar/settings.po index 1b9e02ca05..6310ebe7cf 100644 --- a/l10n/ar/settings.po +++ b/l10n/ar/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "طلبك غير مفهوم" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "لم يتم التأكد من الشخصية بنجاح" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "تم تغيير اللغة" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/bg_BG/settings.po b/l10n/bg_BG/settings.po index d19b42e13d..a4ec810db8 100644 --- a/l10n/bg_BG/settings.po +++ b/l10n/bg_BG/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -56,7 +56,7 @@ msgstr "Невалидна заявка" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Проблем с идентификацията" @@ -68,12 +68,16 @@ msgstr "" msgid "Language changed" msgstr "Езика е сменен" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po index ad3f1403f9..56ad9cd1fc 100644 --- a/l10n/ca/settings.po +++ b/l10n/ca/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" @@ -57,7 +57,7 @@ msgstr "Sol.licitud no vàlida" msgid "Unable to delete group" msgstr "No es pot eliminar el grup" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Error d'autenticació" @@ -69,12 +69,16 @@ msgstr "No es pot eliminar l'usuari" msgid "Language changed" msgstr "S'ha canviat l'idioma" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "No es pot afegir l'usuari al grup %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "No es pot eliminar l'usuari del grup %s" diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po index 0af24bb85e..de7d5e9907 100644 --- a/l10n/cs_CZ/settings.po +++ b/l10n/cs_CZ/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-11 00:01+0100\n" -"PO-Revision-Date: 2012-11-10 10:16+0000\n" -"Last-Translator: Tomáš Chvátal \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "Neplatný požadavek" msgid "Unable to delete group" msgstr "Nelze smazat skupinu" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Chyba ověření" @@ -71,12 +71,16 @@ msgstr "Nelze smazat uživatele" msgid "Language changed" msgstr "Jazyk byl změněn" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Nelze přidat uživatele do skupiny %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Nelze odstranit uživatele ze skupiny %s" diff --git a/l10n/da/settings.po b/l10n/da/settings.po index 20ce4a00d3..4545d6306f 100644 --- a/l10n/da/settings.po +++ b/l10n/da/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" @@ -62,7 +62,7 @@ msgstr "Ugyldig forespørgsel" msgid "Unable to delete group" msgstr "Gruppen kan ikke slettes" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Adgangsfejl" @@ -74,12 +74,16 @@ msgstr "Bruger kan ikke slettes" msgid "Language changed" msgstr "Sprog ændret" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Brugeren kan ikke tilføjes til gruppen %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Brugeren kan ikke fjernes fra gruppen %s" diff --git a/l10n/de/settings.po b/l10n/de/settings.po index 7de27efb51..5f9c142115 100644 --- a/l10n/de/settings.po +++ b/l10n/de/settings.po @@ -23,9 +23,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-14 00:02+0100\n" -"PO-Revision-Date: 2012-11-13 18:14+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -69,7 +69,7 @@ msgstr "Ungültige Anfrage" msgid "Unable to delete group" msgstr "Gruppe konnte nicht gelöscht werden" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Fehler bei der Anmeldung" @@ -81,12 +81,16 @@ msgstr "Benutzer konnte nicht gelöscht werden" msgid "Language changed" msgstr "Sprache geändert" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden" diff --git a/l10n/de_DE/settings.po b/l10n/de_DE/settings.po index a7299e2c33..6bade1820b 100644 --- a/l10n/de_DE/settings.po +++ b/l10n/de_DE/settings.po @@ -22,9 +22,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-20 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 13:06+0000\n" -"Last-Translator: traductor \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,7 +68,7 @@ msgstr "Ungültige Anfrage" msgid "Unable to delete group" msgstr "Die Gruppe konnte nicht gelöscht werden" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Fehler bei der Anmeldung" @@ -80,12 +80,16 @@ msgstr "Der Benutzer konnte nicht gelöscht werden" msgid "Language changed" msgstr "Sprache geändert" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden" diff --git a/l10n/el/settings.po b/l10n/el/settings.po index 32d3673a5e..e6ff75bf80 100644 --- a/l10n/el/settings.po +++ b/l10n/el/settings.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-17 00:01+0100\n" -"PO-Revision-Date: 2012-11-16 17:05+0000\n" -"Last-Translator: Efstathios Iosifidis \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -64,7 +64,7 @@ msgstr "Μη έγκυρο αίτημα" msgid "Unable to delete group" msgstr "Αδυναμία διαγραφής ομάδας" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Σφάλμα πιστοποίησης" @@ -76,12 +76,16 @@ msgstr "Αδυναμία διαγραφής χρήστη" msgid "Language changed" msgstr "Η γλώσσα άλλαξε" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Αδυναμία προσθήκη χρήστη στην ομάδα %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s" diff --git a/l10n/eo/settings.po b/l10n/eo/settings.po index f7337cda53..6f14e83e5f 100644 --- a/l10n/eo/settings.po +++ b/l10n/eo/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Nevalida peto" msgid "Unable to delete group" msgstr "Ne eblis forigi la grupon" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Aŭtentiga eraro" @@ -67,12 +67,16 @@ msgstr "Ne eblis forigi la uzanton" msgid "Language changed" msgstr "La lingvo estas ŝanĝita" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Ne eblis aldoni la uzanton al la grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Ne eblis forigi la uzantan el la grupo %s" diff --git a/l10n/es/settings.po b/l10n/es/settings.po index befb7ab0e0..38803f42a9 100644 --- a/l10n/es/settings.po +++ b/l10n/es/settings.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" @@ -64,7 +64,7 @@ msgstr "Solicitud no válida" msgid "Unable to delete group" msgstr "No se pudo eliminar el grupo" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Error de autenticación" @@ -76,12 +76,16 @@ msgstr "No se pudo eliminar el usuario" msgid "Language changed" msgstr "Idioma cambiado" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Imposible añadir el usuario al grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Imposible eliminar al usuario del grupo %s" diff --git a/l10n/es_AR/settings.po b/l10n/es_AR/settings.po index ed66ec1582..debe69a626 100644 --- a/l10n/es_AR/settings.po +++ b/l10n/es_AR/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-13 00:06+0100\n" -"PO-Revision-Date: 2012-11-12 10:40+0000\n" -"Last-Translator: cjtess \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,7 +54,7 @@ msgstr "Solicitud no válida" msgid "Unable to delete group" msgstr "No fue posible eliminar el grupo" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Error al autenticar" @@ -66,12 +66,16 @@ msgstr "No fue posible eliminar el usuario" msgid "Language changed" msgstr "Idioma cambiado" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "No fue posible añadir el usuario al grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "No es posible eliminar al usuario del grupo %s" diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index 2e801aef5d..77d1458218 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"PO-Revision-Date: 2012-11-29 21:20+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -105,7 +105,7 @@ msgstr "kustutatud {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -146,7 +146,7 @@ msgstr "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle ülesl #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Vigane kausta nimi. Nime \"Jagatud\" kasutamine on Owncloudi poolt broneeritud " #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/et_EE/settings.po b/l10n/et_EE/settings.po index c1940d3e01..3caa027b5a 100644 --- a/l10n/et_EE/settings.po +++ b/l10n/et_EE/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Vigane päring" msgid "Unable to delete group" msgstr "Keela grupi kustutamine" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Autentimise viga" @@ -67,12 +67,16 @@ msgstr "Keela kasutaja kustutamine" msgid "Language changed" msgstr "Keel on muudetud" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Kasutajat ei saa lisada gruppi %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Kasutajat ei saa eemaldada grupist %s" diff --git a/l10n/et_EE/user_webdavauth.po b/l10n/et_EE/user_webdavauth.po index 5550ee966b..06fb9adc8f 100644 --- a/l10n/et_EE/user_webdavauth.po +++ b/l10n/et_EE/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"PO-Revision-Date: 2012-11-29 21:18+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV URL: http://" diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po index 93adee8ec6..775a959f73 100644 --- a/l10n/eu/settings.po +++ b/l10n/eu/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 22:46+0000\n" -"Last-Translator: asieriko \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "Baliogabeko eskaria" msgid "Unable to delete group" msgstr "Ezin izan da taldea ezabatu" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Autentifikazio errorea" @@ -68,12 +68,16 @@ msgstr "Ezin izan da erabiltzailea ezabatu" msgid "Language changed" msgstr "Hizkuntza aldatuta" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Ezin izan da erabiltzailea %s taldera gehitu" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Ezin izan da erabiltzailea %s taldetik ezabatu" diff --git a/l10n/fa/settings.po b/l10n/fa/settings.po index 2cc9dc77a9..3311ac107d 100644 --- a/l10n/fa/settings.po +++ b/l10n/fa/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-15 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 08:32+0000\n" -"Last-Translator: basir \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "درخواست غیر قابل قبول" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "خطا در اعتبار سنجی" @@ -68,12 +68,16 @@ msgstr "" msgid "Language changed" msgstr "زبان تغییر کرد" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/fi_FI/settings.po b/l10n/fi_FI/settings.po index c7d07786a2..f2b6937d17 100644 --- a/l10n/fi_FI/settings.po +++ b/l10n/fi_FI/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-12 00:01+0100\n" -"PO-Revision-Date: 2012-11-11 21:26+0000\n" -"Last-Translator: Jiri Grönroos \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "Virheellinen pyyntö" msgid "Unable to delete group" msgstr "Ryhmän poisto epäonnistui" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Todennusvirhe" @@ -68,12 +68,16 @@ msgstr "Käyttäjän poisto epäonnistui" msgid "Language changed" msgstr "Kieli on vaihdettu" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Käyttäjän tai ryhmän %s lisääminen ei onnistu" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Käyttäjän poistaminen ryhmästä %s ei onnistu" diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po index 5dbc638bd6..32ef15c211 100644 --- a/l10n/fr/settings.po +++ b/l10n/fr/settings.po @@ -20,9 +20,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-12 00:01+0100\n" -"PO-Revision-Date: 2012-11-11 09:59+0000\n" -"Last-Translator: Robert Di Rosa <>\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,7 +66,7 @@ msgstr "Requête invalide" msgid "Unable to delete group" msgstr "Impossible de supprimer le groupe" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Erreur d'authentification" @@ -78,12 +78,16 @@ msgstr "Impossible de supprimer l'utilisateur" msgid "Language changed" msgstr "Langue changée" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Impossible d'ajouter l'utilisateur au groupe %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Impossible de supprimer l'utilisateur du groupe %s" diff --git a/l10n/gl/files_external.po b/l10n/gl/files_external.po index 81f1327365..2f60b9cf9e 100644 --- a/l10n/gl/files_external.po +++ b/l10n/gl/files_external.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Xosé M. Lamas , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 22:21+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"PO-Revision-Date: 2012-11-29 16:06+0000\n" +"Last-Translator: mbouzada \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "Concedeuse acceso" #: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 msgid "Error configuring Dropbox storage" -msgstr "Erro configurando o almacenamento en Dropbox" +msgstr "Produciuse un erro ao configurar o almacenamento en Dropbox" #: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 msgid "Grant access" @@ -36,11 +37,11 @@ msgstr "Cubrir todos os campos obrigatorios" #: js/dropbox.js:85 msgid "Please provide a valid Dropbox app key and secret." -msgstr "Dá o segredo e a clave correcta do aplicativo de Dropbox." +msgstr "Dá o segredo e a chave correcta do aplicativo de Dropbox." #: js/google.js:26 js/google.js:73 js/google.js:78 msgid "Error configuring Google Drive storage" -msgstr "Erro configurando o almacenamento en Google Drive" +msgstr "Produciuse un erro ao configurar o almacenamento en Google Drive" #: templates/settings.php:3 msgid "External Storage" @@ -64,7 +65,7 @@ msgstr "Opcións" #: templates/settings.php:11 msgid "Applicable" -msgstr "Aplicable" +msgstr "Aplicábel" #: templates/settings.php:23 msgid "Add mount point" @@ -76,7 +77,7 @@ msgstr "Ningún definido" #: templates/settings.php:63 msgid "All Users" -msgstr "Tódolos usuarios" +msgstr "Todos os usuarios" #: templates/settings.php:64 msgid "Groups" diff --git a/l10n/gl/files_sharing.po b/l10n/gl/files_sharing.po index a5fdbfdf44..f6b83fbd65 100644 --- a/l10n/gl/files_sharing.po +++ b/l10n/gl/files_sharing.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Xosé M. Lamas , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 18:42+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"PO-Revision-Date: 2012-11-29 16:08+0000\n" +"Last-Translator: mbouzada \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,24 +27,24 @@ msgstr "Contrasinal" msgid "Submit" msgstr "Enviar" -#: templates/public.php:9 +#: templates/public.php:17 #, php-format msgid "%s shared the folder %s with you" -msgstr "%s compartiu o cartafol %s contigo" +msgstr "%s compartiu o cartafol %s con vostede" -#: templates/public.php:11 +#: templates/public.php:19 #, php-format msgid "%s shared the file %s with you" -msgstr "%s compartiu ficheiro %s contigo" +msgstr "%s compartiu o ficheiro %s con vostede" -#: templates/public.php:14 templates/public.php:30 +#: templates/public.php:22 templates/public.php:38 msgid "Download" -msgstr "Baixar" +msgstr "Descargar" -#: templates/public.php:29 +#: templates/public.php:37 msgid "No preview available for" -msgstr "Sen vista previa dispoñible para " +msgstr "Sen vista previa dispoñíbel para" -#: templates/public.php:35 +#: templates/public.php:43 msgid "web services under your control" -msgstr "servizos web baixo o teu control" +msgstr "servizos web baixo o seu control" diff --git a/l10n/gl/files_versions.po b/l10n/gl/files_versions.po index 8f7853b871..aeb062c08d 100644 --- a/l10n/gl/files_versions.po +++ b/l10n/gl/files_versions.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Miguel Branco , 2012. # Xosé M. Lamas , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 22:23+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"PO-Revision-Date: 2012-11-29 16:08+0000\n" +"Last-Translator: mbouzada \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,11 +22,11 @@ msgstr "" #: js/settings-personal.js:31 templates/settings-personal.php:10 msgid "Expire all versions" -msgstr "Caducar todas as versións" +msgstr "Caducan todas as versións" #: js/versions.js:16 msgid "History" -msgstr "Historia" +msgstr "Historial" #: templates/settings-personal.php:4 msgid "Versions" @@ -33,7 +34,7 @@ msgstr "Versións" #: templates/settings-personal.php:7 msgid "This will delete all existing backup versions of your files" -msgstr "Isto eliminará todas as copias de seguranza que haxa dos teus ficheiros" +msgstr "Isto eliminará todas as copias de seguranza que haxa dos seus ficheiros" #: templates/settings.php:3 msgid "Files Versioning" diff --git a/l10n/gl/settings.po b/l10n/gl/settings.po index b69b82ed88..414d7edb14 100644 --- a/l10n/gl/settings.po +++ b/l10n/gl/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-20 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 14:50+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,7 +55,7 @@ msgstr "Petición incorrecta" msgid "Unable to delete group" msgstr "Non se pode eliminar o grupo." -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Erro na autenticación" @@ -67,12 +67,16 @@ msgstr "Non se pode eliminar o usuario" msgid "Language changed" msgstr "O idioma mudou" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Non se puido engadir o usuario ao grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Non se puido eliminar o usuario do grupo %s" diff --git a/l10n/he/settings.po b/l10n/he/settings.po index b8d619311d..98a2205692 100644 --- a/l10n/he/settings.po +++ b/l10n/he/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -56,7 +56,7 @@ msgstr "בקשה לא חוקית" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "שגיאת הזדהות" @@ -68,12 +68,16 @@ msgstr "" msgid "Language changed" msgstr "שפה השתנתה" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/hi/settings.po b/l10n/hi/settings.po index 3c1195bf64..54da734ea4 100644 --- a/l10n/hi/settings.po +++ b/l10n/hi/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/hr/settings.po b/l10n/hr/settings.po index a6c7bd652e..13434df980 100644 --- a/l10n/hr/settings.po +++ b/l10n/hr/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -56,7 +56,7 @@ msgstr "Neispravan zahtjev" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Greška kod autorizacije" @@ -68,12 +68,16 @@ msgstr "" msgid "Language changed" msgstr "Jezik promijenjen" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po index 946d1a3df6..187f0bc7cd 100644 --- a/l10n/hu_HU/settings.po +++ b/l10n/hu_HU/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Érvénytelen kérés" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Hitelesítési hiba" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "A nyelv megváltozott" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/ia/settings.po b/l10n/ia/settings.po index 2f569795ff..e1670a1604 100644 --- a/l10n/ia/settings.po +++ b/l10n/ia/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Requesta invalide" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "Linguage cambiate" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/id/settings.po b/l10n/id/settings.po index f660b3b522..be1beb4d29 100644 --- a/l10n/id/settings.po +++ b/l10n/id/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -57,7 +57,7 @@ msgstr "Permintaan tidak valid" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "autentikasi bermasalah" @@ -69,12 +69,16 @@ msgstr "" msgid "Language changed" msgstr "Bahasa telah diganti" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/it/settings.po b/l10n/it/settings.po index dfb8b787c9..2bee54a519 100644 --- a/l10n/it/settings.po +++ b/l10n/it/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -60,7 +60,7 @@ msgstr "Richiesta non valida" msgid "Unable to delete group" msgstr "Impossibile eliminare il gruppo" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Errore di autenticazione" @@ -72,12 +72,16 @@ msgstr "Impossibile eliminare l'utente" msgid "Language changed" msgstr "Lingua modificata" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Impossibile aggiungere l'utente al gruppo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Impossibile rimuovere l'utente dal gruppo %s" diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po index 8016055d78..4d152b3fa4 100644 --- a/l10n/ja_JP/settings.po +++ b/l10n/ja_JP/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-14 00:02+0100\n" -"PO-Revision-Date: 2012-11-13 00:41+0000\n" -"Last-Translator: Daisuke Deguchi \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "無効なリクエストです" msgid "Unable to delete group" msgstr "グループを削除できません" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "認証エラー" @@ -68,12 +68,16 @@ msgstr "ユーザを削除できません" msgid "Language changed" msgstr "言語が変更されました" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "ユーザをグループ %s に追加できません" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "ユーザをグループ %s から削除できません" diff --git a/l10n/ka_GE/settings.po b/l10n/ka_GE/settings.po index 65021fbbe2..10893b5fb9 100644 --- a/l10n/ka_GE/settings.po +++ b/l10n/ka_GE/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "არასწორი მოთხოვნა" msgid "Unable to delete group" msgstr "ჯგუფის წაშლა ვერ მოხერხდა" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "ავთენტიფიკაციის შეცდომა" @@ -66,12 +66,16 @@ msgstr "მომხმარებლის წაშლა ვერ მოხ msgid "Language changed" msgstr "ენა შეცვლილია" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s" diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po index 86194d3c9b..a35f2371bb 100644 --- a/l10n/ko/settings.po +++ b/l10n/ko/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 10:44+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "잘못된 요청" msgid "Unable to delete group" msgstr "그룹 삭제가 불가능합니다." -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "인증 오류" @@ -68,12 +68,16 @@ msgstr "사용자 삭제가 불가능합니다." msgid "Language changed" msgstr "언어가 변경되었습니다" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "%s 그룹에 사용자 추가가 불가능합니다." -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "%s 그룹으로부터 사용자 제거가 불가능합니다." diff --git a/l10n/ku_IQ/settings.po b/l10n/ku_IQ/settings.po index 597709683d..a735dc6ebc 100644 --- a/l10n/ku_IQ/settings.po +++ b/l10n/ku_IQ/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/lb/settings.po b/l10n/lb/settings.po index 724d56df69..8cecd15f02 100644 --- a/l10n/lb/settings.po +++ b/l10n/lb/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "Ongülteg Requête" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Authentifikatioun's Fehler" @@ -66,12 +66,16 @@ msgstr "" msgid "Language changed" msgstr "Sprooch huet geännert" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/lt_LT/settings.po b/l10n/lt_LT/settings.po index d0436e1b95..06d3e49173 100644 --- a/l10n/lt_LT/settings.po +++ b/l10n/lt_LT/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Klaidinga užklausa" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Autentikacijos klaida" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "Kalba pakeista" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/lv/settings.po b/l10n/lv/settings.po index 692b6afb35..42ea6eea5d 100644 --- a/l10n/lv/settings.po +++ b/l10n/lv/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-13 00:06+0100\n" -"PO-Revision-Date: 2012-11-12 12:16+0000\n" -"Last-Translator: elwins \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,7 +55,7 @@ msgstr "Nepareizs vaicājums" msgid "Unable to delete group" msgstr "Nevar izdzēst grupu" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Ielogošanās kļūme" @@ -67,12 +67,16 @@ msgstr "Nevar izdzēst lietotāju" msgid "Language changed" msgstr "Valoda tika nomainīta" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Nevar pievienot lietotāju grupai %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Nevar noņemt lietotāju no grupas %s" diff --git a/l10n/mk/settings.po b/l10n/mk/settings.po index 7e0d09ef3f..4382dd3cbd 100644 --- a/l10n/mk/settings.po +++ b/l10n/mk/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "неправилно барање" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "Јазикот е сменет" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/ms_MY/settings.po b/l10n/ms_MY/settings.po index 8421614c8b..5c0bb24bc6 100644 --- a/l10n/ms_MY/settings.po +++ b/l10n/ms_MY/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -57,7 +57,7 @@ msgstr "Permintaan tidak sah" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Ralat pengesahan" @@ -69,12 +69,16 @@ msgstr "" msgid "Language changed" msgstr "Bahasa diubah" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/nb_NO/settings.po b/l10n/nb_NO/settings.po index 80d86d0a37..711137497d 100644 --- a/l10n/nb_NO/settings.po +++ b/l10n/nb_NO/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -60,7 +60,7 @@ msgstr "Ugyldig forespørsel" msgid "Unable to delete group" msgstr "Kan ikke slette gruppe" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Autentikasjonsfeil" @@ -72,12 +72,16 @@ msgstr "Kan ikke slette bruker" msgid "Language changed" msgstr "Språk endret" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Kan ikke legge bruker til gruppen %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Kan ikke slette bruker fra gruppen %s" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index 70ca8fe6bd..0e5722a6fe 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" @@ -62,7 +62,7 @@ msgstr "Ongeldig verzoek" msgid "Unable to delete group" msgstr "Niet in staat om groep te verwijderen" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Authenticatie fout" @@ -74,12 +74,16 @@ msgstr "Niet in staat om gebruiker te verwijderen" msgid "Language changed" msgstr "Taal aangepast" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Niet in staat om gebruiker toe te voegen aan groep %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Niet in staat om gebruiker te verwijderen uit groep %s" diff --git a/l10n/nn_NO/settings.po b/l10n/nn_NO/settings.po index 4010f739b3..7bb941c457 100644 --- a/l10n/nn_NO/settings.po +++ b/l10n/nn_NO/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "Ugyldig førespurnad" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Feil i autentisering" @@ -67,12 +67,16 @@ msgstr "" msgid "Language changed" msgstr "Språk endra" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/oc/settings.po b/l10n/oc/settings.po index b73f2fa6b2..37e364fb5d 100644 --- a/l10n/oc/settings.po +++ b/l10n/oc/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "Demanda invalida" msgid "Unable to delete group" msgstr "Pas capable d'escafar un grop" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Error d'autentificacion" @@ -66,12 +66,16 @@ msgstr "Pas capable d'escafar un usancièr" msgid "Language changed" msgstr "Lengas cambiadas" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Pas capable d'apondre un usancièr al grop %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Pas capable de tira un usancièr del grop %s" diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po index 54727ff492..bcd1383d41 100644 --- a/l10n/pl/settings.po +++ b/l10n/pl/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" @@ -62,7 +62,7 @@ msgstr "Nieprawidłowe żądanie" msgid "Unable to delete group" msgstr "Nie można usunąć grupy" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Błąd uwierzytelniania" @@ -74,12 +74,16 @@ msgstr "Nie można usunąć użytkownika" msgid "Language changed" msgstr "Język zmieniony" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Nie można dodać użytkownika do grupy %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Nie można usunąć użytkownika z grupy %s" diff --git a/l10n/pl_PL/settings.po b/l10n/pl_PL/settings.po index 359961197e..1a2dfb5a22 100644 --- a/l10n/pl_PL/settings.po +++ b/l10n/pl_PL/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/pt_BR/settings.po b/l10n/pt_BR/settings.po index 3b1217eec9..fc029c1373 100644 --- a/l10n/pt_BR/settings.po +++ b/l10n/pt_BR/settings.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-12 00:01+0100\n" -"PO-Revision-Date: 2012-11-11 13:30+0000\n" -"Last-Translator: thoriumbr \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -61,7 +61,7 @@ msgstr "Pedido inválido" msgid "Unable to delete group" msgstr "Não foi possivel remover grupo" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "erro de autenticação" @@ -73,12 +73,16 @@ msgstr "Não foi possivel remover usuário" msgid "Language changed" msgstr "Mudou Idioma" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Não foi possivel adicionar usuário ao grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Não foi possivel remover usuário ao grupo %s" diff --git a/l10n/pt_PT/settings.po b/l10n/pt_PT/settings.po index d33ff4cdca..7715ed8c92 100644 --- a/l10n/pt_PT/settings.po +++ b/l10n/pt_PT/settings.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-14 00:02+0100\n" -"PO-Revision-Date: 2012-11-13 12:35+0000\n" -"Last-Translator: Helder Meneses \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,7 +57,7 @@ msgstr "Pedido inválido" msgid "Unable to delete group" msgstr "Impossível apagar grupo" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Erro de autenticação" @@ -69,12 +69,16 @@ msgstr "Impossível apagar utilizador" msgid "Language changed" msgstr "Idioma alterado" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Impossível acrescentar utilizador ao grupo %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Impossível apagar utilizador do grupo %s" diff --git a/l10n/ro/settings.po b/l10n/ro/settings.po index da6f8e9c86..7a1c740b15 100644 --- a/l10n/ro/settings.po +++ b/l10n/ro/settings.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" @@ -59,7 +59,7 @@ msgstr "Cerere eronată" msgid "Unable to delete group" msgstr "Nu s-a putut șterge grupul" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Eroare de autentificare" @@ -71,12 +71,16 @@ msgstr "Nu s-a putut șterge utilizatorul" msgid "Language changed" msgstr "Limba a fost schimbată" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Nu s-a putut adăuga utilizatorul la grupul %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Nu s-a putut elimina utilizatorul din grupul %s" diff --git a/l10n/ru/settings.po b/l10n/ru/settings.po index b1495cf236..a90c2ca9df 100644 --- a/l10n/ru/settings.po +++ b/l10n/ru/settings.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" @@ -63,7 +63,7 @@ msgstr "Неверный запрос" msgid "Unable to delete group" msgstr "Невозможно удалить группу" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Ошибка авторизации" @@ -75,12 +75,16 @@ msgstr "Невозможно удалить пользователя" msgid "Language changed" msgstr "Язык изменён" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Невозможно добавить пользователя в группу %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Невозможно удалить пользователя из группы %s" diff --git a/l10n/ru_RU/settings.po b/l10n/ru_RU/settings.po index bd6fa40ff9..753a9ef16d 100644 --- a/l10n/ru_RU/settings.po +++ b/l10n/ru_RU/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-13 00:06+0100\n" -"PO-Revision-Date: 2012-11-12 08:20+0000\n" -"Last-Translator: AnnaSch \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,7 +54,7 @@ msgstr "Неверный запрос" msgid "Unable to delete group" msgstr "Невозможно удалить группу" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Ошибка авторизации" @@ -66,12 +66,16 @@ msgstr "Невозможно удалить пользователя" msgid "Language changed" msgstr "Язык изменен" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Невозможно добавить пользователя в группу %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Невозможно удалить пользователя из группы %s" diff --git a/l10n/si_LK/settings.po b/l10n/si_LK/settings.po index 6e82bf5e75..c77635cd34 100644 --- a/l10n/si_LK/settings.po +++ b/l10n/si_LK/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-17 00:01+0100\n" -"PO-Revision-Date: 2012-11-16 06:57+0000\n" -"Last-Translator: Anushke Guneratne \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "අවලංගු අයදුම" msgid "Unable to delete group" msgstr "කණ්ඩායම මැකීමට නොහැක" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "සත්‍යාපන දෝෂයක්" @@ -68,12 +68,16 @@ msgstr "පරිශීලකයා මැකීමට නොහැක" msgid "Language changed" msgstr "භාෂාව ාවනස් කිරීම" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක" diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po index 632cd03296..6ece3cb550 100644 --- a/l10n/sk_SK/settings.po +++ b/l10n/sk_SK/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" @@ -57,7 +57,7 @@ msgstr "Neplatná požiadavka" msgid "Unable to delete group" msgstr "Nie je možné odstrániť skupinu" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Chyba pri autentifikácii" @@ -69,12 +69,16 @@ msgstr "Nie je možné odstrániť používateľa" msgid "Language changed" msgstr "Jazyk zmenený" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Nie je možné pridať užívateľa do skupiny %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Nie je možné odstrániť používateľa zo skupiny %s" diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po index 0e28109f99..80b325a36e 100644 --- a/l10n/sl/settings.po +++ b/l10n/sl/settings.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-20 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 19:08+0000\n" -"Last-Translator: Peter Peroša \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,7 +57,7 @@ msgstr "Neveljavna zahteva" msgid "Unable to delete group" msgstr "Ni mogoče izbrisati skupine" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Napaka overitve" @@ -69,12 +69,16 @@ msgstr "Ni mogoče izbrisati uporabnika" msgid "Language changed" msgstr "Jezik je bil spremenjen" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Uporabnika ni mogoče dodati k skupini %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Uporabnika ni mogoče odstraniti iz skupine %s" diff --git a/l10n/sq/settings.po b/l10n/sq/settings.po index 970d7a6556..fbf5a7e21d 100644 --- a/l10n/sq/settings.po +++ b/l10n/sq/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:10+0100\n" -"PO-Revision-Date: 2011-07-25 16:05+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/sr/settings.po b/l10n/sr/settings.po index 8967f9af5b..1e34b5be24 100644 --- a/l10n/sr/settings.po +++ b/l10n/sr/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "Неисправан захтев" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Грешка при аутентификацији" @@ -66,12 +66,16 @@ msgstr "" msgid "Language changed" msgstr "Језик је измењен" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/sr@latin/settings.po b/l10n/sr@latin/settings.po index 825ced5581..dc0210d88c 100644 --- a/l10n/sr@latin/settings.po +++ b/l10n/sr@latin/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "Neispravan zahtev" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Greška pri autentifikaciji" @@ -66,12 +66,16 @@ msgstr "" msgid "Language changed" msgstr "Jezik je izmenjen" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po index bceb8e2031..e37e4ecb36 100644 --- a/l10n/sv/settings.po +++ b/l10n/sv/settings.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-12 00:01+0100\n" -"PO-Revision-Date: 2012-11-11 13:03+0000\n" -"Last-Translator: Magnus Höglund \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -60,7 +60,7 @@ msgstr "Ogiltig begäran" msgid "Unable to delete group" msgstr "Kan inte radera grupp" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Autentiseringsfel" @@ -72,12 +72,16 @@ msgstr "Kan inte radera användare" msgid "Language changed" msgstr "Språk ändrades" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Kan inte lägga till användare i gruppen %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Kan inte radera användare från gruppen %s" diff --git a/l10n/ta_LK/settings.po b/l10n/ta_LK/settings.po index 56eeef9eef..d3e7e2c193 100644 --- a/l10n/ta_LK/settings.po +++ b/l10n/ta_LK/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-18 00:01+0100\n" -"PO-Revision-Date: 2012-11-17 05:07+0000\n" -"Last-Translator: suganthi \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,7 +54,7 @@ msgstr "செல்லுபடியற்ற வேண்டுகோள்" msgid "Unable to delete group" msgstr "குழுவை நீக்க முடியாது" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "அத்தாட்சிப்படுத்தலில் வழு" @@ -66,12 +66,16 @@ msgstr "பயனாளரை நீக்க முடியாது" msgid "Language changed" msgstr "மொழி மாற்றப்பட்டது" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "குழு %s இல் பயனாளரை சேர்க்க முடியாது" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 8a1c04a06d..c11e349653 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 707c8bc818..34cbc56b99 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 8b46389c37..671ac58fae 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 6b17fb8732..f45e2a0b62 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 9f034486ce..08b3c4b150 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 28fab4affd..389791e802 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 3b6a9cf92e..95ba212816 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index d19a566b06..7655ed9aab 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 13058208a1..5c227f23f1 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index dc48ca4e7a..258f694f4c 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" +"POT-Creation-Date: 2012-11-30 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/settings.po b/l10n/th_TH/settings.po index fa54101b61..9faf18df70 100644 --- a/l10n/th_TH/settings.po +++ b/l10n/th_TH/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 10:48+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,7 +56,7 @@ msgstr "คำร้องขอไม่ถูกต้อง" msgid "Unable to delete group" msgstr "ไม่สามารถลบกลุ่มได้" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์การเข้าใช้งาน" @@ -68,12 +68,16 @@ msgstr "ไม่สามารถลบผู้ใช้งานได้" msgid "Language changed" msgstr "เปลี่ยนภาษาเรียบร้อยแล้ว" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "ไม่สามารถเพิ่มผู้ใช้งานเข้าไปที่กลุ่ม %s ได้" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "ไม่สามารถลบผู้ใช้งานออกจากกลุ่ม %s ได้" diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po index 1bd31e2e4b..721196eed8 100644 --- a/l10n/tr/settings.po +++ b/l10n/tr/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" @@ -56,7 +56,7 @@ msgstr "Geçersiz istek" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Eşleşme hata" @@ -68,12 +68,16 @@ msgstr "" msgid "Language changed" msgstr "Dil değiştirildi" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po index fefdb36a52..ddc95e11c4 100644 --- a/l10n/uk/settings.po +++ b/l10n/uk/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:10+0100\n" -"PO-Revision-Date: 2012-11-26 15:30+0000\n" -"Last-Translator: skoptev \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,7 +55,7 @@ msgstr "Помилковий запит" msgid "Unable to delete group" msgstr "Не вдалося видалити групу" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Помилка автентифікації" @@ -67,12 +67,16 @@ msgstr "Не вдалося видалити користувача" msgid "Language changed" msgstr "Мова змінена" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Не вдалося додати користувача у групу %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Не вдалося видалити користувача із групи %s" diff --git a/l10n/vi/settings.po b/l10n/vi/settings.po index f5e88489e3..b9e4316242 100644 --- a/l10n/vi/settings.po +++ b/l10n/vi/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 05:31+0000\n" -"Last-Translator: Sơn Nguyễn \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "Yêu cầu không hợp lệ" msgid "Unable to delete group" msgstr "Không thể xóa nhóm" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "Lỗi xác thực" @@ -71,12 +71,16 @@ msgstr "Không thể xóa người dùng" msgid "Language changed" msgstr "Ngôn ngữ đã được thay đổi" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "Không thể thêm người dùng vào nhóm %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "Không thể xóa người dùng từ nhóm %s" diff --git a/l10n/zh_CN.GB2312/settings.po b/l10n/zh_CN.GB2312/settings.po index 36a88fb7e9..0f0d5333d5 100644 --- a/l10n/zh_CN.GB2312/settings.po +++ b/l10n/zh_CN.GB2312/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgstr "非法请求" msgid "Unable to delete group" msgstr "未能删除群组" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "认证错误" @@ -67,12 +67,16 @@ msgstr "未能删除用户" msgid "Language changed" msgstr "语言改变了" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "未能添加用户到群组 %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "未能将用户从群组 %s 移除" diff --git a/l10n/zh_CN/settings.po b/l10n/zh_CN/settings.po index 6d16aa9571..b79b28d744 100644 --- a/l10n/zh_CN/settings.po +++ b/l10n/zh_CN/settings.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-18 00:01+0100\n" -"PO-Revision-Date: 2012-11-17 12:04+0000\n" -"Last-Translator: hanfeng \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,7 +58,7 @@ msgstr "非法请求" msgid "Unable to delete group" msgstr "无法删除组" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "认证错误" @@ -70,12 +70,16 @@ msgstr "无法删除用户" msgid "Language changed" msgstr "语言已修改" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "无法把用户添加到组 %s" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "无法从组%s中移除用户" diff --git a/l10n/zh_HK/settings.po b/l10n/zh_HK/settings.po index 765c6d11f0..fd4f4f1086 100644 --- a/l10n/zh_HK/settings.po +++ b/l10n/zh_HK/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-19 00:01+0100\n" -"PO-Revision-Date: 2011-07-25 16:05+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" diff --git a/l10n/zh_TW/settings.po b/l10n/zh_TW/settings.po index 16774ce405..1f0a0177f5 100644 --- a/l10n/zh_TW/settings.po +++ b/l10n/zh_TW/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 14:02+0000\n" -"Last-Translator: dw4dev \n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "無效請求" msgid "Unable to delete group" msgstr "群組刪除錯誤" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "認證錯誤" @@ -71,12 +71,16 @@ msgstr "使用者刪除錯誤" msgid "Language changed" msgstr "語言已變更" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "使用者加入群組%s錯誤" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "使用者移出群組%s錯誤" diff --git a/l10n/zu_ZA/settings.po b/l10n/zu_ZA/settings.po index ece1c2ef7e..51a07c2359 100644 --- a/l10n/zu_ZA/settings.po +++ b/l10n/zu_ZA/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 23:01+0000\n" +"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"PO-Revision-Date: 2012-11-29 23:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" @@ -53,7 +53,7 @@ msgstr "" msgid "Unable to delete group" msgstr "" -#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:12 +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" msgstr "" @@ -65,12 +65,16 @@ msgstr "" msgid "Language changed" msgstr "" -#: ajax/togglegroups.php:22 +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" msgstr "" From 6060d063a96a08c0075db0117c6074c9188c2b57 Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Thu, 29 Nov 2012 16:52:41 -0700 Subject: [PATCH 390/481] Cleanup --- apps/files/js/keyboardshortcuts.js | 77 ++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index b00fd64968..41578e7f4a 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -1,3 +1,9 @@ +/** +* Copyright (c) 2012 Erik Sargent +* This file is licensed under the Affero General Public License version 3 or +* later. +*/ + /***************************** * Keyboard shortcuts for Files app * ctrl/cmd+n: new folder @@ -10,6 +16,7 @@ *****************************/ var Files = Files || {}; +(function(Files){ var keys = []; var keyCodes = { shift: 16, @@ -24,7 +31,6 @@ var keyCodes = { downArrow: 40, upArrow: 38, enter: 13, - backspace: 8, del: 46 }; @@ -43,25 +49,22 @@ function newFile(){ $("#new").addClass("active"); $(".popup.popupTop").toggle(true); $('#new li[data-type="file"]').trigger('click'); - console.log("new file"); removeA(keys, keyCodes.n); } function newFolder(){ $("#new").addClass("active"); $(".popup.popupTop").toggle(true); $('#new li[data-type="folder"]').trigger('click'); - console.log("new folder"); removeA(keys, keyCodes.n); } function esc(){ $("#controls").trigger('click'); - console.log("close"); } function down(){ var select = -1; $("#fileList tr").each(function(index){ if($(this).hasClass("mouseOver")){ - select = index+1; + select = index + 1; $(this).removeClass("mouseOver"); } }); @@ -81,7 +84,7 @@ function up(){ var select = -1; $("#fileList tr").each(function(index){ if($(this).hasClass("mouseOver")){ - select = index-1; + select = index - 1; $(this).removeClass("mouseOver"); } }); @@ -127,20 +130,28 @@ Files.bindKeyboardShortcuts = function (document, $) { var preventDefault = false; if($.inArray(event.keyCode, keys) === -1) keys.push(event.keyCode); - console.log(event.keyCode); - if($.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1)){ //new file/folder prevent browser from responding - preventDefault = true; + if( + $.inArray(keyCodes.n, keys) !== -1 + && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 + || $.inArray(keyCodes.cmdOpera, keys) !== -1 + || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.ctrl, keys) !== -1) + ){ + preventDefault = true;//new file/folder prevent browser from responding } - if($.inArray(keyCodes.backspace, keys) !== -1 && !$("#new").hasClass("active")) { //prevent default when deleting a file/folder - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - preventDefault = true; - } - }); - } - if(!$("#new").hasClass("active") && $.inArray(keyCodes.r, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1) && $.inArray(keyCodes.shift, keys) !== -1){//prevent default when renaming file/folder - $("#fileList tr").each(function(index){ + if( + !$("#new").hasClass("active") + && $.inArray(keyCodes.r, keys) !== -1 + && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 + || $.inArray(keyCodes.cmdOpera, keys) !== -1 + || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.ctrl, keys) !== -1) + && $.inArray(keyCodes.shift, keys) !== -1 + ){ + $("#fileList tr").each(function(index){//prevent default when renaming file/folder if($(this).hasClass("mouseOver")){ preventDefault = true; } @@ -155,11 +166,15 @@ Files.bindKeyboardShortcuts = function (document, $) { $(document).keyup(function(event){ // do your event.keyCode checks in here - - console.log(JSON.stringify(keys)); - - if($.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1)){ - if($.inArray(keyCodes.shift, keys) !== -1){ //16=shift, New File + if( + $.inArray(keyCodes.n, keys) !== -1 + && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 + || $.inArray(keyCodes.cmdOpera, keys) !== -1 + || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.ctrl, keys) !== -1)){ + if($.inArray(keyCodes.shift, keys) !== -1 + ){ //16=shift, New File newFile(); } else{ //New Folder @@ -179,13 +194,23 @@ Files.bindKeyboardShortcuts = function (document, $) { else if(!$("#new").hasClass("active") && $.inArray(keyCodes.enter, keys) !== -1){//open file enter(); } - else if(!$("#new").hasClass("active") && ($.inArray(keyCodes.backspace, keys) !== -1 || $.inArray(keyCodes.del, keys) !== -1)) {//delete file + else if(!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) {//delete file del(); } - else if(!$("#new").hasClass("active") && $.inArray(keyCodes.r, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1) && $.inArray(keyCodes.shift, keys) !== -1){//rename file + else if( + !$("#new").hasClass("active") + && $.inArray(keyCodes.r, keys) !== -1 + && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 + || $.inArray(keyCodes.cmdOpera, keys) !== -1 + || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 + || $.inArray(keyCodes.ctrl, keys) !== -1) + && $.inArray(keyCodes.shift, keys) !== -1 + ){//rename file rename(); } removeA(keys, event.keyCode); }); -}; \ No newline at end of file +}; +})(Files); \ No newline at end of file From 48d6f33135808f88af366573e88cbed9009503f9 Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Thu, 29 Nov 2012 19:20:51 -0700 Subject: [PATCH 391/481] Revert "initial setup" This reverts commit e1478117b14c0057adaf3dbca5e0119e365c7c59. --- .htaccess | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.htaccess b/.htaccess index 8883936e0c..048a56d638 100755 --- a/.htaccess +++ b/.htaccess @@ -6,11 +6,11 @@ RequestHeader set XAuthorization %{XAUTHORIZATION}e env=XAUTHORIZATION -ErrorDocument 403 /owncloud/core/templates/403.php -ErrorDocument 404 /owncloud/core/templates/404.php +ErrorDocument 403 /core/templates/403.php +ErrorDocument 404 /core/templates/404.php -php_value upload_max_filesize 512M -php_value post_max_size 512M +php_value upload_max_filesize 513M +php_value post_max_size 513M php_value memory_limit 512M SetEnv htaccessWorking true @@ -20,8 +20,11 @@ php_value memory_limit 512M RewriteEngine on RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteRule ^.well-known/host-meta /public.php?service=host-meta [QSA,L] +RewriteRule ^.well-known/host-meta.json /public.php?service=host-meta-json [QSA,L] RewriteRule ^.well-known/carddav /remote.php/carddav/ [R] -RewriteRule ^.well-known/caldav /remote.php/caldav/ [R] +RewriteRule ^.well-known/caldav /remote.php/caldav/ [R] +RewriteRule ^apps/calendar/caldav.php remote.php/caldav/ [QSA,L] +RewriteRule ^apps/contacts/carddav.php remote.php/carddav/ [QSA,L] RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L] RewriteRule ^remote/(.*) remote.php [QSA,L] From 8ce3aca3315f9fc9db8e6210fa4e894c5d1d3577 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 30 Nov 2012 12:47:40 +0100 Subject: [PATCH 392/481] Move loading of all the apps to setting the active navigation entry. We can't do the loading before matching the route, because some routes need to do the loading after matching of the route. For example the navigation detection of the app settings page. --- lib/app.php | 2 ++ lib/base.php | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/app.php b/lib/app.php index 79c1d83314..5d4fbbd9c2 100755 --- a/lib/app.php +++ b/lib/app.php @@ -253,6 +253,8 @@ 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; return true; } diff --git a/lib/base.php b/lib/base.php index dff73ef1ae..f600800b61 100644 --- a/lib/base.php +++ b/lib/base.php @@ -512,7 +512,6 @@ class OC{ return; } try { - OC_App::loadApps(); OC::getRouter()->match(OC_Request::getPathInfo()); return; } catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) { From d527bb6c54b61cc8e9c2b4de4039f1dbdfd771d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Fri, 30 Nov 2012 13:04:15 +0100 Subject: [PATCH 393/481] fix regression in file versioning for shared files --- apps/files_versions/lib/versions.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index dc83ab12af..78f4181ebd 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -58,8 +58,8 @@ class Storage { public function store($filename) { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $files_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/files'); - $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + $files_view = new \OC_FilesystemView('/'.$uid .'/files'); + $users_view = new \OC_FilesystemView('/'.$uid); //check if source file already exist as version to avoid recursions. // todo does this check work? @@ -94,7 +94,7 @@ class Storage { // check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval) if ($uid == \OCP\User::getUser()) { - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.uid.'/files_versions'); $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); $matches=glob($versionsName.'.v*'); @@ -128,7 +128,7 @@ class Storage { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + $users_view = new \OC_FilesystemView('/'.$uid); // rollback if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) { @@ -151,7 +151,7 @@ class Storage { public static function isversioned($filename) { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); @@ -178,7 +178,7 @@ class Storage { public static function getVersions( $filename, $count = 0 ) { if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); $versionsName = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); $versions = array(); From df21ebeaf73bed10e972af6ef09f2bfb0df68e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 29 Nov 2012 18:41:32 +0100 Subject: [PATCH 394/481] fix checkstyle for files_encryption app, add whitespace for readability --- apps/files_encryption/appinfo/app.php | 6 ++- apps/files_encryption/lib/crypt.php | 31 +++++++------- apps/files_encryption/lib/cryptstream.php | 45 +++++++++++--------- apps/files_encryption/lib/proxy.php | 36 ++++++++-------- apps/files_encryption/settings.php | 6 ++- apps/files_encryption/templates/settings.php | 8 ++-- apps/files_encryption/tests/proxy.php | 2 +- apps/files_encryption/tests/stream.php | 6 +-- 8 files changed, 76 insertions(+), 64 deletions(-) diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php index 3f76e910a5..2a30d0beb6 100644 --- a/apps/files_encryption/appinfo/app.php +++ b/apps/files_encryption/appinfo/app.php @@ -10,10 +10,12 @@ OCP\Util::connectHook('OC_User', 'post_login', 'OC_Crypt', 'loginListener'); stream_wrapper_register('crypt', 'OC_CryptStream'); -if(!isset($_SESSION['enckey']) and OCP\User::isLoggedIn()) {//force the user to re-loggin if the encryption key isn't unlocked (happens when a user is logged in before the encryption app is enabled) +// force the user to re-loggin if the encryption key isn't unlocked +// (happens when a user is logged in before the encryption app is enabled) +if ( ! isset($_SESSION['enckey']) and OCP\User::isLoggedIn()) { OCP\User::logout(); header("Location: ".OC::$WEBROOT.'/'); exit(); } -OCP\App::registerAdmin('files_encryption', 'settings'); +OCP\App::registerAdmin('files_encryption', 'settings'); \ No newline at end of file diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index 5ff3f57838..666fedb4e1 100644 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -27,7 +27,8 @@ // - Setting if crypto should be on by default // - Add a setting "Don´t encrypt files larger than xx because of performance reasons" // - Transparent decrypt/encrypt in filesystem.php. Autodetect if a file is encrypted (.encrypted extension) -// - Don't use a password directly as encryption key. but a key which is stored on the server and encrypted with the user password. -> password change faster +// - Don't use a password directly as encryption key, but a key which is stored on the server and encrypted with the +// user password. -> password change faster // - IMPORTANT! Check if the block lenght of the encrypted data stays the same @@ -45,12 +46,12 @@ class OC_Crypt { public static function init($login, $password) { $view=new OC_FilesystemView('/'); - if(!$view->file_exists('/'.$login)) { + if ( ! $view->file_exists('/'.$login)) { $view->mkdir('/'.$login); } OC_FileProxy::$enabled=false; - if(!$view->file_exists('/'.$login.'/encryption.key')) {// does key exist? + if ( ! $view->file_exists('/'.$login.'/encryption.key')) {// does key exist? OC_Crypt::createkey($login, $password); } $key=$view->file_get_contents('/'.$login.'/encryption.key'); @@ -67,13 +68,13 @@ class OC_Crypt { * if the key is left out, the default handeler will be used */ public static function getBlowfish($key='') { - if($key) { + if ($key) { return new Crypt_Blowfish($key); - }else{ - if(!isset($_SESSION['enckey'])) { + } else { + if ( ! isset($_SESSION['enckey'])) { return false; } - if(!self::$bf) { + if ( ! self::$bf) { self::$bf=new Crypt_Blowfish($_SESSION['enckey']); } return self::$bf; @@ -96,7 +97,7 @@ class OC_Crypt { } public static function changekeypasscode($oldPassword, $newPassword) { - if(OCP\User::isLoggedIn()) { + if (OCP\User::isLoggedIn()) { $username=OCP\USER::getUser(); $view=new OC_FilesystemView('/'.$username); @@ -151,7 +152,7 @@ class OC_Crypt { */ public static function encryptFile( $source, $target, $key='') { $handleread = fopen($source, "rb"); - if($handleread!=false) { + if ($handleread!=false) { $handlewrite = fopen($target, "wb"); while (!feof($handleread)) { $content = fread($handleread, 8192); @@ -174,12 +175,12 @@ class OC_Crypt { */ public static function decryptFile( $source, $target, $key='') { $handleread = fopen($source, "rb"); - if($handleread!=false) { + if ($handleread!=false) { $handlewrite = fopen($target, "wb"); while (!feof($handleread)) { $content = fread($handleread, 8192); $enccontent=OC_CRYPT::decrypt( $content, $key); - if(feof($handleread)) { + if (feof($handleread)) { $enccontent=rtrim($enccontent, "\0"); } fwrite($handlewrite, $enccontent); @@ -194,7 +195,7 @@ class OC_Crypt { */ public static function blockEncrypt($data, $key='') { $result=''; - while(strlen($data)) { + while (strlen($data)) { $result.=self::encrypt(substr($data, 0, 8192), $key); $data=substr($data, 8192); } @@ -206,13 +207,13 @@ class OC_Crypt { */ public static function blockDecrypt($data, $key='', $maxLength=0) { $result=''; - while(strlen($data)) { + while (strlen($data)) { $result.=self::decrypt(substr($data, 0, 8192), $key); $data=substr($data, 8192); } - if($maxLength>0) { + if ($maxLength>0) { return substr($result, 0, $maxLength); - }else{ + } else { return rtrim($result, "\0"); } } diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php index 8b05560050..d516c0c21b 100644 --- a/apps/files_encryption/lib/cryptstream.php +++ b/apps/files_encryption/lib/cryptstream.php @@ -23,8 +23,9 @@ /** * transparently encrypted filestream * - * you can use it as wrapper around an existing stream by setting OC_CryptStream::$sourceStreams['foo']=array('path'=>$path, 'stream'=>$stream) - * and then fopen('crypt://streams/foo'); + * you can use it as wrapper around an existing stream by setting + * OC_CryptStream::$sourceStreams['foo']=array('path'=>$path, 'stream'=>$stream) + * and then fopen('crypt://streams/foo'); */ class OC_CryptStream{ @@ -37,29 +38,29 @@ class OC_CryptStream{ private static $rootView; public function stream_open($path, $mode, $options, &$opened_path) { - if(!self::$rootView) { + if ( ! self::$rootView) { self::$rootView=new OC_FilesystemView(''); } $path=str_replace('crypt://', '', $path); - if(dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])) { + if (dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])) { $this->source=self::$sourceStreams[basename($path)]['stream']; $this->path=self::$sourceStreams[basename($path)]['path']; $this->size=self::$sourceStreams[basename($path)]['size']; - }else{ + } else { $this->path=$path; - if($mode=='w' or $mode=='w+' or $mode=='wb' or $mode=='wb+') { + if ($mode=='w' or $mode=='w+' or $mode=='wb' or $mode=='wb+') { $this->size=0; - }else{ + } else { $this->size=self::$rootView->filesize($path, $mode); } OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file $this->source=self::$rootView->fopen($path, $mode); OC_FileProxy::$enabled=true; - if(!is_resource($this->source)) { + if ( ! is_resource($this->source)) { OCP\Util::writeLog('files_encryption', 'failed to open '.$path, OCP\Util::ERROR); } } - if(is_resource($this->source)) { + if (is_resource($this->source)) { $this->meta=stream_get_meta_data($this->source); } return is_resource($this->source); @@ -78,19 +79,21 @@ class OC_CryptStream{ //$count will always be 8192 https://bugs.php.net/bug.php?id=21641 //This makes this function a lot simpler but will breake everything the moment it's fixed $this->writeCache=''; - if($count!=8192) { - OCP\Util::writeLog('files_encryption', 'php bug 21641 no longer holds, decryption will not work', OCP\Util::FATAL); + if ($count!=8192) { + OCP\Util::writeLog('files_encryption', + 'php bug 21641 no longer holds, decryption will not work', + OCP\Util::FATAL); die(); } $pos=ftell($this->source); $data=fread($this->source, 8192); - if(strlen($data)) { + if (strlen($data)) { $result=OC_Crypt::decrypt($data); - }else{ + } else { $result=''; } $length=$this->size-$pos; - if($length<8192) { + if ($length<8192) { $result=substr($result, 0, $length); } return $result; @@ -99,11 +102,11 @@ class OC_CryptStream{ public function stream_write($data) { $length=strlen($data); $currentPos=ftell($this->source); - if($this->writeCache) { + if ($this->writeCache) { $data=$this->writeCache.$data; $this->writeCache=''; } - if($currentPos%8192!=0) { + if ($currentPos%8192!=0) { //make sure we always start on a block start fseek($this->source, -($currentPos%8192), SEEK_CUR); $encryptedBlock=fread($this->source, 8192); @@ -113,11 +116,11 @@ class OC_CryptStream{ fseek($this->source, -($currentPos%8192), SEEK_CUR); } $currentPos=ftell($this->source); - while($remainingLength=strlen($data)>0) { - if($remainingLength<8192) { + while ($remainingLength=strlen($data)>0) { + if ($remainingLength<8192) { $this->writeCache=$data; $data=''; - }else{ + } else { $encrypted=OC_Crypt::encrypt(substr($data, 0, 8192)); fwrite($this->source, $encrypted); $data=substr($data, 8192); @@ -157,7 +160,7 @@ class OC_CryptStream{ } private function flush() { - if($this->writeCache) { + if ($this->writeCache) { $encrypted=OC_Crypt::encrypt($this->writeCache); fwrite($this->source, $encrypted); $this->writeCache=''; @@ -166,7 +169,7 @@ class OC_CryptStream{ public function stream_close() { $this->flush(); - if($this->meta['mode']!='r' and $this->meta['mode']!='rb') { + if ($this->meta['mode']!='r' and $this->meta['mode']!='rb') { OC_FileCache::put($this->path, array('encrypted'=>true, 'size'=>$this->size), ''); } return fclose($this->source); diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 4a390013d2..e8dbd95c29 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -35,20 +35,22 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ * @return bool */ private static function shouldEncrypt($path) { - if(is_null(self::$enableEncryption)) { + if (is_null(self::$enableEncryption)) { self::$enableEncryption=(OCP\Config::getAppValue('files_encryption', 'enable_encryption', 'true')=='true'); } - if(!self::$enableEncryption) { + if ( ! self::$enableEncryption) { return false; } - if(is_null(self::$blackList)) { - self::$blackList=explode(',', OCP\Config::getAppValue('files_encryption', 'type_blacklist', 'jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg')); + if (is_null(self::$blackList)) { + self::$blackList=explode(',', OCP\Config::getAppValue('files_encryption', + 'type_blacklist', + 'jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg')); } - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { return true; } $extension=substr($path, strrpos($path, '.')+1); - if(array_search($extension, self::$blackList)===false) { + if (array_search($extension, self::$blackList)===false) { return true; } } @@ -64,8 +66,8 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } public function preFile_put_contents($path,&$data) { - if(self::shouldEncrypt($path)) { - if (!is_resource($data)) {//stream put contents should have been converter to fopen + if (self::shouldEncrypt($path)) { + if ( ! is_resource($data)) {//stream put contents should have been converter to fopen $size=strlen($data); $data=OC_Crypt::blockEncrypt($data); OC_FileCache::put($path, array('encrypted'=>true,'size'=>$size), ''); @@ -74,7 +76,7 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } public function postFile_get_contents($path, $data) { - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path, ''); $data=OC_Crypt::blockDecrypt($data, '', $cached['size']); } @@ -82,15 +84,15 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } public function postFopen($path,&$result) { - if(!$result) { + if ( ! $result) { return $result; } $meta=stream_get_meta_data($result); - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { fclose($result); $result=fopen('crypt://'.$path, $meta['mode']); - }elseif(self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb') { - if(OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0) { + } elseif (self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb') { + if (OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0) { //first encrypt the target file so we don't end up with a half encrypted file OCP\Util::writeLog('files_encryption', 'Decrypting '.$path.' before writing', OCP\Util::DEBUG); $tmp=fopen('php://temp'); @@ -105,14 +107,14 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } public function postGetMimeType($path, $mime) { - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { $mime=OCP\Files::getMimeType('crypt://'.$path, 'w'); } return $mime; } public function postStat($path, $data) { - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path, ''); $data['size']=$cached['size']; } @@ -120,10 +122,10 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } public function postFileSize($path, $size) { - if(self::isEncrypted($path)) { + if (self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path, ''); return $cached['size']; - }else{ + } else { return $size; } } diff --git a/apps/files_encryption/settings.php b/apps/files_encryption/settings.php index ae28b088cd..6b2b03211e 100644 --- a/apps/files_encryption/settings.php +++ b/apps/files_encryption/settings.php @@ -7,7 +7,9 @@ */ $tmpl = new OCP\Template( 'files_encryption', 'settings'); -$blackList=explode(',', OCP\Config::getAppValue('files_encryption', 'type_blacklist', 'jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg')); +$blackList=explode(',', OCP\Config::getAppValue('files_encryption', + 'type_blacklist', + 'jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg')); $enabled=(OCP\Config::getAppValue('files_encryption', 'enable_encryption', 'true')=='true'); $tmpl->assign('blacklist', $blackList); $tmpl->assign('encryption_enabled', $enabled); @@ -15,4 +17,4 @@ $tmpl->assign('encryption_enabled', $enabled); OCP\Util::addscript('files_encryption', 'settings'); OCP\Util::addscript('core', 'multiselect'); -return $tmpl->fetchPage(); +return $tmpl->fetchPage(); \ No newline at end of file diff --git a/apps/files_encryption/templates/settings.php b/apps/files_encryption/templates/settings.php index 55e8cf1542..75df784e39 100644 --- a/apps/files_encryption/templates/settings.php +++ b/apps/files_encryption/templates/settings.php @@ -1,12 +1,14 @@
    t('Encryption'); ?> - t("Exclude the following file types from encryption"); ?> + t('Exclude the following file types from encryption'); ?> - > + checked="checked" + id='enable_encryption' > +
    diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php index 1c800bbc5f..5aa617e747 100644 --- a/apps/files_encryption/tests/proxy.php +++ b/apps/files_encryption/tests/proxy.php @@ -42,7 +42,7 @@ class Test_CryptProxy extends UnitTestCase { public function tearDown() { OCP\Config::setAppValue('files_encryption', 'enable_encryption', $this->oldConfig); - if(!is_null($this->oldKey)) { + if ( ! is_null($this->oldKey)) { $_SESSION['enckey']=$this->oldKey; } } diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php index 67b5e98ae6..e4af17d47b 100644 --- a/apps/files_encryption/tests/stream.php +++ b/apps/files_encryption/tests/stream.php @@ -41,13 +41,13 @@ class Test_CryptStream extends UnitTestCase { * @return resource */ function getStream($id, $mode, $size) { - if($id==='') { + if ($id==='') { $id=uniqid(); } - if(!isset($this->tmpFiles[$id])) { + if ( ! isset($this->tmpFiles[$id])) { $file=OCP\Files::tmpFile(); $this->tmpFiles[$id]=$file; - }else{ + } else { $file=$this->tmpFiles[$id]; } $stream=fopen($file, $mode); From 92df70b6e5c4cba373cf0b24af02c328881cdd2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 30 Nov 2012 16:27:11 +0100 Subject: [PATCH 395/481] fix checkstyle for files_external app, add whitespace for readability --- apps/files_external/ajax/addMountPoint.php | 7 +- .../ajax/addRootCertificate.php | 10 +- apps/files_external/ajax/dropbox.php | 15 +- apps/files_external/ajax/google.php | 27 ++- apps/files_external/js/settings.js | 2 +- apps/files_external/lib/amazons3.php | 41 +++-- apps/files_external/lib/config.php | 103 +++++++++-- apps/files_external/lib/dropbox.php | 35 ++-- apps/files_external/lib/ftp.php | 22 +-- apps/files_external/lib/google.php | 161 ++++++++++++------ apps/files_external/lib/smb.php | 30 ++-- apps/files_external/lib/streamwrapper.php | 18 +- apps/files_external/lib/swift.php | 150 ++++++++-------- apps/files_external/lib/webdav.php | 81 ++++----- apps/files_external/templates/settings.php | 108 ++++++++---- apps/files_external/tests/amazons3.php | 5 +- apps/files_external/tests/dropbox.php | 2 +- apps/files_external/tests/ftp.php | 8 +- apps/files_external/tests/google.php | 2 +- apps/files_external/tests/smb.php | 2 +- apps/files_external/tests/swift.php | 2 +- apps/files_external/tests/webdav.php | 2 +- 22 files changed, 527 insertions(+), 306 deletions(-) diff --git a/apps/files_external/ajax/addMountPoint.php b/apps/files_external/ajax/addMountPoint.php index e08f805942..4cd8871b31 100644 --- a/apps/files_external/ajax/addMountPoint.php +++ b/apps/files_external/ajax/addMountPoint.php @@ -10,4 +10,9 @@ if ($_POST['isPersonal'] == 'true') { OCP\JSON::checkAdminUser(); $isPersonal = false; } -OC_Mount_Config::addMountPoint($_POST['mountPoint'], $_POST['class'], $_POST['classOptions'], $_POST['mountType'], $_POST['applicable'], $isPersonal); +OC_Mount_Config::addMountPoint($_POST['mountPoint'], + $_POST['class'], + $_POST['classOptions'], + $_POST['mountType'], + $_POST['applicable'], + $isPersonal); \ No newline at end of file diff --git a/apps/files_external/ajax/addRootCertificate.php b/apps/files_external/ajax/addRootCertificate.php index 72eb30009d..be60b415e1 100644 --- a/apps/files_external/ajax/addRootCertificate.php +++ b/apps/files_external/ajax/addRootCertificate.php @@ -2,7 +2,7 @@ OCP\JSON::checkAppEnabled('files_external'); -if ( !($filename = $_FILES['rootcert_import']['name']) ) { +if ( ! ($filename = $_FILES['rootcert_import']['name']) ) { header("Location: settings/personal.php"); exit; } @@ -13,7 +13,7 @@ fclose($fh); $filename = $_FILES['rootcert_import']['name']; $view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_external/uploads'); -if (!$view->file_exists('')) $view->mkdir(''); +if ( ! $view->file_exists('')) $view->mkdir(''); $isValid = openssl_pkey_get_public($data); @@ -29,8 +29,10 @@ if ( $isValid ) { $view->file_put_contents($filename, $data); OC_Mount_Config::createCertificateBundle(); } else { - OCP\Util::writeLog("files_external", "Couldn't import SSL root certificate ($filename), allowed formats: PEM and DER", OCP\Util::WARN); + OCP\Util::writeLog('files_external', + 'Couldn\'t import SSL root certificate ('.$filename.'), allowed formats: PEM and DER', + OCP\Util::WARN); } -header("Location: settings/personal.php"); +header('Location: settings/personal.php'); exit; diff --git a/apps/files_external/ajax/dropbox.php b/apps/files_external/ajax/dropbox.php index f5923940dc..58c41d6906 100644 --- a/apps/files_external/ajax/dropbox.php +++ b/apps/files_external/ajax/dropbox.php @@ -16,9 +16,13 @@ if (isset($_POST['app_key']) && isset($_POST['app_secret'])) { $callback = null; } $token = $oauth->getRequestToken(); - OCP\JSON::success(array('data' => array('url' => $oauth->getAuthorizeUrl($callback), 'request_token' => $token['token'], 'request_token_secret' => $token['token_secret']))); + OCP\JSON::success(array('data' => array('url' => $oauth->getAuthorizeUrl($callback), + 'request_token' => $token['token'], + 'request_token_secret' => $token['token_secret']))); } catch (Exception $exception) { - OCP\JSON::error(array('data' => array('message' => 'Fetching request tokens failed. Verify that your Dropbox app key and secret are correct.'))); + OCP\JSON::error(array('data' => array('message' => + 'Fetching request tokens failed. Verify that your Dropbox app key and secret are correct.') + )); } break; case 2: @@ -26,9 +30,12 @@ if (isset($_POST['app_key']) && isset($_POST['app_secret'])) { try { $oauth->setToken($_POST['request_token'], $_POST['request_token_secret']); $token = $oauth->getAccessToken(); - OCP\JSON::success(array('access_token' => $token['token'], 'access_token_secret' => $token['token_secret'])); + OCP\JSON::success(array('access_token' => $token['token'], + 'access_token_secret' => $token['token_secret'])); } catch (Exception $exception) { - OCP\JSON::error(array('data' => array('message' => 'Fetching access tokens failed. Verify that your Dropbox app key and secret are correct.'))); + OCP\JSON::error(array('data' => array('message' => + 'Fetching access tokens failed. Verify that your Dropbox app key and secret are correct.') + )); } } break; diff --git a/apps/files_external/ajax/google.php b/apps/files_external/ajax/google.php index 4cd01c06cc..c76c7618e4 100644 --- a/apps/files_external/ajax/google.php +++ b/apps/files_external/ajax/google.php @@ -14,7 +14,9 @@ if (isset($_POST['step'])) { } else { $callback = null; } - $scope = 'https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/'; + $scope = 'https://docs.google.com/feeds/' + .' https://docs.googleusercontent.com/' + .' https://spreadsheets.google.com/feeds/'; $url = 'https://www.google.com/accounts/OAuthGetRequestToken?scope='.urlencode($scope); $params = array('scope' => $scope, 'oauth_callback' => $callback); $request = OAuthRequest::from_consumer_and_token($consumer, null, 'GET', $url, $params); @@ -24,24 +26,35 @@ if (isset($_POST['step'])) { parse_str($response, $token); if (isset($token['oauth_token']) && isset($token['oauth_token_secret'])) { $authUrl = 'https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token='.$token['oauth_token']; - OCP\JSON::success(array('data' => array('url' => $authUrl, 'request_token' => $token['oauth_token'], 'request_token_secret' => $token['oauth_token_secret']))); + OCP\JSON::success(array('data' => array('url' => $authUrl, + 'request_token' => $token['oauth_token'], + 'request_token_secret' => $token['oauth_token_secret']))); } else { - OCP\JSON::error(array('data' => array('message' => 'Fetching request tokens failed. Error: '.$response))); + OCP\JSON::error(array('data' => array( + 'message' => 'Fetching request tokens failed. Error: '.$response + ))); } break; case 2: - if (isset($_POST['oauth_verifier']) && isset($_POST['request_token']) && isset($_POST['request_token_secret'])) { + if (isset($_POST['oauth_verifier']) + && isset($_POST['request_token']) + && isset($_POST['request_token_secret']) + ) { $token = new OAuthToken($_POST['request_token'], $_POST['request_token_secret']); $url = 'https://www.google.com/accounts/OAuthGetAccessToken'; - $request = OAuthRequest::from_consumer_and_token($consumer, $token, 'GET', $url, array('oauth_verifier' => $_POST['oauth_verifier'])); + $request = OAuthRequest::from_consumer_and_token($consumer, $token, 'GET', $url, + array('oauth_verifier' => $_POST['oauth_verifier'])); $request->sign_request($sigMethod, $consumer, $token); $response = send_signed_request('GET', $url, array($request->to_header()), null, false); $token = array(); parse_str($response, $token); if (isset($token['oauth_token']) && isset($token['oauth_token_secret'])) { - OCP\JSON::success(array('access_token' => $token['oauth_token'], 'access_token_secret' => $token['oauth_token_secret'])); + OCP\JSON::success(array('access_token' => $token['oauth_token'], + 'access_token_secret' => $token['oauth_token_secret'])); } else { - OCP\JSON::error(array('data' => array('message' => 'Fetching access tokens failed. Error: '.$response))); + OCP\JSON::error(array('data' => array( + 'message' => 'Fetching access tokens failed. Error: '.$response + ))); } } break; diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 89f346574e..0dc983ca8a 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -142,7 +142,7 @@ $(document).ready(function() { $('td.remove>img').live('click', function() { var tr = $(this).parent().parent(); var mountPoint = $(tr).find('.mountPoint input').val(); - if (!mountPoint) { + if ( ! mountPoint) { var row=this.parentNode.parentNode; $.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), { cert: row.id }); $(tr).remove(); diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 41ec3c70b4..235ade06db 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -45,7 +45,7 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { if ($response) { $this->objects[$path] = $response; return $response; - // This object could be a folder, a '/' must be at the end of the path + // This object could be a folder, a '/' must be at the end of the path } else if (substr($path, -1) != '/') { $response = $this->s3->get_object_metadata($this->bucket, $path.'/'); if ($response) { @@ -108,11 +108,14 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { $stat['atime'] = time(); $stat['mtime'] = $stat['atime']; $stat['ctime'] = $stat['atime']; - } else if ($object = $this->getObject($path)) { - $stat['size'] = $object['Size']; - $stat['atime'] = time(); - $stat['mtime'] = strtotime($object['LastModified']); - $stat['ctime'] = $stat['mtime']; + } else { + $object = $this->getObject($path); + if ($object) { + $stat['size'] = $object['Size']; + $stat['atime'] = time(); + $stat['mtime'] = strtotime($object['LastModified']); + $stat['ctime'] = $stat['mtime']; + } } if (isset($stat)) { return $stat; @@ -123,12 +126,15 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { public function filetype($path) { if ($path == '' || $path == '/') { return 'dir'; - } else if ($object = $this->getObject($path)) { - // Amazon S3 doesn't have typical folders, this is an alternative method to detect a folder - if (substr($object['Key'], -1) == '/' && $object['Size'] == 0) { - return 'dir'; - } else { - return 'file'; + } else { + $object = $this->getObject($path); + if ($object) { + // Amazon S3 doesn't have typical folders, this is an alternative method to detect a folder + if (substr($object['Key'], -1) == '/' && $object['Size'] == 0) { + return 'dir'; + } else { + return 'file'; + } } } return false; @@ -199,7 +205,9 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { public function writeBack($tmpFile) { if (isset(self::$tempFiles[$tmpFile])) { $handle = fopen($tmpFile, 'r'); - $response = $this->s3->create_object($this->bucket, self::$tempFiles[$tmpFile], array('fileUpload' => $handle)); + $response = $this->s3->create_object($this->bucket, + self::$tempFiles[$tmpFile], + array('fileUpload' => $handle)); if ($response->isOK()) { unlink($tmpFile); } @@ -209,8 +217,11 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { public function getMimeType($path) { if ($this->filetype($path) == 'dir') { return 'httpd/unix-directory'; - } else if ($object = $this->getObject($path)) { - return $object['ContentType']; + } else { + $object = $this->getObject($path); + if ($object) { + return $object['ContentType']; + } } return false; } diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index fdc847fcf2..87d6886c51 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -39,14 +39,64 @@ class OC_Mount_Config { */ public static function getBackends() { return array( - 'OC_Filestorage_Local' => array('backend' => 'Local', 'configuration' => array('datadir' => 'Location')), - 'OC_Filestorage_AmazonS3' => array('backend' => 'Amazon S3', 'configuration' => array('key' => 'Key', 'secret' => '*Secret', 'bucket' => 'Bucket')), - 'OC_Filestorage_Dropbox' => array('backend' => 'Dropbox', 'configuration' => array('configured' => '#configured','app_key' => 'App key', 'app_secret' => 'App secret', 'token' => '#token', 'token_secret' => '#token_secret'), 'custom' => 'dropbox'), - 'OC_Filestorage_FTP' => array('backend' => 'FTP', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root', 'secure' => '!Secure ftps://')), - 'OC_Filestorage_Google' => array('backend' => 'Google Drive', 'configuration' => array('configured' => '#configured', 'token' => '#token', 'token_secret' => '#token secret'), 'custom' => 'google'), - 'OC_Filestorage_SWIFT' => array('backend' => 'OpenStack Swift', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'token' => '*Token', 'root' => '&Root', 'secure' => '!Secure ftps://')), - 'OC_Filestorage_SMB' => array('backend' => 'SMB', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'share' => 'Share', 'root' => '&Root')), - 'OC_Filestorage_DAV' => array('backend' => 'WebDAV', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root', 'secure' => '!Secure https://')) + 'OC_Filestorage_Local' => array( + 'backend' => 'Local', + 'configuration' => array( + 'datadir' => 'Location')), + 'OC_Filestorage_AmazonS3' => array( + 'backend' => 'Amazon S3', + 'configuration' => array( + 'key' => 'Key', + 'secret' => '*Secret', + 'bucket' => 'Bucket')), + 'OC_Filestorage_Dropbox' => array( + 'backend' => 'Dropbox', + 'configuration' => array( + 'configured' => '#configured', + 'app_key' => 'App key', + 'app_secret' => 'App secret', + 'token' => '#token', + 'token_secret' => '#token_secret'), + 'custom' => 'dropbox'), + 'OC_Filestorage_FTP' => array( + 'backend' => 'FTP', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Root', + 'secure' => '!Secure ftps://')), + 'OC_Filestorage_Google' => array( + 'backend' => 'Google Drive', + 'configuration' => array( + 'configured' => '#configured', + 'token' => '#token', + 'token_secret' => '#token secret'), + 'custom' => 'google'), + 'OC_Filestorage_SWIFT' => array( + 'backend' => 'OpenStack Swift', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'token' => '*Token', + 'root' => '&Root', + 'secure' => '!Secure ftps://')), + 'OC_Filestorage_SMB' => array( + 'backend' => 'SMB', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'share' => 'Share', + 'root' => '&Root')), + 'OC_Filestorage_DAV' => array( + 'backend' => 'WebDAV', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Root', + 'secure' => '!Secure https://')) ); } @@ -66,9 +116,14 @@ class OC_Mount_Config { $mountPoint = substr($mountPoint, 13); // Merge the mount point into the current mount points if (isset($system[$mountPoint]) && $system[$mountPoint]['configuration'] == $mount['options']) { - $system[$mountPoint]['applicable']['groups'] = array_merge($system[$mountPoint]['applicable']['groups'], array($group)); + $system[$mountPoint]['applicable']['groups'] + = array_merge($system[$mountPoint]['applicable']['groups'], array($group)); } else { - $system[$mountPoint] = array('class' => $mount['class'], 'backend' => $backends[$mount['class']]['backend'], 'configuration' => $mount['options'], 'applicable' => array('groups' => array($group), 'users' => array())); + $system[$mountPoint] = array( + 'class' => $mount['class'], + 'backend' => $backends[$mount['class']]['backend'], + 'configuration' => $mount['options'], + 'applicable' => array('groups' => array($group), 'users' => array())); } } } @@ -80,9 +135,13 @@ class OC_Mount_Config { $mountPoint = substr($mountPoint, 13); // Merge the mount point into the current mount points if (isset($system[$mountPoint]) && $system[$mountPoint]['configuration'] == $mount['options']) { - $system[$mountPoint]['applicable']['users'] = array_merge($system[$mountPoint]['applicable']['users'], array($user)); + $system[$mountPoint]['applicable']['users'] + = array_merge($system[$mountPoint]['applicable']['users'], array($user)); } else { - $system[$mountPoint] = array('class' => $mount['class'], 'backend' => $backends[$mount['class']]['backend'], 'configuration' => $mount['options'], 'applicable' => array('groups' => array(), 'users' => array($user))); + $system[$mountPoint] = array('class' => $mount['class'], + 'backend' => $backends[$mount['class']]['backend'], + 'configuration' => $mount['options'], + 'applicable' => array('groups' => array(), 'users' => array($user))); } } } @@ -103,7 +162,9 @@ class OC_Mount_Config { if (isset($mountPoints[self::MOUNT_TYPE_USER][$uid])) { foreach ($mountPoints[self::MOUNT_TYPE_USER][$uid] as $mountPoint => $mount) { // Remove '/uid/files/' from mount point - $personal[substr($mountPoint, strlen($uid) + 8)] = array('class' => $mount['class'], 'backend' => $backends[$mount['class']]['backend'], 'configuration' => $mount['options']); + $personal[substr($mountPoint, strlen($uid) + 8)] = array('class' => $mount['class'], + 'backend' => $backends[$mount['class']]['backend'], + 'configuration' => $mount['options']); } } return $personal; @@ -135,7 +196,12 @@ class OC_Mount_Config { * @param bool Personal or system mount point i.e. is this being called from the personal or admin page * @return bool */ - public static function addMountPoint($mountPoint, $class, $classOptions, $mountType, $applicable, $isPersonal = false) { + public static function addMountPoint($mountPoint, + $class, + $classOptions, + $mountType, + $applicable, + $isPersonal = false) { if ($isPersonal) { // Verify that the mount point applies for the current user // Prevent non-admin users from mounting local storage @@ -176,7 +242,8 @@ class OC_Mount_Config { // Merge the new mount point into the current mount points if (isset($mountPoints[$mountType])) { if (isset($mountPoints[$mountType][$applicable])) { - $mountPoints[$mountType][$applicable] = array_merge($mountPoints[$mountType][$applicable], $mount[$applicable]); + $mountPoints[$mountType][$applicable] + = array_merge($mountPoints[$mountType][$applicable], $mount[$applicable]); } else { $mountPoints[$mountType] = array_merge($mountPoints[$mountType], $mount); } @@ -286,18 +353,18 @@ class OC_Mount_Config { $view = \OCP\Files::getStorage('files_external'); $path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/'; \OCP\Util::writeLog('files_external', 'checking path '.$path, \OCP\Util::INFO); - if(!is_dir($path)) { + if ( ! is_dir($path)) { //path might not exist (e.g. non-standard OC_User::getHome() value) //in this case create full path using 3rd (recursive=true) parameter. mkdir($path, 0777, true); } $result = array(); $handle = opendir($path); - if (!$handle) { + if ( ! $handle) { return array(); } while (false !== ($file = readdir($handle))) { - if($file != '.' && $file != '..') $result[] = $file; + if ($file != '.' && $file != '..') $result[] = $file; } return $result; } diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php index c822083270..33ca14cab1 100755 --- a/apps/files_external/lib/dropbox.php +++ b/apps/files_external/lib/dropbox.php @@ -31,7 +31,12 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { private static $tempFiles = array(); public function __construct($params) { - if (isset($params['configured']) && $params['configured'] == 'true' && isset($params['app_key']) && isset($params['app_secret']) && isset($params['token']) && isset($params['token_secret'])) { + if (isset($params['configured']) && $params['configured'] == 'true' + && isset($params['app_key']) + && isset($params['app_secret']) + && isset($params['token']) + && isset($params['token_secret']) + ) { $this->root=isset($params['root'])?$params['root']:''; $oauth = new Dropbox_OAuth_Curl($params['app_key'], $params['app_secret']); $oauth->setToken($params['token'], $params['token_secret']); @@ -44,7 +49,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { private function getMetaData($path, $list = false) { $path = $this->root.$path; - if (!$list && isset($this->metaData[$path])) { + if ( ! $list && isset($this->metaData[$path])) { return $this->metaData[$path]; } else { if ($list) { @@ -95,7 +100,8 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { } public function opendir($path) { - if ($contents = $this->getMetaData($path, true)) { + $contents = $this->getMetaData($path, true); + if ($contents) { $files = array(); foreach ($contents as $file) { $files[] = basename($file['path']); @@ -107,7 +113,8 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { } public function stat($path) { - if ($metaData = $this->getMetaData($path)) { + $metaData = $this->getMetaData($path); + if ($metaData) { $stat['size'] = $metaData['bytes']; $stat['atime'] = time(); $stat['mtime'] = (isset($metaData['modified'])) ? strtotime($metaData['modified']) : time(); @@ -120,11 +127,14 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { public function filetype($path) { if ($path == '' || $path == '/') { return 'dir'; - } else if ($metaData = $this->getMetaData($path)) { - if ($metaData['is_dir'] == 'true') { - return 'dir'; - } else { - return 'file'; + } else { + $metaData = $this->getMetaData($path); + if ($metaData) { + if ($metaData['is_dir'] == 'true') { + return 'dir'; + } else { + return 'file'; + } } } return false; @@ -241,8 +251,11 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { public function getMimeType($path) { if ($this->filetype($path) == 'dir') { return 'httpd/unix-directory'; - } else if ($metaData = $this->getMetaData($path)) { - return $metaData['mime_type']; + } else { + $metaData = $this->getMetaData($path); + if ($metaData) { + return $metaData['mime_type']; + } } return false; } diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php index 5b90e3049b..e796ae446b 100644 --- a/apps/files_external/lib/ftp.php +++ b/apps/files_external/lib/ftp.php @@ -19,21 +19,21 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ $this->host=$params['host']; $this->user=$params['user']; $this->password=$params['password']; - if(isset($params['secure'])) { - if(is_string($params['secure'])) { + if (isset($params['secure'])) { + if (is_string($params['secure'])) { $this->secure = ($params['secure'] === 'true'); - }else{ + } else { $this->secure = (bool)$params['secure']; } - }else{ + } else { $this->secure = false; } $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/') { + if ( ! $this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } //create the root folder if necesary - if (!$this->is_dir('')) { + if ( ! $this->is_dir('')) { $this->mkdir(''); } } @@ -45,7 +45,7 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ */ public function constructUrl($path) { $url='ftp'; - if($this->secure) { + if ($this->secure) { $url.='s'; } $url.='://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path; @@ -71,14 +71,14 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ case 'c': case 'c+': //emulate these - if(strrpos($path, '.')!==false) { + if (strrpos($path, '.')!==false) { $ext=substr($path, strrpos($path, '.')); - }else{ + } else { $ext=''; } $tmpFile=OCP\Files::tmpFile($ext); OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this, 'writeBack'); - if($this->file_exists($path)) { + if ($this->file_exists($path)) { $this->getFile($path, $tmpFile); } self::$tempFiles[$tmpFile]=$path; @@ -87,7 +87,7 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ } public function writeBack($tmpFile) { - if(isset(self::$tempFiles[$tmpFile])) { + if (isset(self::$tempFiles[$tmpFile])) { $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]); unlink($tmpFile); } diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index e5de81280a..c836a5a07c 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -32,7 +32,10 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { private static $tempFiles = array(); public function __construct($params) { - if (isset($params['configured']) && $params['configured'] == 'true' && isset($params['token']) && isset($params['token_secret'])) { + if (isset($params['configured']) && $params['configured'] == 'true' + && isset($params['token']) + && isset($params['token_secret']) + ) { $consumer_key = isset($params['consumer_key']) ? $params['consumer_key'] : 'anonymous'; $consumer_secret = isset($params['consumer_secret']) ? $params['consumer_secret'] : 'anonymous'; $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); @@ -44,7 +47,14 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } } - private function sendRequest($uri, $httpMethod, $postData = null, $extraHeaders = null, $isDownload = false, $returnHeaders = false, $isContentXML = true, $returnHTTPCode = false) { + private function sendRequest($uri, + $httpMethod, + $postData = null, + $extraHeaders = null, + $isDownload = false, + $returnHeaders = false, + $isContentXML = true, + $returnHTTPCode = false) { $uri = trim($uri); // create an associative array from each key/value url query param pair. $params = array(); @@ -58,7 +68,11 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { $tempStr .= '&' . urlencode($key) . '=' . urlencode($value); } $uri = preg_replace('/&/', '?', $tempStr, 1); - $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->oauth_token, $httpMethod, $uri, $params); + $request = OAuthRequest::from_consumer_and_token($this->consumer, + $this->oauth_token, + $httpMethod, + $uri, + $params); $request->sign_request($this->sig_method, $this->consumer, $this->oauth_token); $auth_header = $request->to_header(); $headers = array($auth_header, 'GData-Version: 3.0'); @@ -132,6 +146,11 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { return false; } + /** + * Base url for google docs feeds + */ + const BASE_URI='https://docs.google.com/feeds'; + private function getResource($path) { $file = basename($path); if (array_key_exists($file, $this->entries)) { @@ -140,14 +159,14 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { // Strip the file extension; file could be a native Google Docs resource if ($pos = strpos($file, '.')) { $title = substr($file, 0, $pos); - $dom = $this->getFeed('https://docs.google.com/feeds/default/private/full?showfolders=true&title='.$title, 'GET'); + $dom = $this->getFeed(self::BASE_URI.'/default/private/full?showfolders=true&title='.$title, 'GET'); // Check if request was successful and entry exists if ($dom && $entry = $dom->getElementsByTagName('entry')->item(0)) { $this->entries[$file] = $entry; return $entry; } } - $dom = $this->getFeed('https://docs.google.com/feeds/default/private/full?showfolders=true&title='.$file, 'GET'); + $dom = $this->getFeed(self::BASE_URI.'/default/private/full?showfolders=true&title='.$file, 'GET'); // Check if request was successful and entry exists if ($dom && $entry = $dom->getElementsByTagName('entry')->item(0)) { $this->entries[$file] = $entry; @@ -180,20 +199,25 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { $collection = dirname($path); // Check if path parent is root directory if ($collection == '/' || $collection == '\.' || $collection == '.') { - $uri = 'https://docs.google.com/feeds/default/private/full'; - // Get parent content link - } else if ($dom = $this->getResource(basename($collection))) { - $uri = $dom->getElementsByTagName('content')->item(0)->getAttribute('src'); + $uri = self::BASE_URI.'/default/private/full'; + } else { + // Get parent content link + $dom = $this->getResource(basename($collection)); + if ($dom) { + $uri = $dom->getElementsByTagName('content')->item(0)->getAttribute('src'); + } } if (isset($uri)) { $title = basename($path); // Construct post data $postData = ''; $postData .= ''; - $postData .= ''; + $postData .= ''; $postData .= ''; - if ($dom = $this->sendRequest($uri, 'POST', $postData)) { + $dom = $this->sendRequest($uri, 'POST', $postData); + if ($dom) { return true; } } @@ -206,9 +230,10 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { public function opendir($path) { if ($path == '' || $path == '/') { - $next = 'https://docs.google.com/feeds/default/private/full/folder%3Aroot/contents'; + $next = self::BASE_URI.'/default/private/full/folder%3Aroot/contents'; } else { - if ($entry = $this->getResource($path)) { + $entry = $this->getResource($path); + if ($entry) { $next = $entry->getElementsByTagName('content')->item(0)->getAttribute('src'); } else { return false; @@ -230,7 +255,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { foreach ($entries as $entry) { $name = $entry->getElementsByTagName('title')->item(0)->nodeValue; // Google Docs resources don't always include extensions in title - if (!strpos($name, '.')) { + if ( ! strpos($name, '.')) { $extension = $this->getExtension($entry); if ($extension != '') { $name .= '.'.$extension; @@ -251,13 +276,19 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { $stat['atime'] = time(); $stat['mtime'] = time(); $stat['ctime'] = time(); - } else if ($entry = $this->getResource($path)) { - // NOTE: Native resources don't have a file size - $stat['size'] = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'quotaBytesUsed')->item(0)->nodeValue; -// if (isset($atime = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'lastViewed')->item(0)->nodeValue)) -// $stat['atime'] = strtotime($entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'lastViewed')->item(0)->nodeValue); - $stat['mtime'] = strtotime($entry->getElementsByTagName('updated')->item(0)->nodeValue); - $stat['ctime'] = strtotime($entry->getElementsByTagName('published')->item(0)->nodeValue); + } else { + $entry = $this->getResource($path); + if ($entry) { + // NOTE: Native resources don't have a file size + $stat['size'] = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', + 'quotaBytesUsed')->item(0)->nodeValue; + //if (isset($atime = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', + // 'lastViewed')->item(0)->nodeValue)) + //$stat['atime'] = strtotime($entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', + // 'lastViewed')->item(0)->nodeValue); + $stat['mtime'] = strtotime($entry->getElementsByTagName('updated')->item(0)->nodeValue); + $stat['ctime'] = strtotime($entry->getElementsByTagName('published')->item(0)->nodeValue); + } } if (isset($stat)) { return $stat; @@ -268,15 +299,18 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { public function filetype($path) { if ($path == '' || $path == '/') { return 'dir'; - } else if ($entry = $this->getResource($path)) { - $categories = $entry->getElementsByTagName('category'); - foreach ($categories as $category) { - if ($category->getAttribute('scheme') == 'http://schemas.google.com/g/2005#kind') { - $type = $category->getAttribute('label'); - if (strlen(strstr($type, 'folder')) > 0) { - return 'dir'; - } else { - return 'file'; + } else { + $entry = $this->getResource($path); + if ($entry) { + $categories = $entry->getElementsByTagName('category'); + foreach ($categories as $category) { + if ($category->getAttribute('scheme') == 'http://schemas.google.com/g/2005#kind') { + $type = $category->getAttribute('label'); + if (strlen(strstr($type, 'folder')) > 0) { + return 'dir'; + } else { + return 'file'; + } } } } @@ -291,14 +325,17 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { public function isUpdatable($path) { if ($path == '' || $path == '/') { return true; - } else if ($entry = $this->getResource($path)) { - // Check if edit or edit-media links exist - $links = $entry->getElementsByTagName('link'); - foreach ($links as $link) { - if ($link->getAttribute('rel') == 'edit') { - return true; - } else if ($link->getAttribute('rel') == 'edit-media') { - return true; + } else { + $entry = $this->getResource($path); + if ($entry) { + // Check if edit or edit-media links exist + $links = $entry->getElementsByTagName('link'); + foreach ($links as $link) { + if ($link->getAttribute('rel') == 'edit') { + return true; + } else if ($link->getAttribute('rel') == 'edit-media') { + return true; + } } } } @@ -316,7 +353,8 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { public function unlink($path) { // Get resource self link to trash resource - if ($entry = $this->getResource($path)) { + $entry = $this->getResource($path); + if ($entry) { $links = $entry->getElementsByTagName('link'); foreach ($links as $link) { if ($link->getAttribute('rel') == 'self') { @@ -333,7 +371,8 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } public function rename($path1, $path2) { - if ($entry = $this->getResource($path1)) { + $entry = $this->getResource($path1); + if ($entry) { $collection = dirname($path2); if (dirname($path1) == $collection) { // Get resource edit link to rename resource @@ -348,14 +387,18 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { $title = basename($path2); // Construct post data $postData = ''; - $postData .= ''; + $postData .= ''; $postData .= ''.$title.''; $postData .= ''; $this->sendRequest($uri, 'PUT', $postData); return true; } else { // Move to different collection - if ($collectionEntry = $this->getResource($collection)) { + $collectionEntry = $this->getResource($collection); + if ($collectionEntry) { $feedUri = $collectionEntry->getElementsByTagName('content')->item(0)->getAttribute('src'); // Construct post data $postData = ''; @@ -374,7 +417,8 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { switch ($mode) { case 'r': case 'rb': - if ($entry = $this->getResource($path)) { + $entry = $this->getResource($path); + if ($entry) { $extension = $this->getExtension($entry); $downloadUri = $entry->getElementsByTagName('content')->item(0)->getAttribute('src'); // TODO Non-native documents don't need these additional parameters @@ -420,14 +464,14 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { private function uploadFile($path, $target) { $entry = $this->getResource($target); - if (!$entry) { + if ( ! $entry) { if (dirname($target) == '.' || dirname($target) == '/') { - $uploadUri = 'https://docs.google.com/feeds/upload/create-session/default/private/full/folder%3Aroot/contents'; + $uploadUri = self::BASE_URI.'/upload/create-session/default/private/full/folder%3Aroot/contents'; } else { $entry = $this->getResource(dirname($target)); } } - if (!isset($uploadUri) && $entry) { + if ( ! isset($uploadUri) && $entry) { $links = $entry->getElementsByTagName('link'); foreach ($links as $link) { if ($link->getAttribute('rel') == 'http://schemas.google.com/g/2005#resumable-create-media') { @@ -466,7 +510,9 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } } $end = $i + $chunkSize - 1; - $headers = array('Content-Length: '.$chunkSize, 'Content-Type: '.$mimetype, 'Content-Range: bytes '.$i.'-'.$end.'/'.$size); + $headers = array('Content-Length: '.$chunkSize, + 'Content-Type: '.$mimetype, + 'Content-Range: bytes '.$i.'-'.$end.'/'.$size); $postData = fread($handle, $chunkSize); $result = $this->sendRequest($uploadUri, 'PUT', $postData, $headers, false, true, false, true); if ($result['code'] == '308') { @@ -484,7 +530,8 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } public function getMimeType($path, $entry = null) { - // Entry can be passed, because extension is required for opendir and the entry can't be cached without the extension + // Entry can be passed, because extension is required for opendir + // and the entry can't be cached without the extension if ($entry == null) { if ($path == '' || $path == '/') { return 'httpd/unix-directory'; @@ -494,8 +541,10 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } if ($entry) { $mimetype = $entry->getElementsByTagName('content')->item(0)->getAttribute('type'); - // Native Google Docs resources often default to text/html, but it may be more useful to default to a corresponding ODF mimetype - // Collections get reported as application/atom+xml, make sure it actually is a folder and fix the mimetype + // Native Google Docs resources often default to text/html, + // but it may be more useful to default to a corresponding ODF mimetype + // Collections get reported as application/atom+xml, + // make sure it actually is a folder and fix the mimetype if ($mimetype == 'text/html' || $mimetype == 'application/atom+xml;type=feed') { $categories = $entry->getElementsByTagName('category'); foreach ($categories as $category) { @@ -512,7 +561,8 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } else if (strlen(strstr($type, 'drawing')) > 0) { return 'application/vnd.oasis.opendocument.graphics'; } else { - // If nothing matches return text/html, all native Google Docs resources can be exported as text/html + // If nothing matches return text/html, + // all native Google Docs resources can be exported as text/html return 'text/html'; } } @@ -524,10 +574,13 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } public function free_space($path) { - if ($dom = $this->getFeed('https://docs.google.com/feeds/metadata/default', 'GET')) { + $dom = $this->getFeed(self::BASE_URI.'/metadata/default', 'GET'); + if ($dom) { // NOTE: Native Google Docs resources don't count towards quota - $total = $dom->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'quotaBytesTotal')->item(0)->nodeValue; - $used = $dom->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'quotaBytesUsed')->item(0)->nodeValue; + $total = $dom->getElementsByTagNameNS('http://schemas.google.com/g/2005', + 'quotaBytesTotal')->item(0)->nodeValue; + $used = $dom->getElementsByTagNameNS('http://schemas.google.com/g/2005', + 'quotaBytesUsed')->item(0)->nodeValue; return $total - $used; } return false; diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php index 802d80d8d1..071a9cd5f9 100644 --- a/apps/files_external/lib/smb.php +++ b/apps/files_external/lib/smb.php @@ -21,45 +21,46 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ $this->password=$params['password']; $this->share=$params['share']; $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/') { + if ( ! $this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } - if(substr($this->root, -1, 1)!='/') { + if (substr($this->root, -1, 1)!='/') { $this->root.='/'; } - if(!$this->share || $this->share[0]!='/') { + if ( ! $this->share || $this->share[0]!='/') { $this->share='/'.$this->share; } - if(substr($this->share, -1, 1)=='/') { + if (substr($this->share, -1, 1)=='/') { $this->share=substr($this->share, 0, -1); } //create the root folder if necesary - if(!$this->is_dir('')) { + if ( ! $this->is_dir('')) { $this->mkdir(''); } } public function constructUrl($path) { - if(substr($path, -1)=='/') { + if (substr($path, -1)=='/') { $path=substr($path, 0, -1); } return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path; } public function stat($path) { - if(!$path and $this->root=='/') {//mtime doesn't work for shares + if ( ! $path and $this->root=='/') {//mtime doesn't work for shares $mtime=$this->shareMTime(); $stat=stat($this->constructUrl($path)); $stat['mtime']=$mtime; return $stat; - }else{ + } else { return stat($this->constructUrl($path)); } } public function filetype($path) { - return (bool)@$this->opendir($path) ? 'dir' : 'file';//using opendir causes the same amount of requests and caches the content of the folder in one go + // using opendir causes the same amount of requests and caches the content of the folder in one go + return (bool)@$this->opendir($path) ? 'dir' : 'file'; } /** @@ -68,10 +69,11 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ * @return bool */ public function hasUpdated($path, $time) { - if(!$path and $this->root=='/') { - //mtime doesn't work for shares, but giving the nature of the backend, doing a full update is still just fast enough + if ( ! $path and $this->root=='/') { + // mtime doesn't work for shares, but giving the nature of the backend, + // doing a full update is still just fast enough return true; - }else{ + } else { $actualTime=$this->filemtime($path); return $actualTime>$time; } @@ -84,9 +86,9 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ $dh=$this->opendir(''); $lastCtime=0; while($file=readdir($dh)) { - if($file!='.' and $file!='..') { + if ($file!='.' and $file!='..') { $ctime=$this->filemtime($file); - if($ctime>$lastCtime) { + if ($ctime>$lastCtime) { $lastCtime=$ctime; } } diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php index b66a0f0ee1..a386e33399 100644 --- a/apps/files_external/lib/streamwrapper.php +++ b/apps/files_external/lib/streamwrapper.php @@ -15,11 +15,11 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ } public function rmdir($path) { - if($this->file_exists($path)) { - $succes=rmdir($this->constructUrl($path)); + if ($this->file_exists($path)) { + $succes = rmdir($this->constructUrl($path)); clearstatcache(); return $succes; - }else{ + } else { return false; } } @@ -45,7 +45,7 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ } public function unlink($path) { - $succes=unlink($this->constructUrl($path)); + $succes = unlink($this->constructUrl($path)); clearstatcache(); return $succes; } @@ -58,12 +58,12 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ return 0; } - public function touch($path, $mtime=null) { - if(is_null($mtime)) { - $fh=$this->fopen($path, 'a'); + public function touch($path, $mtime = null) { + if (is_null($mtime)) { + $fh = $this->fopen($path, 'a'); fwrite($fh, ''); fclose($fh); - }else{ + } else { return false;//not supported } } @@ -84,6 +84,4 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ return stat($this->constructUrl($path)); } - - } diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php index 45542aacbd..a071dfdbb0 100644 --- a/apps/files_external/lib/swift.php +++ b/apps/files_external/lib/swift.php @@ -49,17 +49,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return CF_Container */ private function getContainer($path) { - if($path=='' or $path=='/') { + if ($path=='' or $path=='/') { return $this->rootContainer; } - if(isset($this->containers[$path])) { + if (isset($this->containers[$path])) { return $this->containers[$path]; } - try{ + try { $container=$this->conn->get_container($this->getContainerName($path)); $this->containers[$path]=$container; return $container; - }catch(NoSuchContainerException $e) { + } catch(NoSuchContainerException $e) { return null; } } @@ -70,16 +70,16 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return CF_Container */ private function createContainer($path) { - if($path=='' or $path=='/' or $path=='.') { + if ($path=='' or $path=='/' or $path=='.') { return $this->conn->create_container($this->getContainerName($path)); } $parent=dirname($path); - if($parent=='' or $parent=='/' or $parent=='.') { + if ($parent=='' or $parent=='/' or $parent=='.') { $parentContainer=$this->rootContainer; - }else{ - if(!$this->containerExists($parent)) { + } else { + if ( ! $this->containerExists($parent)) { $parentContainer=$this->createContainer($parent); - }else{ + } else { $parentContainer=$this->getContainer($parent); } } @@ -93,21 +93,21 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return CF_Object */ private function getObject($path) { - if(isset($this->objects[$path])) { + if (isset($this->objects[$path])) { return $this->objects[$path]; } $container=$this->getContainer(dirname($path)); - if(is_null($container)) { + if (is_null($container)) { return null; - }else{ + } else { if ($path=="/" or $path=='') { return null; } - try{ + try { $obj=$container->get_object(basename($path)); $this->objects[$path]=$obj; return $obj; - }catch(NoSuchObjectException $e) { + } catch(NoSuchObjectException $e) { return null; } } @@ -119,11 +119,11 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return array */ private function getObjects($container) { - if(is_null($container)) { + if (is_null($container)) { return array(); - }else{ + } else { $files=$container->get_objects(); - foreach($files as &$file) { + foreach ($files as &$file) { $file=$file->name; } return $files; @@ -137,7 +137,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ */ private function createObject($path) { $container=$this->getContainer(dirname($path)); - if(!is_null($container)) { + if ( ! is_null($container)) { $container=$this->createContainer(dirname($path)); } return $container->create_object(basename($path)); @@ -169,15 +169,15 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ private function getSubContainers($container) { $tmpFile=OCP\Files::tmpFile(); $obj=$this->getSubContainerFile($container); - try{ + try { $obj->save_to_filename($tmpFile); - }catch(Exception $e) { + } catch(Exception $e) { return array(); } $obj->save_to_filename($tmpFile); $containers=file($tmpFile); unlink($tmpFile); - foreach($containers as &$sub) { + foreach ($containers as &$sub) { $sub=trim($sub); } return $containers; @@ -190,25 +190,25 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return bool */ private function addSubContainer($container, $name) { - if(!$name) { + if ( ! $name) { return false; } $tmpFile=OCP\Files::tmpFile(); $obj=$this->getSubContainerFile($container); - try{ + try { $obj->save_to_filename($tmpFile); $containers=file($tmpFile); - foreach($containers as &$sub) { + foreach ($containers as &$sub) { $sub=trim($sub); } - if(array_search($name, $containers)!==false) { + if (array_search($name, $containers)!==false) { unlink($tmpFile); return false; - }else{ + } else { $fh=fopen($tmpFile, 'a'); fwrite($fh, $name."\n"); } - }catch(Exception $e) { + } catch(Exception $e) { $containers=array(); file_put_contents($tmpFile, $name."\n"); } @@ -225,25 +225,25 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return bool */ private function removeSubContainer($container, $name) { - if(!$name) { + if ( ! $name) { return false; } $tmpFile=OCP\Files::tmpFile(); $obj=$this->getSubContainerFile($container); - try{ + try { $obj->save_to_filename($tmpFile); $containers=file($tmpFile); - }catch(Exception $e) { + } catch (Exception $e) { return false; } - foreach($containers as &$sub) { + foreach ($containers as &$sub) { $sub=trim($sub); } $i=array_search($name, $containers); - if($i===false) { + if ($i===false) { unlink($tmpFile); return false; - }else{ + } else { unset($containers[$i]); file_put_contents($tmpFile, implode("\n", $containers)."\n"); } @@ -259,9 +259,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @return CF_Object */ private function getSubContainerFile($container) { - try{ + try { return $container->get_object(self::SUBCONTAINER_FILE); - }catch(NoSuchObjectException $e) { + } catch(NoSuchObjectException $e) { return $container->create_object(self::SUBCONTAINER_FILE); } } @@ -271,16 +271,16 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $this->host=$params['host']; $this->user=$params['user']; $this->root=isset($params['root'])?$params['root']:'/'; - if(isset($params['secure'])) { - if(is_string($params['secure'])) { + if (isset($params['secure'])) { + if (is_string($params['secure'])) { $this->secure = ($params['secure'] === 'true'); - }else{ + } else { $this->secure = (bool)$params['secure']; } - }else{ + } else { $this->secure = false; } - if(!$this->root || $this->root[0]!='/') { + if ( ! $this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } $this->auth = new CF_Authentication($this->user, $this->token, null, $this->host); @@ -288,29 +288,29 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $this->conn = new CF_Connection($this->auth); - if(!$this->containerExists('/')) { + if ( ! $this->containerExists('/')) { $this->rootContainer=$this->createContainer('/'); - }else{ + } else { $this->rootContainer=$this->getContainer('/'); } } public function mkdir($path) { - if($this->containerExists($path)) { + if ($this->containerExists($path)) { return false; - }else{ + } else { $this->createContainer($path); return true; } } public function rmdir($path) { - if(!$this->containerExists($path)) { + if ( ! $this->containerExists($path)) { return false; - }else{ + } else { $this->emptyContainer($path); - if($path!='' and $path!='/') { + if ($path!='' and $path!='/') { $parentContainer=$this->getContainer(dirname($path)); $this->removeSubContainer($parentContainer, basename($path)); } @@ -323,12 +323,12 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ private function emptyContainer($path) { $container=$this->getContainer($path); - if(is_null($container)) { + if (is_null($container)) { return; } $subContainers=$this->getSubContainers($container); - foreach($subContainers as $sub) { - if($sub) { + foreach ($subContainers as $sub) { + if ($sub) { $this->emptyContainer($path.'/'.$sub); $this->conn->delete_container($this->getContainerName($path.'/'.$sub)); unset($this->containers[$path.'/'.$sub]); @@ -336,7 +336,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } $objects=$this->getObjects($container); - foreach($objects as $object) { + foreach ($objects as $object) { $container->delete_object($object); unset($this->objects[$path.'/'.$object]); } @@ -346,7 +346,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $container=$this->getContainer($path); $files=$this->getObjects($container); $i=array_search(self::SUBCONTAINER_FILE, $files); - if($i!==false) { + if ($i!==false) { unset($files[$i]); } $subContainers=$this->getSubContainers($container); @@ -357,9 +357,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } public function filetype($path) { - if($this->containerExists($path)) { + if ($this->containerExists($path)) { return 'dir'; - }else{ + } else { return 'file'; } } @@ -373,16 +373,16 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } public function file_exists($path) { - if($this->is_dir($path)) { + if ($this->is_dir($path)) { return true; - }else{ + } else { return $this->objectExists($path); } } public function file_get_contents($path) { $obj=$this->getObject($path); - if(is_null($obj)) { + if (is_null($obj)) { return false; } return $obj->read(); @@ -390,9 +390,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ public function file_put_contents($path, $content) { $obj=$this->getObject($path); - if(is_null($obj)) { + if (is_null($obj)) { $container=$this->getContainer(dirname($path)); - if(is_null($container)) { + if (is_null($container)) { return false; } $obj=$container->create_object(basename($path)); @@ -402,14 +402,14 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } public function unlink($path) { - if($this->containerExists($path)) { + if ($this->containerExists($path)) { return $this->rmdir($path); } - if($this->objectExists($path)) { + if ($this->objectExists($path)) { $container=$this->getContainer(dirname($path)); $container->delete_object(basename($path)); unset($this->objects[$path]); - }else{ + } else { return false; } } @@ -447,7 +447,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } public function writeBack($tmpFile) { - if(isset(self::$tempFiles[$tmpFile])) { + if (isset(self::$tempFiles[$tmpFile])) { $this->fromTmpFile($tmpFile, self::$tempFiles[$tmpFile]); unlink($tmpFile); } @@ -459,10 +459,10 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ public function touch($path, $mtime=null) { $obj=$this->getObject($path); - if(is_null($obj)) { + if (is_null($obj)) { return false; } - if(is_null($mtime)) { + if (is_null($mtime)) { $mtime=time(); } @@ -476,7 +476,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $targetContainer=$this->getContainer(dirname($path2)); $result=$sourceContainer->move_object_to(basename($path1), $targetContainer, basename($path2)); unset($this->objects[$path1]); - if($result) { + if ($result) { $targetObj=$this->getObject($path2); $this->resetMTime($targetObj); } @@ -487,7 +487,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $sourceContainer=$this->getContainer(dirname($path1)); $targetContainer=$this->getContainer(dirname($path2)); $result=$sourceContainer->copy_object_to(basename($path1), $targetContainer, basename($path2)); - if($result) { + if ($result) { $targetObj=$this->getObject($path2); $this->resetMTime($targetObj); } @@ -496,7 +496,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ public function stat($path) { $container=$this->getContainer($path); - if (!is_null($container)) { + if ( ! is_null($container)) { return array( 'mtime'=>-1, 'size'=>$container->bytes_used, @@ -506,13 +506,13 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ $obj=$this->getObject($path); - if(is_null($obj)) { + if (is_null($obj)) { return false; } - if(isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1) { + if (isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1) { $mtime=$obj->metadata['Mtime']; - }else{ + } else { $mtime=strtotime($obj->last_modified); } return array( @@ -524,18 +524,18 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ private function getTmpFile($path) { $obj=$this->getObject($path); - if(!is_null($obj)) { + if ( ! is_null($obj)) { $tmpFile=OCP\Files::tmpFile(); $obj->save_to_filename($tmpFile); return $tmpFile; - }else{ + } else { return OCP\Files::tmpFile(); } } private function fromTmpFile($tmpFile, $path) { $obj=$this->getObject($path); - if(is_null($obj)) { + if (is_null($obj)) { $obj=$this->createObject($path); } $obj->load_from_filename($tmpFile); @@ -547,7 +547,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param CF_Object obj */ private function resetMTime($obj) { - if(isset($obj->metadata['Mtime'])) { + if (isset($obj->metadata['Mtime'])) { $obj->metadata['Mtime']=-1; $obj->sync_metadata(); } diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 25b328ea2d..68aca228bc 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -27,20 +27,20 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ $this->host=$host; $this->user=$params['user']; $this->password=$params['password']; - if(isset($params['secure'])) { - if(is_string($params['secure'])) { + if (isset($params['secure'])) { + if (is_string($params['secure'])) { $this->secure = ($params['secure'] === 'true'); - }else{ + } else { $this->secure = (bool)$params['secure']; } - }else{ + } else { $this->secure = false; } $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/') { + if ( ! $this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } - if(substr($this->root, -1, 1)!='/') { + if (substr($this->root, -1, 1)!='/') { $this->root.='/'; } @@ -52,7 +52,8 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ $this->client = new OC_Connector_Sabre_Client($settings); - if($caview = \OCP\Files::getStorage('files_external')) { + $caview = \OCP\Files::getStorage('files_external'); + if ($caview) { $certPath=\OCP\Config::getSystemValue('datadirectory').$caview->getAbsolutePath("").'rootcerts.crt'; if (file_exists($certPath)) { $this->client->addTrustedCertificates($certPath); @@ -64,7 +65,7 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ private function createBaseUri() { $baseUri='http'; - if($this->secure) { + if ($this->secure) { $baseUri.='s'; } $baseUri.='://'.$this->host.$this->root; @@ -83,29 +84,29 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function opendir($path) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->propfind($path, array(), 1); $id=md5('webdav'.$this->root.$path); OC_FakeDirStream::$dirs[$id]=array(); $files=array_keys($response); array_shift($files);//the first entry is the current directory - foreach($files as $file) { + foreach ($files as $file) { $file = urldecode(basename($file)); OC_FakeDirStream::$dirs[$id][]=$file; } return opendir('fakedir://'.$id); - }catch(Exception $e) { + } catch(Exception $e) { return false; } } public function filetype($path) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->propfind($path, array('{DAV:}resourcetype')); $responseType=$response["{DAV:}resourcetype"]->resourceType; return (count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file'; - }catch(Exception $e) { + } catch(Exception $e) { error_log($e->getMessage()); \OCP\Util::writeLog("webdav client", \OCP\Util::sanitizeHTML($e->getMessage()), \OCP\Util::ERROR); return false; @@ -122,10 +123,10 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function file_exists($path) { $path=$this->cleanPath($path); - try{ + try { $this->client->propfind($path, array('{DAV:}resourcetype')); return true;//no 404 exception - }catch(Exception $e) { + } catch(Exception $e) { return false; } } @@ -139,7 +140,7 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ switch($mode) { case 'r': case 'rb': - if(!$this->file_exists($path)) { + if ( ! $this->file_exists($path)) { return false; } //straight up curl instead of sabredav here, sabredav put's the entire get result in memory @@ -166,14 +167,14 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ case 'c': case 'c+': //emulate these - if(strrpos($path, '.')!==false) { + if (strrpos($path, '.')!==false) { $ext=substr($path, strrpos($path, '.')); - }else{ + } else { $ext=''; } $tmpFile=OCP\Files::tmpFile($ext); OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this, 'writeBack'); - if($this->file_exists($path)) { + if ($this->file_exists($path)) { $this->getFile($path, $tmpFile); } self::$tempFiles[$tmpFile]=$path; @@ -182,7 +183,7 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ } public function writeBack($tmpFile) { - if(isset(self::$tempFiles[$tmpFile])) { + if (isset(self::$tempFiles[$tmpFile])) { $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]); unlink($tmpFile); } @@ -190,20 +191,20 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function free_space($path) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->propfind($path, array('{DAV:}quota-available-bytes')); - if(isset($response['{DAV:}quota-available-bytes'])) { + if (isset($response['{DAV:}quota-available-bytes'])) { return (int)$response['{DAV:}quota-available-bytes']; - }else{ + } else { return 0; } - }catch(Exception $e) { + } catch(Exception $e) { return 0; } } public function touch($path, $mtime=null) { - if(is_null($mtime)) { + if (is_null($mtime)) { $mtime=time(); } $path=$this->cleanPath($path); @@ -232,10 +233,10 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function rename($path1, $path2) { $path1=$this->cleanPath($path1); $path2=$this->root.$this->cleanPath($path2); - try{ + try { $response=$this->client->request('MOVE', $path1, null, array('Destination'=>$path2)); return true; - }catch(Exception $e) { + } catch(Exception $e) { echo $e; echo 'fail'; var_dump($response); @@ -246,10 +247,10 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function copy($path1, $path2) { $path1=$this->cleanPath($path1); $path2=$this->root.$this->cleanPath($path2); - try{ + try { $response=$this->client->request('COPY', $path1, null, array('Destination'=>$path2)); return true; - }catch(Exception $e) { + } catch(Exception $e) { echo $e; echo 'fail'; var_dump($response); @@ -259,50 +260,50 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ public function stat($path) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->propfind($path, array('{DAV:}getlastmodified', '{DAV:}getcontentlength')); return array( 'mtime'=>strtotime($response['{DAV:}getlastmodified']), 'size'=>(int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0, 'ctime'=>-1, ); - }catch(Exception $e) { + } catch(Exception $e) { return array(); } } public function getMimeType($path) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->propfind($path, array('{DAV:}getcontenttype', '{DAV:}resourcetype')); $responseType=$response["{DAV:}resourcetype"]->resourceType; $type=(count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file'; - if($type=='dir') { + if ($type=='dir') { return 'httpd/unix-directory'; - }elseif(isset($response['{DAV:}getcontenttype'])) { + } elseif (isset($response['{DAV:}getcontenttype'])) { return $response['{DAV:}getcontenttype']; - }else{ + } else { return false; } - }catch(Exception $e) { + } catch(Exception $e) { return false; } } private function cleanPath($path) { - if(!$path || $path[0]=='/') { + if ( ! $path || $path[0]=='/') { return substr($path, 1); - }else{ + } else { return $path; } } private function simpleResponse($method, $path, $body, $expected) { $path=$this->cleanPath($path); - try{ + try { $response=$this->client->request($method, $path, $body); return $response['statusCode']==$expected; - }catch(Exception $e) { + } catch(Exception $e) { return false; } } diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index 367ce2bc03..5b954eeb50 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -16,18 +16,22 @@ array())); ?> $mount): ?> > - + - + @@ -35,46 +39,75 @@ - - - + + + - + - + - + - + + + - - ' data-applicable-users=''> - - - - + + + - - - + + + - ><?php echo $l->t('Delete'); ?> + class="remove" + style="visibility:hidden;" + ><?php echo $l->t('Delete'); ?> @@ -83,16 +116,22 @@
    - /> + />
    t('Allow users to mount their own external storage'); ?>
    -
    +
    - + '> @@ -104,13 +143,18 @@ - +
    ><?php echo $l->t('Delete'); ?>class="remove" + style="visibility:hidden;" + ><?php echo $l->t('Delete'); ?>
    - - + +
    \ No newline at end of file diff --git a/apps/files_external/tests/amazons3.php b/apps/files_external/tests/amazons3.php index 725f4ba05d..39f96fe8e5 100644 --- a/apps/files_external/tests/amazons3.php +++ b/apps/files_external/tests/amazons3.php @@ -28,7 +28,7 @@ class Test_Filestorage_AmazonS3 extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['amazons3']) or !$this->config['amazons3']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['amazons3']) or ! $this->config['amazons3']['run']) { $this->markTestSkipped('AmazonS3 backend not configured'); } $this->config['amazons3']['bucket'] = $id; // Make sure we have a new empty bucket to work in @@ -37,7 +37,8 @@ class Test_Filestorage_AmazonS3 extends Test_FileStorage { public function tearDown() { if ($this->instance) { - $s3 = new AmazonS3(array('key' => $this->config['amazons3']['key'], 'secret' => $this->config['amazons3']['secret'])); + $s3 = new AmazonS3(array('key' => $this->config['amazons3']['key'], + 'secret' => $this->config['amazons3']['secret'])); if ($s3->delete_all_objects($this->id)) { $s3->delete_bucket($this->id); } diff --git a/apps/files_external/tests/dropbox.php b/apps/files_external/tests/dropbox.php index 56319b9f5d..304cb3ca38 100644 --- a/apps/files_external/tests/dropbox.php +++ b/apps/files_external/tests/dropbox.php @@ -12,7 +12,7 @@ class Test_Filestorage_Dropbox extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['dropbox']) or !$this->config['dropbox']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['dropbox']) or ! $this->config['dropbox']['run']) { $this->markTestSkipped('Dropbox backend not configured'); } $this->config['dropbox']['root'] .= '/' . $id; //make sure we have an new empty folder to work in diff --git a/apps/files_external/tests/ftp.php b/apps/files_external/tests/ftp.php index 80288b5911..d0404b5f34 100644 --- a/apps/files_external/tests/ftp.php +++ b/apps/files_external/tests/ftp.php @@ -12,7 +12,7 @@ class Test_Filestorage_FTP extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['ftp']) or !$this->config['ftp']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['ftp']) or ! $this->config['ftp']['run']) { $this->markTestSkipped('FTP backend not configured'); } $this->config['ftp']['root'] .= '/' . $id; //make sure we have an new empty folder to work in @@ -26,7 +26,11 @@ class Test_Filestorage_FTP extends Test_FileStorage { } public function testConstructUrl(){ - $config = array ( 'host' => 'localhost', 'user' => 'ftp', 'password' => 'ftp', 'root' => '/', 'secure' => false ); + $config = array ( 'host' => 'localhost', + 'user' => 'ftp', + 'password' => 'ftp', + 'root' => '/', + 'secure' => false ); $instance = new OC_Filestorage_FTP($config); $this->assertEqual('ftp://ftp:ftp@localhost/', $instance->constructUrl('')); diff --git a/apps/files_external/tests/google.php b/apps/files_external/tests/google.php index 46e622cc18..379bf992ff 100644 --- a/apps/files_external/tests/google.php +++ b/apps/files_external/tests/google.php @@ -27,7 +27,7 @@ class Test_Filestorage_Google extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['google']) or !$this->config['google']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['google']) or ! $this->config['google']['run']) { $this->markTestSkipped('Google backend not configured'); } $this->config['google']['root'] .= '/' . $id; //make sure we have an new empty folder to work in diff --git a/apps/files_external/tests/smb.php b/apps/files_external/tests/smb.php index 2c03ef5dbd..2d6268ef26 100644 --- a/apps/files_external/tests/smb.php +++ b/apps/files_external/tests/smb.php @@ -12,7 +12,7 @@ class Test_Filestorage_SMB extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['smb']) or !$this->config['smb']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['smb']) or ! $this->config['smb']['run']) { $this->markTestSkipped('Samba backend not configured'); } $this->config['smb']['root'] .= $id; //make sure we have an new empty folder to work in diff --git a/apps/files_external/tests/swift.php b/apps/files_external/tests/swift.php index 8cf2a3abc7..8b25db5099 100644 --- a/apps/files_external/tests/swift.php +++ b/apps/files_external/tests/swift.php @@ -12,7 +12,7 @@ class Test_Filestorage_SWIFT extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['swift']) or !$this->config['swift']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['swift']) or ! $this->config['swift']['run']) { $this->markTestSkipped('OpenStack SWIFT backend not configured'); } $this->config['swift']['root'] .= '/' . $id; //make sure we have an new empty folder to work in diff --git a/apps/files_external/tests/webdav.php b/apps/files_external/tests/webdav.php index 2da88f63ed..dd938a0c93 100644 --- a/apps/files_external/tests/webdav.php +++ b/apps/files_external/tests/webdav.php @@ -12,7 +12,7 @@ class Test_Filestorage_DAV extends Test_FileStorage { public function setUp() { $id = uniqid(); $this->config = include('files_external/tests/config.php'); - if (!is_array($this->config) or !isset($this->config['webdav']) or !$this->config['webdav']['run']) { + if ( ! is_array($this->config) or ! isset($this->config['webdav']) or ! $this->config['webdav']['run']) { $this->markTestSkipped('WebDAV backend not configured'); } $this->config['webdav']['root'] .= '/' . $id; //make sure we have an new empty folder to work in From 21606633099a3f46194733fb4f28fcb2bf0edf5b Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Fri, 30 Nov 2012 08:43:24 -0700 Subject: [PATCH 396/481] ctrl issue fix --- apps/files/js/keyboardshortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index 41578e7f4a..1d4f068341 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -26,7 +26,7 @@ var keyCodes = { cmdOpera: 17, leftCmdWebKit: 91, rightCmdWebKit: 93, - ctrl: 16, + ctrl: 17, esc: 27, downArrow: 40, upArrow: 38, From 5d13b0533dce98cabd251c929ae50f74436ce68e Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Fri, 30 Nov 2012 10:10:00 -0700 Subject: [PATCH 397/481] event.ctrlKey --- apps/files/js/keyboardshortcuts.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index 1d4f068341..c430ed2d74 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -148,7 +148,8 @@ Files.bindKeyboardShortcuts = function (document, $) { || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1) + || $.inArray(keyCodes.ctrl, keys) !== -1 + || event.ctrlKey) && $.inArray(keyCodes.shift, keys) !== -1 ){ $("#fileList tr").each(function(index){//prevent default when renaming file/folder @@ -172,7 +173,9 @@ Files.bindKeyboardShortcuts = function (document, $) { || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1)){ + || $.inArray(keyCodes.ctrl, keys) !== -1 + || event.ctrlKey + )){ if($.inArray(keyCodes.shift, keys) !== -1 ){ //16=shift, New File newFile(); @@ -204,7 +207,8 @@ Files.bindKeyboardShortcuts = function (document, $) { || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1) + || $.inArray(keyCodes.ctrl, keys) !== -1 + || event.ctrlKey) && $.inArray(keyCodes.shift, keys) !== -1 ){//rename file rename(); From 47fa3a8fe02ed79a0fc1dc6b5673631fee847ae5 Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Fri, 30 Nov 2012 10:11:25 -0700 Subject: [PATCH 398/481] event.ctrlKey --- apps/files/js/keyboardshortcuts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index c430ed2d74..35a94eeacd 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -137,7 +137,8 @@ Files.bindKeyboardShortcuts = function (document, $) { || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1) + || $.inArray(keyCodes.ctrl, keys) !== -1 + || event.ctrlKey) ){ preventDefault = true;//new file/folder prevent browser from responding } From c7c5e2a2e25a93a18399b2ebad2150354434ead6 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 1 Dec 2012 00:03:27 +0100 Subject: [PATCH 399/481] [tx-robot] updated from transifex --- apps/files/l10n/ar.php | 2 - apps/files/l10n/bg_BG.php | 2 - apps/files/l10n/ca.php | 2 - apps/files/l10n/cs_CZ.php | 2 - apps/files/l10n/da.php | 2 - apps/files/l10n/de.php | 2 - apps/files/l10n/de_DE.php | 2 - apps/files/l10n/el.php | 2 - apps/files/l10n/eo.php | 2 - apps/files/l10n/es.php | 2 - apps/files/l10n/es_AR.php | 2 - apps/files/l10n/et_EE.php | 2 - apps/files/l10n/eu.php | 2 - apps/files/l10n/fa.php | 2 - apps/files/l10n/fi_FI.php | 2 - apps/files/l10n/fr.php | 2 - apps/files/l10n/gl.php | 2 - apps/files/l10n/he.php | 2 - apps/files/l10n/hr.php | 2 - apps/files/l10n/hu_HU.php | 2 - apps/files/l10n/ia.php | 1 - apps/files/l10n/id.php | 2 - apps/files/l10n/it.php | 2 - apps/files/l10n/ja_JP.php | 2 - apps/files/l10n/ka_GE.php | 2 - apps/files/l10n/ko.php | 2 - apps/files/l10n/lb.php | 2 - apps/files/l10n/lt_LT.php | 2 - apps/files/l10n/lv.php | 1 - apps/files/l10n/mk.php | 2 - apps/files/l10n/ms_MY.php | 2 - apps/files/l10n/nb_NO.php | 2 - apps/files/l10n/nl.php | 2 - apps/files/l10n/nn_NO.php | 1 - apps/files/l10n/oc.php | 2 - apps/files/l10n/pl.php | 2 - apps/files/l10n/pt_BR.php | 2 - apps/files/l10n/pt_PT.php | 2 - apps/files/l10n/ro.php | 2 - apps/files/l10n/ru.php | 2 - apps/files/l10n/ru_RU.php | 2 - apps/files/l10n/si_LK.php | 2 - apps/files/l10n/sk_SK.php | 2 - apps/files/l10n/sl.php | 2 - apps/files/l10n/sr.php | 2 - apps/files/l10n/sr@latin.php | 1 - apps/files/l10n/sv.php | 2 - apps/files/l10n/ta_LK.php | 2 - apps/files/l10n/th_TH.php | 2 - apps/files/l10n/tr.php | 2 - apps/files/l10n/uk.php | 2 - apps/files/l10n/vi.php | 2 - apps/files/l10n/zh_CN.GB2312.php | 2 - apps/files/l10n/zh_CN.php | 2 - apps/files/l10n/zh_TW.php | 2 - l10n/ar/files.po | 69 ++++++++++++++-------------- l10n/bg_BG/files.po | 69 ++++++++++++++-------------- l10n/ca/files.po | 71 ++++++++++++++--------------- l10n/cs_CZ/files.po | 71 ++++++++++++++--------------- l10n/cs_CZ/settings.po | 8 ++-- l10n/da/files.po | 69 ++++++++++++++-------------- l10n/de/files.po | 71 ++++++++++++++--------------- l10n/de_DE/files.po | 71 ++++++++++++++--------------- l10n/el/files.po | 71 ++++++++++++++--------------- l10n/eo/files.po | 69 ++++++++++++++-------------- l10n/es/files.po | 71 ++++++++++++++--------------- l10n/es_AR/files.po | 69 ++++++++++++++-------------- l10n/et_EE/files.po | 71 ++++++++++++++--------------- l10n/eu/files.po | 71 ++++++++++++++--------------- l10n/fa/files.po | 69 ++++++++++++++-------------- l10n/fa/settings.po | 9 ++-- l10n/fi_FI/files.po | 71 ++++++++++++++--------------- l10n/fr/files.po | 71 ++++++++++++++--------------- l10n/gl/files.po | 69 ++++++++++++++-------------- l10n/he/files.po | 69 ++++++++++++++-------------- l10n/hi/files.po | 67 +++++++++++++-------------- l10n/hr/files.po | 69 ++++++++++++++-------------- l10n/hu_HU/files.po | 69 ++++++++++++++-------------- l10n/ia/files.po | 67 +++++++++++++-------------- l10n/id/files.po | 69 ++++++++++++++-------------- l10n/it/files.po | 71 ++++++++++++++--------------- l10n/it/settings.po | 8 ++-- l10n/ja_JP/files.po | 71 ++++++++++++++--------------- l10n/ja_JP/settings.po | 8 ++-- l10n/ka_GE/files.po | 69 ++++++++++++++-------------- l10n/ko/files.po | 69 ++++++++++++++-------------- l10n/ku_IQ/files.po | 67 +++++++++++++-------------- l10n/lb/files.po | 69 ++++++++++++++-------------- l10n/lt_LT/files.po | 69 ++++++++++++++-------------- l10n/lv/files.po | 67 +++++++++++++-------------- l10n/mk/files.po | 69 ++++++++++++++-------------- l10n/ms_MY/files.po | 69 ++++++++++++++-------------- l10n/nb_NO/files.po | 69 ++++++++++++++-------------- l10n/nl/files.po | 71 ++++++++++++++--------------- l10n/nl/settings.po | 9 ++-- l10n/nn_NO/files.po | 69 ++++++++++++++-------------- l10n/oc/files.po | 69 ++++++++++++++-------------- l10n/pl/files.po | 71 ++++++++++++++--------------- l10n/pl_PL/files.po | 67 +++++++++++++-------------- l10n/pt_BR/files.po | 69 ++++++++++++++-------------- l10n/pt_PT/files.po | 71 ++++++++++++++--------------- l10n/pt_PT/settings.po | 9 ++-- l10n/ro/files.po | 69 ++++++++++++++-------------- l10n/ru/files.po | 71 ++++++++++++++--------------- l10n/ru_RU/files.po | 71 ++++++++++++++--------------- l10n/si_LK/files.po | 69 ++++++++++++++-------------- l10n/sk_SK/files.po | 69 ++++++++++++++-------------- l10n/sl/files.po | 71 ++++++++++++++--------------- l10n/sq/files.po | 69 ++++++++++++++-------------- l10n/sr/files.po | 69 ++++++++++++++-------------- l10n/sr@latin/files.po | 69 ++++++++++++++-------------- l10n/sv/files.po | 71 ++++++++++++++--------------- l10n/ta_LK/files.po | 71 ++++++++++++++--------------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 65 +++++++++++++------------- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/files.po | 71 ++++++++++++++--------------- l10n/tr/files.po | 69 ++++++++++++++-------------- l10n/uk/files.po | 71 ++++++++++++++--------------- l10n/uk/settings.po | 8 ++-- l10n/vi/files.po | 71 ++++++++++++++--------------- l10n/vi/settings.po | 8 ++-- l10n/zh_CN.GB2312/files.po | 69 ++++++++++++++-------------- l10n/zh_CN/files.po | 71 ++++++++++++++--------------- l10n/zh_HK/files.po | 67 +++++++++++++-------------- l10n/zh_TW/files.po | 71 ++++++++++++++--------------- l10n/zh_TW/settings.po | 8 ++-- l10n/zu_ZA/files.po | 67 +++++++++++++-------------- settings/l10n/cs_CZ.php | 1 + settings/l10n/fa.php | 1 + settings/l10n/it.php | 1 + settings/l10n/ja_JP.php | 1 + settings/l10n/nl.php | 1 + settings/l10n/pt_PT.php | 1 + settings/l10n/uk.php | 1 + settings/l10n/vi.php | 1 + settings/l10n/zh_TW.php | 1 + 144 files changed, 2119 insertions(+), 2399 deletions(-) diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php index 2d22061154..5740d54f8b 100644 --- a/apps/files/l10n/ar.php +++ b/apps/files/l10n/ar.php @@ -1,6 +1,5 @@ "تم ترفيع الملفات بنجاح.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم الملف الذي تريد ترفيعه أعلى مما upload_max_filesize يسمح به في ملف php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حجم الملف الذي تريد ترفيعه أعلى مما MAX_FILE_SIZE يسمح به في واجهة ال HTML.", "The uploaded file was only partially uploaded" => "تم ترفيع جزء من الملفات الذي تريد ترفيعها فقط", "No file was uploaded" => "لم يتم ترفيع أي من الملفات", @@ -19,7 +18,6 @@ "Folder" => "مجلد", "Upload" => "إرفع", "Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!", -"Share" => "شارك", "Download" => "تحميل", "Upload too large" => "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم." diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php index 1c847b453c..b527b0e027 100644 --- a/apps/files/l10n/bg_BG.php +++ b/apps/files/l10n/bg_BG.php @@ -1,6 +1,5 @@ "Файлът е качен успешно", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Файлът който се опитвате да качите, надвишава зададените стойности в upload_max_filesize в PHP.INI", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файлът който се опитвате да качите надвишава стойностите в MAX_FILE_SIZE в HTML формата.", "The uploaded file was only partially uploaded" => "Файлът е качен частично", "No file was uploaded" => "Фахлът не бе качен", @@ -22,7 +21,6 @@ "Upload" => "Качване", "Cancel upload" => "Отказване на качването", "Nothing in here. Upload something!" => "Няма нищо, качете нещо!", -"Share" => "Споделяне", "Download" => "Изтегляне", "Upload too large" => "Файлът е прекалено голям", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра.", diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index de72d3f46f..c612d6bdff 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -1,6 +1,5 @@ "El fitxer s'ha pujat correctament", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer de pujada excedeix la directiva upload_max_filesize establerta a php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer de pujada excedeix la directiva MAX_FILE_SIZE especificada al formulari HTML", "The uploaded file was only partially uploaded" => "El fitxer només s'ha pujat parcialment", "No file was uploaded" => "El fitxer no s'ha pujat", @@ -54,7 +53,6 @@ "Upload" => "Puja", "Cancel upload" => "Cancel·la la pujada", "Nothing in here. Upload something!" => "Res per aquí. Pugeu alguna cosa!", -"Share" => "Comparteix", "Download" => "Baixa", "Upload too large" => "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index 22a9353290..0f8a2dc4d0 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -1,6 +1,5 @@ "Soubor byl odeslán úspěšně", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Odeslaný soubor přesáhl svou velikostí parametr upload_max_filesize v php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný v formuláři HTML", "The uploaded file was only partially uploaded" => "Soubor byl odeslán pouze částečně", "No file was uploaded" => "Žádný soubor nebyl odeslán", @@ -54,7 +53,6 @@ "Upload" => "Odeslat", "Cancel upload" => "Zrušit odesílání", "Nothing in here. Upload something!" => "Žádný obsah. Nahrajte něco.", -"Share" => "Sdílet", "Download" => "Stáhnout", "Upload too large" => "Odeslaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php index 09eb61f976..24652622c6 100644 --- a/apps/files/l10n/da.php +++ b/apps/files/l10n/da.php @@ -1,6 +1,5 @@ "Der er ingen fejl, filen blev uploadet med success", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uploadede fil overskrider upload_max_filesize direktivet i php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uploadede fil overskrider MAX_FILE_SIZE -direktivet som er specificeret i HTML-formularen", "The uploaded file was only partially uploaded" => "Den uploadede file blev kun delvist uploadet", "No file was uploaded" => "Ingen fil blev uploadet", @@ -51,7 +50,6 @@ "Upload" => "Upload", "Cancel upload" => "Fortryd upload", "Nothing in here. Upload something!" => "Her er tomt. Upload noget!", -"Share" => "Del", "Download" => "Download", "Upload too large" => "Upload for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 88c1e792ae..3989d19151 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -1,6 +1,5 @@ "Datei fehlerfrei hochgeladen.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die Größe der hochzuladenden Datei überschreitet die upload_max_filesize-Richtlinie in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", "No file was uploaded" => "Es wurde keine Datei hochgeladen.", @@ -54,7 +53,6 @@ "Upload" => "Hochladen", "Cancel upload" => "Upload abbrechen", "Nothing in here. Upload something!" => "Alles leer. Lade etwas hoch!", -"Share" => "Freigabe", "Download" => "Herunterladen", "Upload too large" => "Upload zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 427380e5a2..fc8ce2f4ad 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -1,6 +1,5 @@ "Es sind keine Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die Größe der hochzuladenden Datei überschreitet die upload_max_filesize-Richtlinie in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", "No file was uploaded" => "Es wurde keine Datei hochgeladen.", @@ -54,7 +53,6 @@ "Upload" => "Hochladen", "Cancel upload" => "Upload abbrechen", "Nothing in here. Upload something!" => "Alles leer. Bitte laden Sie etwas hoch!", -"Share" => "Teilen", "Download" => "Herunterladen", "Upload too large" => "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index 3f2a44c034..f9c1d6d47b 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -1,6 +1,5 @@ "Δεν υπάρχει σφάλμα, το αρχείο εστάλει επιτυχώς", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το αρχείο που εστάλει υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"upload_max_filesize\" του php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το αρχείο υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"MAX_FILE_SIZE\" που έχει οριστεί στην HTML φόρμα", "The uploaded file was only partially uploaded" => "Το αρχείο εστάλει μόνο εν μέρει", "No file was uploaded" => "Κανένα αρχείο δεν στάλθηκε", @@ -54,7 +53,6 @@ "Upload" => "Αποστολή", "Cancel upload" => "Ακύρωση αποστολής", "Nothing in here. Upload something!" => "Δεν υπάρχει τίποτα εδώ. Ανέβασε κάτι!", -"Share" => "Διαμοιρασμός", "Download" => "Λήψη", "Upload too large" => "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν το διακομιστή.", diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 70ac5ce684..3d918b196c 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -1,6 +1,5 @@ "Ne estas eraro, la dosiero alŝutiĝis sukcese", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "La dosiero alŝutita superas la regulon upload_max_filesize el php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La dosiero alŝutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo", "The uploaded file was only partially uploaded" => "La alŝutita dosiero nur parte alŝutiĝis", "No file was uploaded" => "Neniu dosiero estas alŝutita", @@ -53,7 +52,6 @@ "Upload" => "Alŝuti", "Cancel upload" => "Nuligi alŝuton", "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!", -"Share" => "Kunhavigi", "Download" => "Elŝuti", "Upload too large" => "Elŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index e946c7e7cc..0ab442a68e 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -1,6 +1,5 @@ "No se ha producido ningún error, el archivo se ha subido con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo que intentas subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML", "The uploaded file was only partially uploaded" => "El archivo que intentas subir solo se subió parcialmente", "No file was uploaded" => "No se ha subido ningún archivo", @@ -54,7 +53,6 @@ "Upload" => "Subir", "Cancel upload" => "Cancelar subida", "Nothing in here. Upload something!" => "Aquí no hay nada. ¡Sube algo!", -"Share" => "Compartir", "Download" => "Descargar", "Upload too large" => "El archivo es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor.", diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php index 2746e983eb..5c7ca37387 100644 --- a/apps/files/l10n/es_AR.php +++ b/apps/files/l10n/es_AR.php @@ -1,6 +1,5 @@ "No se han producido errores, el archivo se ha subido con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo que intentás subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo que intentás subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML", "The uploaded file was only partially uploaded" => "El archivo que intentás subir solo se subió parcialmente", "No file was uploaded" => "El archivo no fue subido", @@ -53,7 +52,6 @@ "Upload" => "Subir", "Cancel upload" => "Cancelar subida", "Nothing in here. Upload something!" => "No hay nada. ¡Subí contenido!", -"Share" => "Compartir", "Download" => "Descargar", "Upload too large" => "El archivo es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que intentás subir sobrepasan el tamaño máximo ", diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index c89060db43..0fddbfdca4 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -1,6 +1,5 @@ "Ühtegi viga pole, fail on üles laetud", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Üles laetud faili suurus ületab php.ini määratud upload_max_filesize suuruse", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Üles laetud faili suurus ületab HTML vormis määratud upload_max_filesize suuruse", "The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt", "No file was uploaded" => "Ühtegi faili ei laetud üles", @@ -54,7 +53,6 @@ "Upload" => "Lae üles", "Cancel upload" => "Tühista üleslaadimine", "Nothing in here. Upload something!" => "Siin pole midagi. Lae midagi üles!", -"Share" => "Jaga", "Download" => "Lae alla", "Upload too large" => "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index 062ae33fb6..1f1ea6da50 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -1,6 +1,5 @@ "Ez da arazorik izan, fitxategia ongi igo da", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Igotako fitxategiaren tamaina php.ini-ko upload_max_filesize direktiban adierazitakoa baino handiagoa da", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Igotako fitxategiaren tamaina HTML inprimakiko MAX_FILESIZE direktiban adierazitakoa baino handiagoa da", "The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat baino gehiago ez da igo", "No file was uploaded" => "Ez da fitxategirik igo", @@ -54,7 +53,6 @@ "Upload" => "Igo", "Cancel upload" => "Ezeztatu igoera", "Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!", -"Share" => "Elkarbanatu", "Download" => "Deskargatu", "Upload too large" => "Igotakoa handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php index 4bf0800fcd..8284593e88 100644 --- a/apps/files/l10n/fa.php +++ b/apps/files/l10n/fa.php @@ -1,6 +1,5 @@ "هیچ خطایی وجود ندارد فایل با موفقیت بار گذاری شد", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حداکثر حجم تعیین شده برای بارگذاری در php.ini قابل ویرایش است", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حداکثر حجم مجاز برای بارگذاری از طریق HTML \nMAX_FILE_SIZE", "The uploaded file was only partially uploaded" => "مقدار کمی از فایل بارگذاری شده", "No file was uploaded" => "هیچ فایلی بارگذاری نشده", @@ -35,7 +34,6 @@ "Upload" => "بارگذاری", "Cancel upload" => "متوقف کردن بار گذاری", "Nothing in here. Upload something!" => "اینجا هیچ چیز نیست.", -"Share" => "به اشتراک گذاری", "Download" => "بارگیری", "Upload too large" => "حجم بارگذاری بسیار زیاد است", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index cbc0fe45ff..772dabbb39 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -1,6 +1,5 @@ "Ei virheitä, tiedosto lähetettiin onnistuneesti", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lähetetty tiedosto ylittää upload_max_filesize-arvon rajan php.ini-tiedostossa", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Lähetetty tiedosto ylittää HTML-lomakkeessa määritetyn MAX_FILE_SIZE-arvon ylärajan", "The uploaded file was only partially uploaded" => "Tiedoston lähetys onnistui vain osittain", "No file was uploaded" => "Yhtäkään tiedostoa ei lähetetty", @@ -44,7 +43,6 @@ "Upload" => "Lähetä", "Cancel upload" => "Peru lähetys", "Nothing in here. Upload something!" => "Täällä ei ole mitään. Lähetä tänne jotakin!", -"Share" => "Jaa", "Download" => "Lataa", "Upload too large" => "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index 97643c6363..30d96eb2c6 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -1,6 +1,5 @@ "Aucune erreur, le fichier a été téléversé avec succès", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier téléversé excède la valeur de upload_max_filesize spécifiée dans php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier téléversé excède la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML", "The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement téléversé", "No file was uploaded" => "Aucun fichier n'a été téléversé", @@ -54,7 +53,6 @@ "Upload" => "Envoyer", "Cancel upload" => "Annuler l'envoi", "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)", -"Share" => "Partager", "Download" => "Téléchargement", "Upload too large" => "Fichier trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.", diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index 43fdb459ad..868f99ec52 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -1,6 +1,5 @@ "Non hai erros. O ficheiro enviouse correctamente", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O ficheiro enviado supera a directiva upload_max_filesize no php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado supera a directiva MAX_FILE_SIZE que foi indicada no formulario HTML", "The uploaded file was only partially uploaded" => "O ficheiro enviado foi só parcialmente enviado", "No file was uploaded" => "Non se enviou ningún ficheiro", @@ -52,7 +51,6 @@ "Upload" => "Enviar", "Cancel upload" => "Cancelar a subida", "Nothing in here. Upload something!" => "Nada por aquí. Envía algo.", -"Share" => "Compartir", "Download" => "Descargar", "Upload too large" => "Envío demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor", diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 78c249d894..773a5c4812 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -1,6 +1,5 @@ "לא אירעה תקלה, הקבצים הועלו בהצלחה", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "הקובץ שהועלה חרג מההנחיה upload_max_filesize בקובץ php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ה־HTML", "The uploaded file was only partially uploaded" => "הקובץ שהועלה הועלה בצורה חלקית", "No file was uploaded" => "לא הועלו קבצים", @@ -32,7 +31,6 @@ "Upload" => "העלאה", "Cancel upload" => "ביטול ההעלאה", "Nothing in here. Upload something!" => "אין כאן שום דבר. אולי ברצונך להעלות משהו?", -"Share" => "שיתוף", "Download" => "הורדה", "Upload too large" => "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php index a9bc1aa13b..4db4ac3f3e 100644 --- a/apps/files/l10n/hr.php +++ b/apps/files/l10n/hr.php @@ -1,6 +1,5 @@ "Datoteka je poslana uspješno i bez pogrešaka", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Poslana datoteka izlazi iz okvira upload_max_size direktive postavljene u php.ini konfiguracijskoj datoteci", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslana datoteka izlazi iz okvira MAX_FILE_SIZE direktive postavljene u HTML obrascu", "The uploaded file was only partially uploaded" => "Datoteka je poslana samo djelomično", "No file was uploaded" => "Ni jedna datoteka nije poslana", @@ -40,7 +39,6 @@ "Upload" => "Pošalji", "Cancel upload" => "Prekini upload", "Nothing in here. Upload something!" => "Nema ničega u ovoj mapi. Pošalji nešto!", -"Share" => "podjeli", "Download" => "Preuzmi", "Upload too large" => "Prijenos je preobiman", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.", diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php index a0a84612d6..083d5a391e 100644 --- a/apps/files/l10n/hu_HU.php +++ b/apps/files/l10n/hu_HU.php @@ -1,6 +1,5 @@ "Nincs hiba, a fájl sikeresen feltöltve.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött file meghaladja az upload_max_filesize direktívát a php.ini-ben.", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "A feltöltött fájl meghaladja a MAX_FILE_SIZE direktívát ami meghatározott a HTML form-ban.", "The uploaded file was only partially uploaded" => "Az eredeti fájl csak részlegesen van feltöltve.", "No file was uploaded" => "Nem lett fájl feltöltve.", @@ -35,7 +34,6 @@ "Upload" => "Feltöltés", "Cancel upload" => "Feltöltés megszakítása", "Nothing in here. Upload something!" => "Töltsön fel egy fájlt.", -"Share" => "Megosztás", "Download" => "Letöltés", "Upload too large" => "Feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren.", diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php index cf3bc1eabb..ada64cd757 100644 --- a/apps/files/l10n/ia.php +++ b/apps/files/l10n/ia.php @@ -15,7 +15,6 @@ "Folder" => "Dossier", "Upload" => "Incargar", "Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!", -"Share" => "Compartir", "Download" => "Discargar", "Upload too large" => "Incargamento troppo longe" ); diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php index eba1d1e141..1f8cb444d2 100644 --- a/apps/files/l10n/id.php +++ b/apps/files/l10n/id.php @@ -1,6 +1,5 @@ "Tidak ada galat, berkas sukses diunggah", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "File yang diunggah melampaui directive upload_max_filesize di php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "File yang diunggah melampaui directive MAX_FILE_SIZE yang disebutan dalam form HTML.", "The uploaded file was only partially uploaded" => "Berkas hanya diunggah sebagian", "No file was uploaded" => "Tidak ada berkas yang diunggah", @@ -35,7 +34,6 @@ "Upload" => "Unggah", "Cancel upload" => "Batal mengunggah", "Nothing in here. Upload something!" => "Tidak ada apa-apa di sini. Unggah sesuatu!", -"Share" => "Bagikan", "Download" => "Unduh", "Upload too large" => "Unggahan terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang anda coba unggah melebihi ukuran maksimum untuk pengunggahan berkas di server ini.", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index 3b5ba8377f..e134f37014 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -1,6 +1,5 @@ "Non ci sono errori, file caricato con successo", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file caricato supera il valore upload_max_filesize in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file caricato supera il valore MAX_FILE_SIZE definito nel form HTML", "The uploaded file was only partially uploaded" => "Il file è stato parzialmente caricato", "No file was uploaded" => "Nessun file è stato caricato", @@ -54,7 +53,6 @@ "Upload" => "Carica", "Cancel upload" => "Annulla invio", "Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!", -"Share" => "Condividi", "Download" => "Scarica", "Upload too large" => "Il file caricato è troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index 9c0c202d73..27974160ff 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -1,6 +1,5 @@ "エラーはありません。ファイルのアップロードは成功しました", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "アップロードされたファイルはphp.iniのupload_max_filesizeに設定されたサイズを超えています", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードされたファイルはHTMLのフォームに設定されたMAX_FILE_SIZEに設定されたサイズを超えています", "The uploaded file was only partially uploaded" => "ファイルは一部分しかアップロードされませんでした", "No file was uploaded" => "ファイルはアップロードされませんでした", @@ -54,7 +53,6 @@ "Upload" => "アップロード", "Cancel upload" => "アップロードをキャンセル", "Nothing in here. Upload something!" => "ここには何もありません。何かアップロードしてください。", -"Share" => "共有", "Download" => "ダウンロード", "Upload too large" => "ファイルサイズが大きすぎます", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。", diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php index c6e1b23227..9a73abfbe3 100644 --- a/apps/files/l10n/ka_GE.php +++ b/apps/files/l10n/ka_GE.php @@ -1,6 +1,5 @@ "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ატვირთული ფაილი აჭარბებს MAX_FILE_SIZE დირექტივას, რომელიც მითითებულია HTML ფორმაში", "The uploaded file was only partially uploaded" => "ატვირთული ფაილი მხოლოდ ნაწილობრივ აიტვირთა", "No file was uploaded" => "ფაილი არ აიტვირთა", @@ -51,7 +50,6 @@ "Upload" => "ატვირთვა", "Cancel upload" => "ატვირთვის გაუქმება", "Nothing in here. Upload something!" => "აქ არაფერი არ არის. ატვირთე რამე!", -"Share" => "გაზიარება", "Download" => "ჩამოტვირთვა", "Upload too large" => "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index ea3157c568..0e2e542678 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -1,6 +1,5 @@ "업로드에 성공하였습니다.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "업로드한 파일이 php.ini에서 지정한 upload_max_filesize보다 더 큼", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "업로드한 파일이 HTML 문서에 지정한 MAX_FILE_SIZE보다 더 큼", "The uploaded file was only partially uploaded" => "파일이 부분적으로 업로드됨", "No file was uploaded" => "업로드된 파일 없음", @@ -52,7 +51,6 @@ "Upload" => "업로드", "Cancel upload" => "업로드 취소", "Nothing in here. Upload something!" => "내용이 없습니다. 업로드할 수 있습니다!", -"Share" => "공유", "Download" => "다운로드", "Upload too large" => "업로드 용량 초과", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index 74eacab1f9..229ec3f202 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -1,6 +1,5 @@ "Keen Feeler, Datei ass komplett ropgelueden ginn", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Déi ropgelueden Datei ass méi grouss wei d'upload_max_filesize Eegenschaft an der php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass", "The uploaded file was only partially uploaded" => "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn", "No file was uploaded" => "Et ass keng Datei ropgelueden ginn", @@ -34,7 +33,6 @@ "Upload" => "Eroplueden", "Cancel upload" => "Upload ofbriechen", "Nothing in here. Upload something!" => "Hei ass näischt. Lued eppes rop!", -"Share" => "Share", "Download" => "Eroflueden", "Upload too large" => "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php index 0db27ae0d5..fd9824e0c1 100644 --- a/apps/files/l10n/lt_LT.php +++ b/apps/files/l10n/lt_LT.php @@ -1,6 +1,5 @@ "Klaidų nėra, failas įkeltas sėkmingai", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Įkeliamo failo dydis viršija upload_max_filesize parametrą php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Įkeliamo failo dydis viršija MAX_FILE_SIZE parametrą, kuris yra nustatytas HTML formoje", "The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai", "No file was uploaded" => "Nebuvo įkeltas nė vienas failas", @@ -51,7 +50,6 @@ "Upload" => "Įkelti", "Cancel upload" => "Atšaukti siuntimą", "Nothing in here. Upload something!" => "Čia tuščia. Įkelkite ką nors!", -"Share" => "Dalintis", "Download" => "Atsisiųsti", "Upload too large" => "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje", diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php index 4911db7aa3..3336798491 100644 --- a/apps/files/l10n/lv.php +++ b/apps/files/l10n/lv.php @@ -33,7 +33,6 @@ "Upload" => "Augšuplādet", "Cancel upload" => "Atcelt augšuplādi", "Nothing in here. Upload something!" => "Te vēl nekas nav. Rīkojies, sāc augšuplādēt", -"Share" => "Līdzdalīt", "Download" => "Lejuplādēt", "Upload too large" => "Fails ir par lielu lai to augšuplādetu", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Jūsu augšuplādējamie faili pārsniedz servera pieļaujamo failu augšupielādes apjomu", diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php index 50b4735c36..c47fdbdbf4 100644 --- a/apps/files/l10n/mk.php +++ b/apps/files/l10n/mk.php @@ -1,6 +1,5 @@ "Нема грешка, датотеката беше подигната успешно", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Подигнатата датотеката ја надминува MAX_FILE_SIZE директивата која беше поставена во HTML формата", "The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.", "No file was uploaded" => "Не беше подигната датотека", @@ -31,7 +30,6 @@ "Upload" => "Подигни", "Cancel upload" => "Откажи прикачување", "Nothing in here. Upload something!" => "Тука нема ништо. Снимете нешто!", -"Share" => "Сподели", "Download" => "Преземи", "Upload too large" => "Датотеката е премногу голема", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php index 49bb8da879..d7756698d0 100644 --- a/apps/files/l10n/ms_MY.php +++ b/apps/files/l10n/ms_MY.php @@ -1,6 +1,5 @@ "Tiada ralat, fail berjaya dimuat naik.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Fail yang dimuat naik melebihi penyata upload_max_filesize dalam php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fail yang dimuat naik melebihi MAX_FILE_SIZE yang dinyatakan dalam form HTML ", "The uploaded file was only partially uploaded" => "Sebahagian daripada fail telah dimuat naik. ", "No file was uploaded" => "Tiada fail yang dimuat naik", @@ -33,7 +32,6 @@ "Upload" => "Muat naik", "Cancel upload" => "Batal muat naik", "Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!", -"Share" => "Kongsi", "Download" => "Muat turun", "Upload too large" => "Muat naik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php index ea36431d79..e5615a1c29 100644 --- a/apps/files/l10n/nb_NO.php +++ b/apps/files/l10n/nb_NO.php @@ -1,6 +1,5 @@ "Det er ingen feil. Filen ble lastet opp.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Filstørrelsen overskrider maksgrensedirektivet upload_max_filesize i php.ini-konfigurasjonen.", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Filstørrelsen overskrider maksgrensen på MAX_FILE_SIZE som ble oppgitt i HTML-skjemaet", "The uploaded file was only partially uploaded" => "Filopplastningen ble bare delvis gjennomført", "No file was uploaded" => "Ingen fil ble lastet opp", @@ -50,7 +49,6 @@ "Upload" => "Last opp", "Cancel upload" => "Avbryt opplasting", "Nothing in here. Upload something!" => "Ingenting her. Last opp noe!", -"Share" => "Del", "Download" => "Last ned", "Upload too large" => "Opplasting for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.", diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index 14c3315c56..74a8ff3bfb 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -1,6 +1,5 @@ "Geen fout opgetreden, bestand successvol geupload.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het geüploade bestand is groter dan de upload_max_filesize instelling in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het geüploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is opgegeven in de HTML-formulier", "The uploaded file was only partially uploaded" => "Het bestand is slechts gedeeltelijk geupload", "No file was uploaded" => "Geen bestand geüpload", @@ -54,7 +53,6 @@ "Upload" => "Upload", "Cancel upload" => "Upload afbreken", "Nothing in here. Upload something!" => "Er bevindt zich hier niets. Upload een bestand!", -"Share" => "Delen", "Download" => "Download", "Upload too large" => "Bestanden te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php index 57974afa85..04e01a39cf 100644 --- a/apps/files/l10n/nn_NO.php +++ b/apps/files/l10n/nn_NO.php @@ -1,6 +1,5 @@ "Ingen feil, fila vart lasta opp", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den opplasta fila er større enn variabelen upload_max_filesize i php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet", "The uploaded file was only partially uploaded" => "Fila vart berre delvis lasta opp", "No file was uploaded" => "Ingen filer vart lasta opp", diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php index 7e35ecf338..36bbb43339 100644 --- a/apps/files/l10n/oc.php +++ b/apps/files/l10n/oc.php @@ -1,6 +1,5 @@ "Amontcargament capitat, pas d'errors", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lo fichièr amontcargat es tròp bèl per la directiva «upload_max_filesize » del php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Lo fichièr amontcargat es mai gròs que la directiva «MAX_FILE_SIZE» especifiada dins lo formulari HTML", "The uploaded file was only partially uploaded" => "Lo fichièr foguèt pas completament amontcargat", "No file was uploaded" => "Cap de fichièrs son estats amontcargats", @@ -39,7 +38,6 @@ "Upload" => "Amontcarga", "Cancel upload" => " Anulla l'amontcargar", "Nothing in here. Upload something!" => "Pas res dedins. Amontcarga qualquaren", -"Share" => "Parteja", "Download" => "Avalcarga", "Upload too large" => "Amontcargament tròp gròs", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor.", diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index 860ccba2ee..6667cb66df 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -1,6 +1,5 @@ "Przesłano plik", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Rozmiar przesłanego pliku przekracza maksymalną wartość dyrektywy upload_max_filesize, zawartą w pliku php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Rozmiar przesłanego pliku przekracza maksymalną wartość dyrektywy upload_max_filesize, zawartą formularzu HTML", "The uploaded file was only partially uploaded" => "Plik przesłano tylko częściowo", "No file was uploaded" => "Nie przesłano żadnego pliku", @@ -54,7 +53,6 @@ "Upload" => "Prześlij", "Cancel upload" => "Przestań wysyłać", "Nothing in here. Upload something!" => "Brak zawartości. Proszę wysłać pliki!", -"Share" => "Współdziel", "Download" => "Pobiera element", "Upload too large" => "Wysyłany plik ma za duży rozmiar", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki które próbujesz przesłać, przekraczają maksymalną, dopuszczalną wielkość.", diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index bf92ffe42e..5b7dfaaf61 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -1,6 +1,5 @@ "Não houve nenhum erro, o arquivo foi transferido com sucesso", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O tamanho do arquivo excede o limed especifiicado em upload_max_filesize no php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O arquivo carregado excede o MAX_FILE_SIZE que foi especificado no formulário HTML", "The uploaded file was only partially uploaded" => "O arquivo foi transferido parcialmente", "No file was uploaded" => "Nenhum arquivo foi transferido", @@ -52,7 +51,6 @@ "Upload" => "Carregar", "Cancel upload" => "Cancelar upload", "Nothing in here. Upload something!" => "Nada aqui.Carrege alguma coisa!", -"Share" => "Compartilhar", "Download" => "Baixar", "Upload too large" => "Arquivo muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.", diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index 5d14cccc4b..4977554d75 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -1,6 +1,5 @@ "Sem erro, ficheiro enviado com sucesso", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O ficheiro enviado excede a directiva upload_max_filesize no php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado excede o diretivo MAX_FILE_SIZE especificado no formulário HTML", "The uploaded file was only partially uploaded" => "O ficheiro enviado só foi enviado parcialmente", "No file was uploaded" => "Não foi enviado nenhum ficheiro", @@ -54,7 +53,6 @@ "Upload" => "Enviar", "Cancel upload" => "Cancelar envio", "Nothing in here. Upload something!" => "Vazio. Envie alguma coisa!", -"Share" => "Partilhar", "Download" => "Transferir", "Upload too large" => "Envio muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que está a tentar enviar excedem o tamanho máximo de envio permitido neste servidor.", diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php index ce57e3ff84..34e8dc8a50 100644 --- a/apps/files/l10n/ro.php +++ b/apps/files/l10n/ro.php @@ -1,6 +1,5 @@ "Nicio eroare, fișierul a fost încărcat cu succes", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Fișierul are o dimensiune mai mare decât cea specificată în variabila upload_max_filesize din php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML", "The uploaded file was only partially uploaded" => "Fișierul a fost încărcat doar parțial", "No file was uploaded" => "Niciun fișier încărcat", @@ -40,7 +39,6 @@ "Upload" => "Încarcă", "Cancel upload" => "Anulează încărcarea", "Nothing in here. Upload something!" => "Nimic aici. Încarcă ceva!", -"Share" => "Partajează", "Download" => "Descarcă", "Upload too large" => "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 3413fa691b..5a8f448dc3 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -1,6 +1,5 @@ "Файл успешно загружен", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Файл превышает допустимые размеры (описаны как upload_max_filesize в php.ini)", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файл превышает размер MAX_FILE_SIZE, указаный в HTML-форме", "The uploaded file was only partially uploaded" => "Файл был загружен не полностью", "No file was uploaded" => "Файл не был загружен", @@ -54,7 +53,6 @@ "Upload" => "Загрузить", "Cancel upload" => "Отмена загрузки", "Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", -"Share" => "Опубликовать", "Download" => "Скачать", "Upload too large" => "Файл слишком большой", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые Вы пытаетесь загрузить, превышают лимит для файлов на этом сервере.", diff --git a/apps/files/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php index 018dfa8f7a..5a6c032ed9 100644 --- a/apps/files/l10n/ru_RU.php +++ b/apps/files/l10n/ru_RU.php @@ -1,6 +1,5 @@ "Ошибка отсутствует, файл загружен успешно.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Размер загруженного файла превышает заданный в директиве upload_max_filesize в php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Размер загруженного", "The uploaded file was only partially uploaded" => "Загружаемый файл был загружен частично", "No file was uploaded" => "Файл не был загружен", @@ -54,7 +53,6 @@ "Upload" => "Загрузить ", "Cancel upload" => "Отмена загрузки", "Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", -"Share" => "Сделать общим", "Download" => "Загрузить", "Upload too large" => "Загрузка слишком велика", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Размер файлов, которые Вы пытаетесь загрузить, превышает максимально допустимый размер для загрузки на данный сервер.", diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php index 241e52558d..e256075896 100644 --- a/apps/files/l10n/si_LK.php +++ b/apps/files/l10n/si_LK.php @@ -1,6 +1,5 @@ "නිවැරදි ව ගොනුව උඩුගත කෙරිනි", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "php.ini හි upload_max_filesize නියමයට වඩා උඩුගත කළ ගොනුව විශාලයි", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "උඩුගත කළ ගොනුවේ විශාලත්වය HTML පෝරමයේ නියම කළ ඇති MAX_FILE_SIZE විශාලත්වයට වඩා වැඩිය", "The uploaded file was only partially uploaded" => "උඩුගත කළ ගොනුවේ කොටසක් පමණක් උඩුගත විය", "No file was uploaded" => "කිසිදු ගොනවක් උඩුගත නොවිනි", @@ -41,7 +40,6 @@ "Upload" => "උඩුගත කිරීම", "Cancel upload" => "උඩුගත කිරීම අත් හරින්න", "Nothing in here. Upload something!" => "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න", -"Share" => "බෙදාහදාගන්න", "Download" => "බාගත කිරීම", "Upload too large" => "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index 4c379e899a..81e30dc0dc 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -1,6 +1,5 @@ "Nenastala žiadna chyba, súbor bol úspešne nahraný", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahraný súbor presiahol direktívu upload_max_filesize v php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný súbor presiahol MAX_FILE_SIZE direktívu, ktorá bola špecifikovaná v HTML formulári", "The uploaded file was only partially uploaded" => "Nahrávaný súbor bol iba čiastočne nahraný", "No file was uploaded" => "Žiaden súbor nebol nahraný", @@ -52,7 +51,6 @@ "Upload" => "Odoslať", "Cancel upload" => "Zrušiť odosielanie", "Nothing in here. Upload something!" => "Žiadny súbor. Nahrajte niečo!", -"Share" => "Zdielať", "Download" => "Stiahnuť", "Upload too large" => "Odosielaný súbor je príliš veľký", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index 84754792e0..b9d030c5d5 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -1,6 +1,5 @@ "Datoteka je uspešno naložena brez napak.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu", "The uploaded file was only partially uploaded" => "Datoteka je le delno naložena", "No file was uploaded" => "Nobena datoteka ni bila naložena", @@ -54,7 +53,6 @@ "Upload" => "Pošlji", "Cancel upload" => "Prekliči pošiljanje", "Nothing in here. Upload something!" => "Tukaj ni ničesar. Naložite kaj!", -"Share" => "Souporaba", "Download" => "Prejmi", "Upload too large" => "Nalaganje ni mogoče, ker je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku.", diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index e16ac0a313..3ce2585a23 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -1,6 +1,5 @@ "Нема грешке, фајл је успешно послат", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Послати фајл превазилази директиву upload_max_filesize из ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Послати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми", "The uploaded file was only partially uploaded" => "Послати фајл је само делимично отпремљен!", "No file was uploaded" => "Ниједан фајл није послат", @@ -52,7 +51,6 @@ "Upload" => "Пошаљи", "Cancel upload" => "Прекини слање", "Nothing in here. Upload something!" => "Овде нема ничег. Пошаљите нешто!", -"Share" => "Дељење", "Download" => "Преузми", "Upload too large" => "Пошиљка је превелика", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу.", diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php index ae28045f30..fddaf5840c 100644 --- a/apps/files/l10n/sr@latin.php +++ b/apps/files/l10n/sr@latin.php @@ -1,6 +1,5 @@ "Nema greške, fajl je uspešno poslat", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Poslati fajl prevazilazi direktivu upload_max_filesize iz ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslati fajl prevazilazi direktivu MAX_FILE_SIZE koja je navedena u HTML formi", "The uploaded file was only partially uploaded" => "Poslati fajl je samo delimično otpremljen!", "No file was uploaded" => "Nijedan fajl nije poslat", diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index 4b5cbe9ed4..3503c6c1a1 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -1,6 +1,5 @@ "Inga fel uppstod. Filen laddades upp utan problem", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-formulär", "The uploaded file was only partially uploaded" => "Den uppladdade filen var endast delvis uppladdad", "No file was uploaded" => "Ingen fil blev uppladdad", @@ -54,7 +53,6 @@ "Upload" => "Ladda upp", "Cancel upload" => "Avbryt uppladdning", "Nothing in here. Upload something!" => "Ingenting här. Ladda upp något!", -"Share" => "Dela", "Download" => "Ladda ner", "Upload too large" => "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php index d9b6b021be..9399089bc7 100644 --- a/apps/files/l10n/ta_LK.php +++ b/apps/files/l10n/ta_LK.php @@ -1,6 +1,5 @@ "இங்கு வழு இல்லை, கோப்பு வெற்றிகரமாக பதிவேற்றப்பட்டது", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "பதிவேற்றப்பட்ட கோப்பானது php.ini இலுள்ள upload_max_filesize directive ஐ விட கூடியது", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "பதிவேற்றப்பட்ட கோப்பானது HTML படிவத்தில் குறிப்பிடப்பட்டுள்ள MAX_FILE_SIZE directive ஐ விட கூடியது", "The uploaded file was only partially uploaded" => "பதிவேற்றப்பட்ட கோப்பானது பகுதியாக மட்டுமே பதிவேற்றப்பட்டுள்ளது", "No file was uploaded" => "எந்த கோப்பும் பதிவேற்றப்படவில்லை", @@ -54,7 +53,6 @@ "Upload" => "பதிவேற்றுக", "Cancel upload" => "பதிவேற்றலை இரத்து செய்க", "Nothing in here. Upload something!" => "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!", -"Share" => "பகிர்வு", "Download" => "பதிவிறக்குக", "Upload too large" => "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php index ea1aa90d51..343138ba12 100644 --- a/apps/files/l10n/th_TH.php +++ b/apps/files/l10n/th_TH.php @@ -1,6 +1,5 @@ "ไม่มีข้อผิดพลาดใดๆ ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ไฟล์ที่อัพโหลดมีขนาดเกินคำสั่ง upload_max_filesize ที่ระบุเอาไว้ในไฟล์ php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ไฟล์ที่อัพโหลดมีขนาดเกินคำสั่ง MAX_FILE_SIZE ที่ระบุเอาไว้ในรูปแบบคำสั่งในภาษา HTML", "The uploaded file was only partially uploaded" => "ไฟล์ที่อัพโหลดยังไม่ได้ถูกอัพโหลดอย่างสมบูรณ์", "No file was uploaded" => "ยังไม่มีไฟล์ที่ถูกอัพโหลด", @@ -54,7 +53,6 @@ "Upload" => "อัพโหลด", "Cancel upload" => "ยกเลิกการอัพโหลด", "Nothing in here. Upload something!" => "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!", -"Share" => "แชร์", "Download" => "ดาวน์โหลด", "Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index e657f02df6..8f7814088b 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -1,6 +1,5 @@ "Bir hata yok, dosya başarıyla yüklendi", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Yüklenen dosya php.ini de belirtilen upload_max_filesize sınırını aşıyor", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Yüklenen dosya HTML formundaki MAX_FILE_SIZE sınırını aşıyor", "The uploaded file was only partially uploaded" => "Yüklenen dosyanın sadece bir kısmı yüklendi", "No file was uploaded" => "Hiç dosya yüklenmedi", @@ -37,7 +36,6 @@ "Upload" => "Yükle", "Cancel upload" => "Yüklemeyi iptal et", "Nothing in here. Upload something!" => "Burada hiçbir şey yok. Birşeyler yükleyin!", -"Share" => "Paylaş", "Download" => "İndir", "Upload too large" => "Yüklemeniz çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index 4eb130736c..4823bdbd27 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -1,6 +1,5 @@ "Файл успішно відвантажено без помилок.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Розмір відвантаженого файлу перевищує директиву upload_max_filesize в php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Розмір відвантаженого файлу перевищує директиву MAX_FILE_SIZE вказану в HTML формі", "The uploaded file was only partially uploaded" => "Файл відвантажено лише частково", "No file was uploaded" => "Не відвантажено жодного файлу", @@ -54,7 +53,6 @@ "Upload" => "Відвантажити", "Cancel upload" => "Перервати завантаження", "Nothing in here. Upload something!" => "Тут нічого немає. Відвантажте що-небудь!", -"Share" => "Поділитися", "Download" => "Завантажити", "Upload too large" => "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php index 047caae39f..4f58e62317 100644 --- a/apps/files/l10n/vi.php +++ b/apps/files/l10n/vi.php @@ -1,6 +1,5 @@ "Không có lỗi, các tập tin đã được tải lên thành công", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Những tập tin được tải lên vượt quá upload_max_filesize được chỉ định trong php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Kích thước những tập tin tải lên vượt quá MAX_FILE_SIZE đã được quy định", "The uploaded file was only partially uploaded" => "Tập tin tải lên mới chỉ tải lên được một phần", "No file was uploaded" => "Không có tập tin nào được tải lên", @@ -54,7 +53,6 @@ "Upload" => "Tải lên", "Cancel upload" => "Hủy upload", "Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !", -"Share" => "Chia sẻ", "Download" => "Tải xuống", "Upload too large" => "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", diff --git a/apps/files/l10n/zh_CN.GB2312.php b/apps/files/l10n/zh_CN.GB2312.php index e3c85820e4..ccf0efff05 100644 --- a/apps/files/l10n/zh_CN.GB2312.php +++ b/apps/files/l10n/zh_CN.GB2312.php @@ -1,6 +1,5 @@ "没有任何错误,文件上传成功了", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件超过了php.ini指定的upload_max_filesize", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件超过了HTML表单指定的MAX_FILE_SIZE", "The uploaded file was only partially uploaded" => "文件只有部分被上传", "No file was uploaded" => "没有上传完成的文件", @@ -52,7 +51,6 @@ "Upload" => "上传", "Cancel upload" => "取消上传", "Nothing in here. Upload something!" => "这里没有东西.上传点什么!", -"Share" => "分享", "Download" => "下载", "Upload too large" => "上传的文件太大了", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "你正在试图上传的文件超过了此服务器支持的最大的文件大小.", diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index f74692c6f9..ab8e980c33 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -1,6 +1,5 @@ "没有发生错误,文件上传成功。", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件大小超过了php.ini 中指定的upload_max_filesize", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件超过了在HTML 表单中指定的MAX_FILE_SIZE", "The uploaded file was only partially uploaded" => "只上传了文件的一部分", "No file was uploaded" => "文件没有上传", @@ -54,7 +53,6 @@ "Upload" => "上传", "Cancel upload" => "取消上传", "Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!", -"Share" => "共享", "Download" => "下载", "Upload too large" => "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php index b5a0226741..5333209eff 100644 --- a/apps/files/l10n/zh_TW.php +++ b/apps/files/l10n/zh_TW.php @@ -1,6 +1,5 @@ "無錯誤,檔案上傳成功", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上傳的檔案超過了 php.ini 中的 upload_max_filesize 設定", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上傳黨案的超過 HTML 表單中指定 MAX_FILE_SIZE 限制", "The uploaded file was only partially uploaded" => "只有部分檔案被上傳", "No file was uploaded" => "無已上傳檔案", @@ -47,7 +46,6 @@ "Upload" => "上傳", "Cancel upload" => "取消上傳", "Nothing in here. Upload something!" => "沒有任何東西。請上傳內容!", -"Share" => "分享", "Download" => "下載", "Upload too large" => "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "你試圖上傳的檔案已超過伺服器的最大容量限制。 ", diff --git a/l10n/ar/files.po b/l10n/ar/files.po index 5e2107a9a3..2f8cead51f 100644 --- a/l10n/ar/files.po +++ b/l10n/ar/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "تم ترفيع الملفات بنجاح." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "حجم الملف الذي تريد ترفيعه أعلى مما upload_max_filesize يسمح به في ملف php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "حجم الملف الذي تريد ترفيعه أعلى مما MAX_FILE_SIZE يسمح به في واجهة ال HTML." -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "تم ترفيع جزء من الملفات الذي تريد ترفيعها فقط" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "لم يتم ترفيع أي من الملفات" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "المجلد المؤقت غير موجود" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "الملفات" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "إلغاء مشاركة" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "محذوف" @@ -155,15 +156,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "الاسم" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "حجم" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "معدل" @@ -191,27 +192,27 @@ msgstr "" msgid "Maximum upload size" msgstr "الحد الأقصى لحجم الملفات التي يمكن رفعها" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "حفظ" @@ -219,52 +220,48 @@ msgstr "حفظ" msgid "New" msgstr "جديد" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "ملف" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "مجلد" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "إرفع" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "لا يوجد شيء هنا. إرفع بعض الملفات!" -#: templates/index.php:52 -msgid "Share" -msgstr "شارك" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "تحميل" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "حجم الترفيع أعلى من المسموح" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/bg_BG/files.po b/l10n/bg_BG/files.po index c2e3a6dc7a..aec7865e43 100644 --- a/l10n/bg_BG/files.po +++ b/l10n/bg_BG/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Файлът е качен успешно" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Файлът който се опитвате да качите, надвишава зададените стойности в upload_max_filesize в PHP.INI" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Файлът който се опитвате да качите надвишава стойностите в MAX_FILE_SIZE в HTML формата." -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Файлът е качен частично" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Фахлът не бе качен" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Липсва временната папка" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Грешка при запис на диска" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Файлове" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Изтриване" @@ -156,15 +157,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Име" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Размер" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Променено" @@ -192,27 +193,27 @@ msgstr "" msgid "Maximum upload size" msgstr "Макс. размер за качване" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 означава без ограничение" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Запис" @@ -220,52 +221,48 @@ msgstr "Запис" msgid "New" msgstr "Нов" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Текстов файл" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Папка" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Качване" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Отказване на качването" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Няма нищо, качете нещо!" -#: templates/index.php:52 -msgid "Share" -msgstr "Споделяне" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Изтегляне" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Файлът е прекалено голям" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Файловете които се опитвате да качите са по-големи от позволеното за сървъра." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Файловете се претърсват, изчакайте." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/ca/files.po b/l10n/ca/files.po index f8f8371902..3d7d344586 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 10:24+0000\n" -"Last-Translator: rogerc \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "El fitxer s'ha pujat correctament" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "El fitxer de pujada excedeix la directiva upload_max_filesize establerta a php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "El fitxer de pujada excedeix la directiva MAX_FILE_SIZE especificada al formulari HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "El fitxer només s'ha pujat parcialment" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "El fitxer no s'ha pujat" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "S'ha perdut un fitxer temporal" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Ha fallat en escriure al disc" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fitxers" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Deixa de compartir" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Suprimeix" @@ -158,15 +159,15 @@ msgstr "{count} fitxers escannejats" msgid "error while scanning" msgstr "error durant l'escaneig" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nom" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Mida" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificat" @@ -194,27 +195,27 @@ msgstr "Gestió de fitxers" msgid "Maximum upload size" msgstr "Mida màxima de pujada" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "màxim possible:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necessari per fitxers múltiples i baixada de carpetes" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Activa la baixada ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 és sense límit" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Mida màxima d'entrada per fitxers ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Desa" @@ -222,52 +223,48 @@ msgstr "Desa" msgid "New" msgstr "Nou" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Fitxer de text" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Carpeta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Des d'enllaç" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Puja" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancel·la la pujada" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Res per aquí. Pugeu alguna cosa!" -#: templates/index.php:52 -msgid "Share" -msgstr "Comparteix" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Baixa" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "La pujada és massa gran" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "S'estan escanejant els fitxers, espereu" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Actualment escanejant" diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index 16c8466439..944830b1af 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 09:30+0000\n" -"Last-Translator: Tomáš Chvátal \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Soubor byl odeslán úspěšně" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Odeslaný soubor přesáhl svou velikostí parametr upload_max_filesize v php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný v formuláři HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Soubor byl odeslán pouze částečně" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Žádný soubor nebyl odeslán" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Chybí adresář pro dočasné soubory" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Zápis na disk selhal" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Soubory" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Zrušit sdílení" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Smazat" @@ -157,15 +158,15 @@ msgstr "prozkoumáno {count} souborů" msgid "error while scanning" msgstr "chyba při prohledávání" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Název" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Velikost" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Změněno" @@ -193,27 +194,27 @@ msgstr "Zacházení se soubory" msgid "Maximum upload size" msgstr "Maximální velikost pro odesílání" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "největší možná: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Potřebné pro více-souborové stahování a stahování složek." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Povolit ZIP-stahování" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 znamená bez omezení" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maximální velikost vstupu pro ZIP soubory" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Uložit" @@ -221,52 +222,48 @@ msgstr "Uložit" msgid "New" msgstr "Nový" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Textový soubor" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Složka" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Z odkazu" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Odeslat" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Zrušit odesílání" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Žádný obsah. Nahrajte něco." -#: templates/index.php:52 -msgid "Share" -msgstr "Sdílet" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Stáhnout" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Odeslaný soubor je příliš velký" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Soubory se prohledávají, prosím čekejte." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Aktuální prohledávání" diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po index de7d5e9907..0dbbf69983 100644 --- a/l10n/cs_CZ/settings.po +++ b/l10n/cs_CZ/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 06:45+0000\n" +"Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -73,7 +73,7 @@ msgstr "Jazyk byl změněn" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Správci se nemohou odebrat sami ze skupiny správců" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/da/files.po b/l10n/da/files.po index 6a8a2bc88e..2b9b44a916 100644 --- a/l10n/da/files.po +++ b/l10n/da/files.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" @@ -29,40 +29,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Der er ingen fejl, filen blev uploadet med success" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Den uploadede fil overskrider upload_max_filesize direktivet i php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Den uploadede fil overskrider MAX_FILE_SIZE -direktivet som er specificeret i HTML-formularen" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Den uploadede file blev kun delvist uploadet" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ingen fil blev uploadet" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Mangler en midlertidig mappe" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Fejl ved skrivning til disk." -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Filer" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Fjern deling" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Slet" @@ -161,15 +162,15 @@ msgstr "{count} filer skannet" msgid "error while scanning" msgstr "fejl under scanning" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Navn" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Størrelse" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Ændret" @@ -197,27 +198,27 @@ msgstr "Filhåndtering" msgid "Maximum upload size" msgstr "Maksimal upload-størrelse" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. mulige: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Nødvendigt for at kunne downloade mapper og flere filer ad gangen." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Muliggør ZIP-download" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 er ubegrænset" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimal størrelse på ZIP filer" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Gem" @@ -225,52 +226,48 @@ msgstr "Gem" msgid "New" msgstr "Ny" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstfil" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mappe" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Upload" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Fortryd upload" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Her er tomt. Upload noget!" -#: templates/index.php:52 -msgid "Share" -msgstr "Del" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Download" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Upload for stor" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Filerne bliver indlæst, vent venligst." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Indlæser" diff --git a/l10n/de/files.po b/l10n/de/files.po index 5f5f61307b..c2615d7bf1 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -24,9 +24,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" -"PO-Revision-Date: 2012-11-28 12:56+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -39,40 +39,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Datei fehlerfrei hochgeladen." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Die Größe der hochzuladenden Datei überschreitet die upload_max_filesize-Richtlinie in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Die Datei wurde nur teilweise hochgeladen." -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Es wurde keine Datei hochgeladen." -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Temporärer Ordner fehlt." -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Fehler beim Schreiben auf die Festplatte" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Dateien" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Löschen" @@ -171,15 +172,15 @@ msgstr "{count} Dateien wurden gescannt" msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Name" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Größe" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Bearbeitet" @@ -207,27 +208,27 @@ msgstr "Dateibehandlung" msgid "Maximum upload size" msgstr "Maximale Upload-Größe" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maximal möglich:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Für Mehrfachdatei- und Ordnerdownloads benötigt:" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-Download aktivieren" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 bedeutet unbegrenzt" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maximale Größe für ZIP-Dateien" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Speichern" @@ -235,52 +236,48 @@ msgstr "Speichern" msgid "New" msgstr "Neu" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Textdatei" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Ordner" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Von einem Link" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Hochladen" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Upload abbrechen" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Alles leer. Lade etwas hoch!" -#: templates/index.php:52 -msgid "Share" -msgstr "Freigabe" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Herunterladen" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Upload zu groß" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Dateien werden gescannt, bitte warten." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Scanne" diff --git a/l10n/de_DE/files.po b/l10n/de_DE/files.po index a705358c48..b991af5cb1 100644 --- a/l10n/de_DE/files.po +++ b/l10n/de_DE/files.po @@ -25,9 +25,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" -"PO-Revision-Date: 2012-11-28 12:56+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -40,40 +40,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Es sind keine Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Die Größe der hochzuladenden Datei überschreitet die upload_max_filesize-Richtlinie in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Die Datei wurde nur teilweise hochgeladen." -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Es wurde keine Datei hochgeladen." -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Der temporäre Ordner fehlt." -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Fehler beim Schreiben auf die Festplatte" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Dateien" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Löschen" @@ -172,15 +173,15 @@ msgstr "{count} Dateien wurden gescannt" msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Name" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Größe" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Bearbeitet" @@ -208,27 +209,27 @@ msgstr "Dateibehandlung" msgid "Maximum upload size" msgstr "Maximale Upload-Größe" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maximal möglich:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Für Mehrfachdatei- und Ordnerdownloads benötigt:" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-Download aktivieren" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 bedeutet unbegrenzt" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maximale Größe für ZIP-Dateien" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Speichern" @@ -236,52 +237,48 @@ msgstr "Speichern" msgid "New" msgstr "Neu" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Textdatei" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Ordner" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Von einem Link" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Hochladen" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Upload abbrechen" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Alles leer. Bitte laden Sie etwas hoch!" -#: templates/index.php:52 -msgid "Share" -msgstr "Teilen" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Herunterladen" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Der Upload ist zu groß" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Dateien werden gescannt, bitte warten." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Scanne" diff --git a/l10n/el/files.po b/l10n/el/files.po index 144770834e..eea5102149 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 15:47+0000\n" -"Last-Translator: Dimitris M. \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,40 +28,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Δεν υπάρχει σφάλμα, το αρχείο εστάλει επιτυχώς" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Το αρχείο που εστάλει υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"upload_max_filesize\" του php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Το αρχείο υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"MAX_FILE_SIZE\" που έχει οριστεί στην HTML φόρμα" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Το αρχείο εστάλει μόνο εν μέρει" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Κανένα αρχείο δεν στάλθηκε" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Λείπει ο προσωρινός φάκελος" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Αποτυχία εγγραφής στο δίσκο" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Αρχεία" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Διακοπή κοινής χρήσης" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Διαγραφή" @@ -160,15 +161,15 @@ msgstr "{count} αρχεία ανιχνεύτηκαν" msgid "error while scanning" msgstr "σφάλμα κατά την ανίχνευση" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Όνομα" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Μέγεθος" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Τροποποιήθηκε" @@ -196,27 +197,27 @@ msgstr "Διαχείριση αρχείων" msgid "Maximum upload size" msgstr "Μέγιστο μέγεθος αποστολής" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "μέγιστο δυνατό:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Απαραίτητο για κατέβασμα πολλαπλών αρχείων και φακέλων" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Ενεργοποίηση κατεβάσματος ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 για απεριόριστο" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Μέγιστο μέγεθος για αρχεία ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Αποθήκευση" @@ -224,52 +225,48 @@ msgstr "Αποθήκευση" msgid "New" msgstr "Νέο" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Αρχείο κειμένου" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Φάκελος" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Από σύνδεσμο" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Αποστολή" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Ακύρωση αποστολής" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Δεν υπάρχει τίποτα εδώ. Ανέβασε κάτι!" -#: templates/index.php:52 -msgid "Share" -msgstr "Διαμοιρασμός" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Λήψη" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Πολύ μεγάλο αρχείο προς αποστολή" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν το διακομιστή." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Τρέχουσα αναζήτηση " diff --git a/l10n/eo/files.po b/l10n/eo/files.po index d084a3d78e..c4c42339ac 100644 --- a/l10n/eo/files.po +++ b/l10n/eo/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ne estas eraro, la dosiero alŝutiĝis sukcese" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "La dosiero alŝutita superas la regulon upload_max_filesize el php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "La dosiero alŝutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "La alŝutita dosiero nur parte alŝutiĝis" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Neniu dosiero estas alŝutita" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Mankas tempa dosierujo" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Malsukcesis skribo al disko" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Dosieroj" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Malkunhavigi" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Forigi" @@ -156,15 +157,15 @@ msgstr "{count} dosieroj skaniĝis" msgid "error while scanning" msgstr "eraro dum skano" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nomo" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Grando" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modifita" @@ -192,27 +193,27 @@ msgstr "Dosieradministro" msgid "Maximum upload size" msgstr "Maksimuma alŝutogrando" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maks. ebla: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necesa por elŝuto de pluraj dosieroj kaj dosierujoj." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Kapabligi ZIP-elŝuton" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 signifas senlime" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimuma enirgrando por ZIP-dosieroj" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Konservi" @@ -220,52 +221,48 @@ msgstr "Konservi" msgid "New" msgstr "Nova" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstodosiero" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dosierujo" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "El ligilo" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Alŝuti" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Nuligi alŝuton" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nenio estas ĉi tie. Alŝutu ion!" -#: templates/index.php:52 -msgid "Share" -msgstr "Kunhavigi" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Elŝuti" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Elŝuto tro larĝa" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Dosieroj estas skanataj, bonvolu atendi." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Nuna skano" diff --git a/l10n/es/files.po b/l10n/es/files.po index 0e76c469e7..e366a8827d 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 15:20+0000\n" -"Last-Translator: Agustin Ferrario <>\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,40 +29,41 @@ msgid "There is no error, the file uploaded with success" msgstr "No se ha producido ningún error, el archivo se ha subido con éxito" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "El archivo que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "El archivo que intentas subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "El archivo que intentas subir solo se subió parcialmente" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "No se ha subido ningún archivo" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Falta un directorio temporal" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "La escritura en disco ha fallado" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Archivos" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Dejar de compartir" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Eliminar" @@ -161,15 +162,15 @@ msgstr "{count} archivos escaneados" msgid "error while scanning" msgstr "error escaneando" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nombre" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamaño" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificado" @@ -197,27 +198,27 @@ msgstr "Tratamiento de archivos" msgid "Maximum upload size" msgstr "Tamaño máximo de subida" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "máx. posible:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Se necesita para descargas multi-archivo y de carpetas" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Habilitar descarga en ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 es ilimitado" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Tamaño máximo para archivos ZIP de entrada" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Guardar" @@ -225,52 +226,48 @@ msgstr "Guardar" msgid "New" msgstr "Nuevo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Archivo de texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Carpeta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Desde el enlace" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Subir" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancelar subida" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Aquí no hay nada. ¡Sube algo!" -#: templates/index.php:52 -msgid "Share" -msgstr "Compartir" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Descargar" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "El archivo es demasiado grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Se están escaneando los archivos, por favor espere." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Ahora escaneando" diff --git a/l10n/es_AR/files.po b/l10n/es_AR/files.po index 95ef241cb6..90dafb22af 100644 --- a/l10n/es_AR/files.po +++ b/l10n/es_AR/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "No se han producido errores, el archivo se ha subido con éxito" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "El archivo que intentás subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "El archivo que intentás subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "El archivo que intentás subir solo se subió parcialmente" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "El archivo no fue subido" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Falta un directorio temporal" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Error al escribir en el disco" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Archivos" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Dejar de compartir" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Borrar" @@ -155,15 +156,15 @@ msgstr "{count} archivos escaneados" msgid "error while scanning" msgstr "error mientras se escaneaba" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nombre" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamaño" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificado" @@ -191,27 +192,27 @@ msgstr "Tratamiento de archivos" msgid "Maximum upload size" msgstr "Tamaño máximo de subida" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "máx. posible:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Es necesario para descargas multi-archivo y de carpetas" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Habilitar descarga en formato ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 significa ilimitado" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Tamaño máximo para archivos ZIP de entrada" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Guardar" @@ -219,52 +220,48 @@ msgstr "Guardar" msgid "New" msgstr "Nuevo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Archivo de texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Carpeta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Desde enlace" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Subir" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancelar subida" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "No hay nada. ¡Subí contenido!" -#: templates/index.php:52 -msgid "Share" -msgstr "Compartir" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Descargar" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "El archivo es demasiado grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Los archivos que intentás subir sobrepasan el tamaño máximo " -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Se están escaneando los archivos, por favor esperá." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Escaneo actual" diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index 77d1458218..9c1c0fadb7 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" -"PO-Revision-Date: 2012-11-29 21:20+0000\n" -"Last-Translator: Rivo Zängov \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ühtegi viga pole, fail on üles laetud" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Üles laetud faili suurus ületab php.ini määratud upload_max_filesize suuruse" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Üles laetud faili suurus ületab HTML vormis määratud upload_max_filesize suuruse" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Fail laeti üles ainult osaliselt" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ühtegi faili ei laetud üles" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Ajutiste failide kaust puudub" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Kettale kirjutamine ebaõnnestus" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Failid" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Lõpeta jagamine" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Kustuta" @@ -156,15 +157,15 @@ msgstr "{count} faili skännitud" msgid "error while scanning" msgstr "viga skännimisel" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nimi" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Suurus" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Muudetud" @@ -192,27 +193,27 @@ msgstr "Failide käsitlemine" msgid "Maximum upload size" msgstr "Maksimaalne üleslaadimise suurus" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maks. võimalik: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Vajalik mitme faili ja kausta allalaadimiste jaoks." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Luba ZIP-ina allalaadimine" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 tähendab piiramatut" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimaalne ZIP-faili sisestatava faili suurus" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Salvesta" @@ -220,52 +221,48 @@ msgstr "Salvesta" msgid "New" msgstr "Uus" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstifail" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Kaust" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Allikast" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Lae üles" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Tühista üleslaadimine" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Siin pole midagi. Lae midagi üles!" -#: templates/index.php:52 -msgid "Share" -msgstr "Jaga" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Lae alla" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Üleslaadimine on liiga suur" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Faile skannitakse, palun oota" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Praegune skannimine" diff --git a/l10n/eu/files.po b/l10n/eu/files.po index 2f667de1c6..31ff303707 100644 --- a/l10n/eu/files.po +++ b/l10n/eu/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 23:00+0000\n" -"Last-Translator: asieriko \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ez da arazorik izan, fitxategia ongi igo da" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Igotako fitxategiaren tamaina php.ini-ko upload_max_filesize direktiban adierazitakoa baino handiagoa da" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Igotako fitxategiaren tamaina HTML inprimakiko MAX_FILESIZE direktiban adierazitakoa baino handiagoa da" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Igotako fitxategiaren zati bat baino gehiago ez da igo" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ez da fitxategirik igo" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Aldi baterako karpeta falta da" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Errore bat izan da diskoan idazterakoan" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fitxategiak" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Ez elkarbanatu" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Ezabatu" @@ -156,15 +157,15 @@ msgstr "{count} fitxategi eskaneatuta" msgid "error while scanning" msgstr "errore bat egon da eskaneatzen zen bitartean" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Izena" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamaina" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Aldatuta" @@ -192,27 +193,27 @@ msgstr "Fitxategien kudeaketa" msgid "Maximum upload size" msgstr "Igo daitekeen gehienezko tamaina" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max, posiblea:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Beharrezkoa fitxategi-anitz eta karpeten deskargarako." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Gaitu ZIP-deskarga" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 mugarik gabe esan nahi du" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP fitxategien gehienezko tamaina" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Gorde" @@ -220,52 +221,48 @@ msgstr "Gorde" msgid "New" msgstr "Berria" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Testu fitxategia" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Karpeta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Estekatik" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Igo" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Ezeztatu igoera" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Ez dago ezer. Igo zerbait!" -#: templates/index.php:52 -msgid "Share" -msgstr "Elkarbanatu" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Deskargatu" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Igotakoa handiegia da" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Fitxategiak eskaneatzen ari da, itxoin mezedez." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Orain eskaneatzen ari da" diff --git a/l10n/fa/files.po b/l10n/fa/files.po index 769af8c342..7e13f99c90 100644 --- a/l10n/fa/files.po +++ b/l10n/fa/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "هیچ خطایی وجود ندارد فایل با موفقیت بار گذاری شد" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "حداکثر حجم تعیین شده برای بارگذاری در php.ini قابل ویرایش است" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "حداکثر حجم مجاز برای بارگذاری از طریق HTML \nMAX_FILE_SIZE" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "مقدار کمی از فایل بارگذاری شده" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "هیچ فایلی بارگذاری نشده" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "یک پوشه موقت گم شده است" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "نوشتن بر روی دیسک سخت ناموفق بود" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "فایل ها" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "پاک کردن" @@ -157,15 +158,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "نام" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "اندازه" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "تغییر یافته" @@ -193,27 +194,27 @@ msgstr "اداره پرونده ها" msgid "Maximum upload size" msgstr "حداکثر اندازه بارگزاری" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "حداکثرمقدارممکن:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "احتیاج پیدا خواهد شد برای چند پوشه و پرونده" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "فعال سازی بارگیری پرونده های فشرده" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 نامحدود است" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "حداکثرمقدار برای بار گزاری پرونده های فشرده" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "ذخیره" @@ -221,52 +222,48 @@ msgstr "ذخیره" msgid "New" msgstr "جدید" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "فایل متنی" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "پوشه" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "بارگذاری" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "متوقف کردن بار گذاری" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "اینجا هیچ چیز نیست." -#: templates/index.php:52 -msgid "Share" -msgstr "به اشتراک گذاری" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "بارگیری" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "حجم بارگذاری بسیار زیاد است" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "پرونده ها در حال بازرسی هستند لطفا صبر کنید" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "بازرسی کنونی" diff --git a/l10n/fa/settings.po b/l10n/fa/settings.po index 3311ac107d..3c7b819608 100644 --- a/l10n/fa/settings.po +++ b/l10n/fa/settings.po @@ -5,14 +5,15 @@ # Translators: # , 2012. # Hossein nag , 2012. +# , 2012. # vahid chakoshy , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 14:39+0000\n" +"Last-Translator: ho2o2oo \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -157,7 +158,7 @@ msgstr "بارگیری" #: templates/personal.php:19 msgid "Your password was changed" -msgstr "" +msgstr "رمز عبور شما تغییر یافت" #: templates/personal.php:20 msgid "Unable to change your password" diff --git a/l10n/fi_FI/files.po b/l10n/fi_FI/files.po index 1072d44d60..e96dbeabb5 100644 --- a/l10n/fi_FI/files.po +++ b/l10n/fi_FI/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 19:12+0000\n" -"Last-Translator: Jiri Grönroos \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,40 +27,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ei virheitä, tiedosto lähetettiin onnistuneesti" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Lähetetty tiedosto ylittää upload_max_filesize-arvon rajan php.ini-tiedostossa" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Lähetetty tiedosto ylittää HTML-lomakkeessa määritetyn MAX_FILE_SIZE-arvon ylärajan" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Tiedoston lähetys onnistui vain osittain" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Yhtäkään tiedostoa ei lähetetty" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Väliaikaiskansiota ei ole olemassa" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Levylle kirjoitus epäonnistui" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Tiedostot" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Peru jakaminen" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Poista" @@ -159,15 +160,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nimi" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Koko" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Muutettu" @@ -195,27 +196,27 @@ msgstr "Tiedostonhallinta" msgid "Maximum upload size" msgstr "Lähetettävän tiedoston suurin sallittu koko" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "suurin mahdollinen:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Tarvitaan useampien tiedostojen ja kansioiden latausta varten." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Ota ZIP-paketin lataaminen käytöön" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 on rajoittamaton" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP-tiedostojen enimmäiskoko" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Tallenna" @@ -223,52 +224,48 @@ msgstr "Tallenna" msgid "New" msgstr "Uusi" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstitiedosto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Kansio" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Lähetä" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Peru lähetys" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Täällä ei ole mitään. Lähetä tänne jotakin!" -#: templates/index.php:52 -msgid "Share" -msgstr "Jaa" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Lataa" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Lähetettävä tiedosto on liian suuri" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Tiedostoja tarkistetaan, odota hetki." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Tämänhetkinen tutkinta" diff --git a/l10n/fr/files.po b/l10n/fr/files.po index 58459bcd52..ca8bbd350f 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 01:02+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,40 +32,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Aucune erreur, le fichier a été téléversé avec succès" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Le fichier téléversé excède la valeur de upload_max_filesize spécifiée dans php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Le fichier téléversé excède la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Le fichier n'a été que partiellement téléversé" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Aucun fichier n'a été téléversé" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Il manque un répertoire temporaire" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Erreur d'écriture sur le disque" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fichiers" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Ne plus partager" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Supprimer" @@ -164,15 +165,15 @@ msgstr "{count} fichiers indexés" msgid "error while scanning" msgstr "erreur lors de l'indexation" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nom" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Taille" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modifié" @@ -200,27 +201,27 @@ msgstr "Gestion des fichiers" msgid "Maximum upload size" msgstr "Taille max. d'envoi" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "Max. possible :" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Nécessaire pour le téléchargement de plusieurs fichiers et de dossiers." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Activer le téléchargement ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 est illimité" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Taille maximale pour les fichiers ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Sauvegarder" @@ -228,52 +229,48 @@ msgstr "Sauvegarder" msgid "New" msgstr "Nouveau" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Fichier texte" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dossier" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Depuis le lien" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Envoyer" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Annuler l'envoi" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Il n'y a rien ici ! Envoyez donc quelque chose :)" -#: templates/index.php:52 -msgid "Share" -msgstr "Partager" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Téléchargement" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Fichier trop volumineux" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Les fichiers sont en cours d'analyse, veuillez patienter." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Analyse en cours" diff --git a/l10n/gl/files.po b/l10n/gl/files.po index d839df2c6d..93132eddc5 100644 --- a/l10n/gl/files.po +++ b/l10n/gl/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Non hai erros. O ficheiro enviouse correctamente" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "O ficheiro enviado supera a directiva upload_max_filesize no php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "O ficheiro enviado supera a directiva MAX_FILE_SIZE que foi indicada no formulario HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "O ficheiro enviado foi só parcialmente enviado" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Non se enviou ningún ficheiro" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Falta un cartafol temporal" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Erro ao escribir no disco" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Deixar de compartir" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Eliminar" @@ -156,15 +157,15 @@ msgstr "{count} ficheiros escaneados" msgid "error while scanning" msgstr "erro mentres analizaba" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nome" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamaño" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificado" @@ -192,27 +193,27 @@ msgstr "Manexo de ficheiro" msgid "Maximum upload size" msgstr "Tamaño máximo de envío" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "máx. posible: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Precísase para a descarga de varios ficheiros e cartafoles." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Habilitar a descarga-ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 significa ilimitado" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Tamaño máximo de descarga para os ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Gardar" @@ -220,52 +221,48 @@ msgstr "Gardar" msgid "New" msgstr "Novo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Ficheiro de texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Cartafol" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Dende a ligazón" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Enviar" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancelar a subida" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nada por aquí. Envía algo." -#: templates/index.php:52 -msgid "Share" -msgstr "Compartir" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Descargar" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Envío demasiado grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Estanse analizando os ficheiros. Agarda." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Análise actual" diff --git a/l10n/he/files.po b/l10n/he/files.po index b8f2350e69..7a8fd19841 100644 --- a/l10n/he/files.po +++ b/l10n/he/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "לא אירעה תקלה, הקבצים הועלו בהצלחה" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "הקובץ שהועלה חרג מההנחיה upload_max_filesize בקובץ php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ה־HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "הקובץ שהועלה הועלה בצורה חלקית" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "לא הועלו קבצים" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "תיקייה זמנית חסרה" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "הכתיבה לכונן נכשלה" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "קבצים" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "הסר שיתוף" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "מחיקה" @@ -158,15 +159,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "שם" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "גודל" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "זמן שינוי" @@ -194,27 +195,27 @@ msgstr "טיפול בקבצים" msgid "Maximum upload size" msgstr "גודל העלאה מקסימלי" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "המרבי האפשרי: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "נחוץ להורדה של ריבוי קבצים או תיקיות." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "הפעלת הורדת ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 - ללא הגבלה" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "גודל הקלט המרבי לקובצי ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "שמירה" @@ -222,52 +223,48 @@ msgstr "שמירה" msgid "New" msgstr "חדש" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "קובץ טקסט" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "תיקייה" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "העלאה" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "ביטול ההעלאה" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "אין כאן שום דבר. אולי ברצונך להעלות משהו?" -#: templates/index.php:52 -msgid "Share" -msgstr "שיתוף" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "הורדה" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "העלאה גדולה מידי" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "הקבצים נסרקים, נא להמתין." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "הסריקה הנוכחית" diff --git a/l10n/hi/files.po b/l10n/hi/files.po index 9ec701fa3a..1c494c435f 100644 --- a/l10n/hi/files.po +++ b/l10n/hi/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "" @@ -218,52 +219,48 @@ msgstr "" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/hr/files.po b/l10n/hr/files.po index 4183f7f3a1..7a1464ff14 100644 --- a/l10n/hr/files.po +++ b/l10n/hr/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Datoteka je poslana uspješno i bez pogrešaka" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Poslana datoteka izlazi iz okvira upload_max_size direktive postavljene u php.ini konfiguracijskoj datoteci" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Poslana datoteka izlazi iz okvira MAX_FILE_SIZE direktive postavljene u HTML obrascu" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Datoteka je poslana samo djelomično" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ni jedna datoteka nije poslana" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Nedostaje privremena mapa" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Neuspjelo pisanje na disk" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Prekini djeljenje" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Briši" @@ -157,15 +158,15 @@ msgstr "" msgid "error while scanning" msgstr "grečka prilikom skeniranja" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Naziv" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Veličina" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Zadnja promjena" @@ -193,27 +194,27 @@ msgstr "datoteka za rukovanje" msgid "Maximum upload size" msgstr "Maksimalna veličina prijenosa" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maksimalna moguća: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Potrebno za preuzimanje više datoteke i mape" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Omogući ZIP-preuzimanje" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 je \"bez limita\"" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimalna veličina za ZIP datoteke" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Snimi" @@ -221,52 +222,48 @@ msgstr "Snimi" msgid "New" msgstr "novo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "tekstualna datoteka" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "mapa" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Pošalji" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Prekini upload" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nema ničega u ovoj mapi. Pošalji nešto!" -#: templates/index.php:52 -msgid "Share" -msgstr "podjeli" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Preuzmi" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Prijenos je preobiman" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Datoteke se skeniraju, molimo pričekajte." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Trenutno skeniranje" diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po index 2b2f6202fd..cddd901f07 100644 --- a/l10n/hu_HU/files.po +++ b/l10n/hu_HU/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Nincs hiba, a fájl sikeresen feltöltve." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "A feltöltött file meghaladja az upload_max_filesize direktívát a php.ini-ben." +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "A feltöltött fájl meghaladja a MAX_FILE_SIZE direktívát ami meghatározott a HTML form-ban." -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Az eredeti fájl csak részlegesen van feltöltve." -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nem lett fájl feltöltve." -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Hiányzik az ideiglenes könyvtár" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Nem írható lemezre" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fájlok" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nem oszt meg" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Törlés" @@ -157,15 +158,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Név" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Méret" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Módosítva" @@ -193,27 +194,27 @@ msgstr "Fájlkezelés" msgid "Maximum upload size" msgstr "Maximális feltölthető fájlméret" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. lehetséges" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Kötegelt file- vagy mappaletöltéshez szükséges" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-letöltés engedélyezése" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 = korlátlan" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP file-ok maximum mérete" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Mentés" @@ -221,52 +222,48 @@ msgstr "Mentés" msgid "New" msgstr "Új" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Szövegfájl" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mappa" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Feltöltés" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Feltöltés megszakítása" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Töltsön fel egy fájlt." -#: templates/index.php:52 -msgid "Share" -msgstr "Megosztás" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Letöltés" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Feltöltés túl nagy" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "File-ok vizsgálata, kis türelmet" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Aktuális vizsgálat" diff --git a/l10n/ia/files.po b/l10n/ia/files.po index 8dfdf38562..3f93aeb396 100644 --- a/l10n/ia/files.po +++ b/l10n/ia/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Le file incargate solmente esseva incargate partialmente" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nulle file esseva incargate" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Manca un dossier temporari" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Files" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Deler" @@ -156,15 +157,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nomine" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Dimension" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificate" @@ -192,27 +193,27 @@ msgstr "" msgid "Maximum upload size" msgstr "Dimension maxime de incargamento" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Salveguardar" @@ -220,52 +221,48 @@ msgstr "Salveguardar" msgid "New" msgstr "Nove" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "File de texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dossier" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Incargar" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nihil hic. Incarga alcun cosa!" -#: templates/index.php:52 -msgid "Share" -msgstr "Compartir" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Discargar" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Incargamento troppo longe" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/id/files.po b/l10n/id/files.po index 23087ff74c..4c752ed6c0 100644 --- a/l10n/id/files.po +++ b/l10n/id/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Tidak ada galat, berkas sukses diunggah" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "File yang diunggah melampaui directive upload_max_filesize di php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "File yang diunggah melampaui directive MAX_FILE_SIZE yang disebutan dalam form HTML." -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Berkas hanya diunggah sebagian" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Tidak ada berkas yang diunggah" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Kehilangan folder temporer" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Gagal menulis ke disk" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Berkas" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "batalkan berbagi" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Hapus" @@ -157,15 +158,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nama" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Ukuran" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Dimodifikasi" @@ -193,27 +194,27 @@ msgstr "Penanganan berkas" msgid "Maximum upload size" msgstr "Ukuran unggah maksimum" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "Kemungkinan maks:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Dibutuhkan untuk multi-berkas dan unduhan folder" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Aktifkan unduhan ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 adalah tidak terbatas" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Ukuran masukan maksimal untuk berkas ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "simpan" @@ -221,52 +222,48 @@ msgstr "simpan" msgid "New" msgstr "Baru" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Berkas teks" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Folder" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Unggah" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Batal mengunggah" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Tidak ada apa-apa di sini. Unggah sesuatu!" -#: templates/index.php:52 -msgid "Share" -msgstr "Bagikan" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Unduh" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Unggahan terlalu besar" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Berkas yang anda coba unggah melebihi ukuran maksimum untuk pengunggahan berkas di server ini." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Berkas sedang dipindai, silahkan tunggu." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Sedang memindai" diff --git a/l10n/it/files.po b/l10n/it/files.po index 6eccce4b06..b3a9a50b6f 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-23 23:07+0000\n" -"Last-Translator: Vincenzo Reale \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Non ci sono errori, file caricato con successo" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Il file caricato supera il valore upload_max_filesize in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Il file caricato supera il valore MAX_FILE_SIZE definito nel form HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Il file è stato parzialmente caricato" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nessun file è stato caricato" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Cartella temporanea mancante" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Scrittura su disco non riuscita" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "File" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Rimuovi condivisione" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Elimina" @@ -158,15 +159,15 @@ msgstr "{count} file analizzati" msgid "error while scanning" msgstr "errore durante la scansione" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nome" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Dimensione" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificato" @@ -194,27 +195,27 @@ msgstr "Gestione file" msgid "Maximum upload size" msgstr "Dimensione massima upload" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "numero mass.: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necessario per lo scaricamento di file multipli e cartelle." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Abilita scaricamento ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 è illimitato" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Dimensione massima per i file ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Salva" @@ -222,52 +223,48 @@ msgstr "Salva" msgid "New" msgstr "Nuovo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "File di testo" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Cartella" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Da collegamento" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Carica" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Annulla invio" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Non c'è niente qui. Carica qualcosa!" -#: templates/index.php:52 -msgid "Share" -msgstr "Condividi" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Scarica" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Il file caricato è troppo grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "I file che stai provando a caricare superano la dimensione massima consentita su questo server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Scansione dei file in corso, attendi" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Scansione corrente" diff --git a/l10n/it/settings.po b/l10n/it/settings.po index 2bee54a519..e79980dca1 100644 --- a/l10n/it/settings.po +++ b/l10n/it/settings.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-29 23:38+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -74,7 +74,7 @@ msgstr "Lingua modificata" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po index 3309dc415c..05c448fe95 100644 --- a/l10n/ja_JP/files.po +++ b/l10n/ja_JP/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 01:15+0000\n" -"Last-Translator: Daisuke Deguchi \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "エラーはありません。ファイルのアップロードは成功しました" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "アップロードされたファイルはphp.iniのupload_max_filesizeに設定されたサイズを超えています" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "アップロードされたファイルはHTMLのフォームに設定されたMAX_FILE_SIZEに設定されたサイズを超えています" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "ファイルは一部分しかアップロードされませんでした" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "ファイルはアップロードされませんでした" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "テンポラリフォルダが見つかりません" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "ディスクへの書き込みに失敗しました" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "ファイル" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "共有しない" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "削除" @@ -157,15 +158,15 @@ msgstr "{count} ファイルをスキャン" msgid "error while scanning" msgstr "スキャン中のエラー" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "名前" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "サイズ" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "更新日時" @@ -193,27 +194,27 @@ msgstr "ファイル操作" msgid "Maximum upload size" msgstr "最大アップロードサイズ" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "最大容量: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "複数ファイルおよびフォルダのダウンロードに必要" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP形式のダウンロードを有効にする" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0を指定した場合は無制限" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIPファイルへの最大入力サイズ" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "保存" @@ -221,52 +222,48 @@ msgstr "保存" msgid "New" msgstr "新規" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "テキストファイル" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "フォルダ" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "リンク" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "アップロード" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "アップロードをキャンセル" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "ここには何もありません。何かアップロードしてください。" -#: templates/index.php:52 -msgid "Share" -msgstr "共有" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "ダウンロード" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "ファイルサイズが大きすぎます" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "ファイルをスキャンしています、しばらくお待ちください。" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "スキャン中" diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po index 4d152b3fa4..c8c111d5d6 100644 --- a/l10n/ja_JP/settings.po +++ b/l10n/ja_JP/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 01:02+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +70,7 @@ msgstr "言語が変更されました" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "管理者は自身を管理者グループから削除できません。" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/ka_GE/files.po b/l10n/ka_GE/files.po index 4f49781aab..5e3078f504 100644 --- a/l10n/ka_GE/files.po +++ b/l10n/ka_GE/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "ატვირთული ფაილი აჭარბებს MAX_FILE_SIZE დირექტივას, რომელიც მითითებულია HTML ფორმაში" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "ატვირთული ფაილი მხოლოდ ნაწილობრივ აიტვირთა" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "ფაილი არ აიტვირთა" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "დროებითი საქაღალდე არ არსებობს" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "შეცდომა დისკზე ჩაწერისას" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "ფაილები" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "გაზიარების მოხსნა" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "წაშლა" @@ -155,15 +156,15 @@ msgstr "{count} ფაილი სკანირებულია" msgid "error while scanning" msgstr "შეცდომა სკანირებისას" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "სახელი" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "ზომა" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "შეცვლილია" @@ -191,27 +192,27 @@ msgstr "ფაილის დამუშავება" msgid "Maximum upload size" msgstr "მაქსიმუმ ატვირთის ზომა" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "მაქს. შესაძლებელი:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "საჭიროა მულტი ფაილ ან საქაღალდის ჩამოტვირთვა." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-Download–ის ჩართვა" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 is unlimited" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP ფაილების მაქსიმუმ დასაშვები ზომა" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "შენახვა" @@ -219,52 +220,48 @@ msgstr "შენახვა" msgid "New" msgstr "ახალი" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "ტექსტური ფაილი" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "საქაღალდე" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "ატვირთვა" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "ატვირთვის გაუქმება" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "აქ არაფერი არ არის. ატვირთე რამე!" -#: templates/index.php:52 -msgid "Share" -msgstr "გაზიარება" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "ჩამოტვირთვა" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "ასატვირთი ფაილი ძალიან დიდია" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "მიმდინარე სკანირება" diff --git a/l10n/ko/files.po b/l10n/ko/files.po index 130e47f86c..9e15a4f302 100644 --- a/l10n/ko/files.po +++ b/l10n/ko/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "업로드에 성공하였습니다." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "업로드한 파일이 php.ini에서 지정한 upload_max_filesize보다 더 큼" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "업로드한 파일이 HTML 문서에 지정한 MAX_FILE_SIZE보다 더 큼" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "파일이 부분적으로 업로드됨" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "업로드된 파일 없음" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "임시 폴더가 사라짐" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "디스크에 쓰지 못했습니다" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "파일" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "공유해제" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "삭제" @@ -157,15 +158,15 @@ msgstr "{count} 파일 스캔되었습니다." msgid "error while scanning" msgstr "스캔하는 도중 에러" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "이름" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "크기" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "수정됨" @@ -193,27 +194,27 @@ msgstr "파일 처리" msgid "Maximum upload size" msgstr "최대 업로드 크기" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "최대. 가능한:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "멀티 파일 및 폴더 다운로드에 필요." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP- 다운로드 허용" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0은 무제한 입니다" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP 파일에 대한 최대 입력 크기" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "저장" @@ -221,52 +222,48 @@ msgstr "저장" msgid "New" msgstr "새로 만들기" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "텍스트 파일" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "폴더" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "From link" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "업로드" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "업로드 취소" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "내용이 없습니다. 업로드할 수 있습니다!" -#: templates/index.php:52 -msgid "Share" -msgstr "공유" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "다운로드" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "업로드 용량 초과" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "파일을 검색중입니다, 기다려 주십시오." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "커런트 스캐닝" diff --git a/l10n/ku_IQ/files.po b/l10n/ku_IQ/files.po index c0defb5ff3..749a057b1c 100644 --- a/l10n/ku_IQ/files.po +++ b/l10n/ku_IQ/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "ناو" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "پاشکه‌وتکردن" @@ -218,52 +219,48 @@ msgstr "پاشکه‌وتکردن" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "بوخچه" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "بارکردن" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "داگرتن" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/lb/files.po b/l10n/lb/files.po index c7272f47c0..d4f89d14ea 100644 --- a/l10n/lb/files.po +++ b/l10n/lb/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Keen Feeler, Datei ass komplett ropgelueden ginn" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Déi ropgelueden Datei ass méi grouss wei d'upload_max_filesize Eegenschaft an der php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Et ass keng Datei ropgelueden ginn" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Et feelt en temporären Dossier" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Konnt net op den Disk schreiwen" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Dateien" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Läschen" @@ -155,15 +156,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Numm" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Gréisst" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Geännert" @@ -191,27 +192,27 @@ msgstr "Fichier handling" msgid "Maximum upload size" msgstr "Maximum Upload Gréisst " -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. méiglech:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Gett gebraucht fir multi-Fichier an Dossier Downloads." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-download erlaben" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 ass onlimitéiert" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maximal Gréisst fir ZIP Fichieren" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Späicheren" @@ -219,52 +220,48 @@ msgstr "Späicheren" msgid "New" msgstr "Nei" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Text Fichier" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dossier" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Eroplueden" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Upload ofbriechen" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Hei ass näischt. Lued eppes rop!" -#: templates/index.php:52 -msgid "Share" -msgstr "Share" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Eroflueden" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Upload ze grouss" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Fichieren gi gescannt, war weg." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Momentane Scan" diff --git a/l10n/lt_LT/files.po b/l10n/lt_LT/files.po index f8f471300e..ef30d7726c 100644 --- a/l10n/lt_LT/files.po +++ b/l10n/lt_LT/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Klaidų nėra, failas įkeltas sėkmingai" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Įkeliamo failo dydis viršija upload_max_filesize parametrą php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Įkeliamo failo dydis viršija MAX_FILE_SIZE parametrą, kuris yra nustatytas HTML formoje" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Failas buvo įkeltas tik dalinai" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nebuvo įkeltas nė vienas failas" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Nėra laikinojo katalogo" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Nepavyko įrašyti į diską" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Failai" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nebesidalinti" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Ištrinti" @@ -157,15 +158,15 @@ msgstr "{count} praskanuoti failai" msgid "error while scanning" msgstr "klaida skanuojant" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Pavadinimas" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Dydis" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Pakeista" @@ -193,27 +194,27 @@ msgstr "Failų tvarkymas" msgid "Maximum upload size" msgstr "Maksimalus įkeliamo failo dydis" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maks. galima:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Reikalinga daugybinui failų ir aplankalų atsisiuntimui." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Įjungti atsisiuntimą ZIP archyvu" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 yra neribotas" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimalus ZIP archyvo failo dydis" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Išsaugoti" @@ -221,52 +222,48 @@ msgstr "Išsaugoti" msgid "New" msgstr "Naujas" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Teksto failas" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Katalogas" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Įkelti" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Atšaukti siuntimą" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Čia tuščia. Įkelkite ką nors!" -#: templates/index.php:52 -msgid "Share" -msgstr "Dalintis" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Atsisiųsti" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Įkėlimui failas per didelis" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Skenuojami failai, prašome palaukti." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Šiuo metu skenuojama" diff --git a/l10n/lv/files.po b/l10n/lv/files.po index f14459f5d4..09760c280a 100644 --- a/l10n/lv/files.po +++ b/l10n/lv/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Viss kārtībā, augšupielāde veiksmīga" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Neviens fails netika augšuplādēts" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Trūkst pagaidu mapes" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Nav iespējams saglabāt" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Faili" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Pārtraukt līdzdalīšanu" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Izdzēst" @@ -156,15 +157,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nosaukums" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Izmērs" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Izmainīts" @@ -192,27 +193,27 @@ msgstr "Failu pārvaldība" msgid "Maximum upload size" msgstr "Maksimālais failu augšuplādes apjoms" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maksīmālais iespējamais:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Vajadzīgs vairāku failu un mapju lejuplādei" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Iespējot ZIP lejuplādi" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 ir neierobežots" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Saglabāt" @@ -220,52 +221,48 @@ msgstr "Saglabāt" msgid "New" msgstr "Jauns" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Teksta fails" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mape" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Augšuplādet" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Atcelt augšuplādi" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Te vēl nekas nav. Rīkojies, sāc augšuplādēt" -#: templates/index.php:52 -msgid "Share" -msgstr "Līdzdalīt" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Lejuplādēt" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Fails ir par lielu lai to augšuplādetu" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Jūsu augšuplādējamie faili pārsniedz servera pieļaujamo failu augšupielādes apjomu" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Faili šobrīd tiek caurskatīti, nedaudz jāpagaida." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Šobrīd tiek pārbaudīti" diff --git a/l10n/mk/files.po b/l10n/mk/files.po index 94552927a6..6ff0299222 100644 --- a/l10n/mk/files.po +++ b/l10n/mk/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Нема грешка, датотеката беше подигната успешно" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Подигнатата датотеката ја надминува MAX_FILE_SIZE директивата која беше поставена во HTML формата" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Датотеката беше само делумно подигната." -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Не беше подигната датотека" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Не постои привремена папка" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Неуспеав да запишам на диск" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Датотеки" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Избриши" @@ -157,15 +158,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Име" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Големина" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Променето" @@ -193,27 +194,27 @@ msgstr "Ракување со датотеки" msgid "Maximum upload size" msgstr "Максимална големина за подигање" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "макс. можно:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Потребно за симнување повеќе-датотеки и папки." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Овозможи ZIP симнување " -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 е неограничено" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Максимална големина за внес на ZIP датотеки" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Сними" @@ -221,52 +222,48 @@ msgstr "Сними" msgid "New" msgstr "Ново" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Текстуална датотека" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Папка" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Подигни" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Откажи прикачување" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Тука нема ништо. Снимете нешто!" -#: templates/index.php:52 -msgid "Share" -msgstr "Сподели" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Преземи" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Датотеката е премногу голема" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Се скенираат датотеки, ве молам почекајте." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Моментално скенирам" diff --git a/l10n/ms_MY/files.po b/l10n/ms_MY/files.po index a82fa33e2c..02844fd34d 100644 --- a/l10n/ms_MY/files.po +++ b/l10n/ms_MY/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Tiada ralat, fail berjaya dimuat naik." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Fail yang dimuat naik melebihi penyata upload_max_filesize dalam php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Fail yang dimuat naik melebihi MAX_FILE_SIZE yang dinyatakan dalam form HTML " -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Sebahagian daripada fail telah dimuat naik. " -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Tiada fail yang dimuat naik" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Folder sementara hilang" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Gagal untuk disimpan" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "fail" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Padam" @@ -158,15 +159,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nama " -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Saiz" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Dimodifikasi" @@ -194,27 +195,27 @@ msgstr "Pengendalian fail" msgid "Maximum upload size" msgstr "Saiz maksimum muat naik" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "maksimum:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Diperlukan untuk muatturun fail pelbagai " -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Aktifkan muatturun ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 adalah tanpa had" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Saiz maksimum input untuk fail ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Simpan" @@ -222,52 +223,48 @@ msgstr "Simpan" msgid "New" msgstr "Baru" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Fail teks" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Folder" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Muat naik" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Batal muat naik" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Tiada apa-apa di sini. Muat naik sesuatu!" -#: templates/index.php:52 -msgid "Share" -msgstr "Kongsi" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Muat turun" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Muat naik terlalu besar" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Fail sedang diimbas, harap bersabar." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Imbasan semasa" diff --git a/l10n/nb_NO/files.po b/l10n/nb_NO/files.po index 00340792cd..ad0cf919ea 100644 --- a/l10n/nb_NO/files.po +++ b/l10n/nb_NO/files.po @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -30,40 +30,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Det er ingen feil. Filen ble lastet opp." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Filstørrelsen overskrider maksgrensedirektivet upload_max_filesize i php.ini-konfigurasjonen." +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Filstørrelsen overskrider maksgrensen på MAX_FILE_SIZE som ble oppgitt i HTML-skjemaet" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Filopplastningen ble bare delvis gjennomført" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ingen fil ble lastet opp" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Mangler en midlertidig mappe" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Klarte ikke å skrive til disk" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Filer" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Avslutt deling" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Slett" @@ -162,15 +163,15 @@ msgstr "{count} filer lest inn" msgid "error while scanning" msgstr "feil under skanning" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Navn" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Størrelse" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Endret" @@ -198,27 +199,27 @@ msgstr "Filhåndtering" msgid "Maximum upload size" msgstr "Maksimum opplastingsstørrelse" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. mulige:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Nødvendig for å laste ned mapper og mer enn én fil om gangen." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Aktiver nedlasting av ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 er ubegrenset" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksimal størrelse på ZIP-filer" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Lagre" @@ -226,52 +227,48 @@ msgstr "Lagre" msgid "New" msgstr "Ny" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstfil" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mappe" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Last opp" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Avbryt opplasting" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Ingenting her. Last opp noe!" -#: templates/index.php:52 -msgid "Share" -msgstr "Del" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Last ned" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Opplasting for stor" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filene du prøver å laste opp er for store for å laste opp til denne serveren." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Skanner etter filer, vennligst vent." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Pågående skanning" diff --git a/l10n/nl/files.po b/l10n/nl/files.po index 3473a57fd9..dc5709b30f 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 08:05+0000\n" -"Last-Translator: Richard Bos \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,40 +32,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Geen fout opgetreden, bestand successvol geupload." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Het geüploade bestand is groter dan de upload_max_filesize instelling in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Het geüploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is opgegeven in de HTML-formulier" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Het bestand is slechts gedeeltelijk geupload" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Geen bestand geüpload" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Een tijdelijke map mist" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Schrijven naar schijf mislukt" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Bestanden" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Stop delen" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Verwijder" @@ -164,15 +165,15 @@ msgstr "{count} bestanden gescanned" msgid "error while scanning" msgstr "Fout tijdens het scannen" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Naam" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Bestandsgrootte" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Laatst aangepast" @@ -200,27 +201,27 @@ msgstr "Bestand" msgid "Maximum upload size" msgstr "Maximale bestandsgrootte voor uploads" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. mogelijk: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Nodig voor meerdere bestanden en mappen downloads." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Zet ZIP-download aan" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 is ongelimiteerd" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maximale grootte voor ZIP bestanden" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Opslaan" @@ -228,52 +229,48 @@ msgstr "Opslaan" msgid "New" msgstr "Nieuw" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekstbestand" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Map" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Vanaf link" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Upload" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Upload afbreken" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Er bevindt zich hier niets. Upload een bestand!" -#: templates/index.php:52 -msgid "Share" -msgstr "Delen" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Download" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Bestanden te groot" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Bestanden worden gescand, even wachten." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Er wordt gescand" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index 0e5722a6fe..e8fee6c901 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -10,15 +10,16 @@ # , 2011, 2012. # , 2012. # , 2011. +# , 2012. # , 2012. # Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 10:57+0000\n" +"Last-Translator: Len \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -76,7 +77,7 @@ msgstr "Taal aangepast" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Admins kunnen zichzelf niet uit de admin groep verwijderen" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/nn_NO/files.po b/l10n/nn_NO/files.po index 04aa8f58b6..4fb42612d8 100644 --- a/l10n/nn_NO/files.po +++ b/l10n/nn_NO/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ingen feil, fila vart lasta opp" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Den opplasta fila er større enn variabelen upload_max_filesize i php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Fila vart berre delvis lasta opp" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ingen filer vart lasta opp" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Manglar ei mellombels mappe" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Filer" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Slett" @@ -156,15 +157,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Namn" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Storleik" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Endra" @@ -192,27 +193,27 @@ msgstr "" msgid "Maximum upload size" msgstr "Maksimal opplastingsstorleik" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Lagre" @@ -220,52 +221,48 @@ msgstr "Lagre" msgid "New" msgstr "Ny" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tekst fil" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mappe" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Last opp" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Ingenting her. Last noko opp!" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Last ned" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "For stor opplasting" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filene du prøver å laste opp er større enn maksgrensa til denne tenaren." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/oc/files.po b/l10n/oc/files.po index b16d14fcb5..a433382c7c 100644 --- a/l10n/oc/files.po +++ b/l10n/oc/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Amontcargament capitat, pas d'errors" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Lo fichièr amontcargat es tròp bèl per la directiva «upload_max_filesize » del php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Lo fichièr amontcargat es mai gròs que la directiva «MAX_FILE_SIZE» especifiada dins lo formulari HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Lo fichièr foguèt pas completament amontcargat" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Cap de fichièrs son estats amontcargats" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Un dorsièr temporari manca" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "L'escriptura sul disc a fracassat" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fichièrs" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Non parteja" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Escafa" @@ -155,15 +156,15 @@ msgstr "" msgid "error while scanning" msgstr "error pendant l'exploracion" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nom" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Talha" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificat" @@ -191,27 +192,27 @@ msgstr "Manejament de fichièr" msgid "Maximum upload size" msgstr "Talha maximum d'amontcargament" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. possible: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Requesit per avalcargar gropat de fichièrs e dorsièr" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Activa l'avalcargament de ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 es pas limitat" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Talha maximum de dintrada per fichièrs ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Enregistra" @@ -219,52 +220,48 @@ msgstr "Enregistra" msgid "New" msgstr "Nòu" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Fichièr de tèxte" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dorsièr" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Amontcarga" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr " Anulla l'amontcargar" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Pas res dedins. Amontcarga qualquaren" -#: templates/index.php:52 -msgid "Share" -msgstr "Parteja" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Avalcarga" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Amontcargament tròp gròs" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Los fiichièrs son a èsser explorats, " -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Exploracion en cors" diff --git a/l10n/pl/files.po b/l10n/pl/files.po index 297b437139..1922ea7974 100644 --- a/l10n/pl/files.po +++ b/l10n/pl/files.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 05:59+0000\n" -"Last-Translator: Thomasso \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,40 +29,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Przesłano plik" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Rozmiar przesłanego pliku przekracza maksymalną wartość dyrektywy upload_max_filesize, zawartą w pliku php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Rozmiar przesłanego pliku przekracza maksymalną wartość dyrektywy upload_max_filesize, zawartą formularzu HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Plik przesłano tylko częściowo" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nie przesłano żadnego pliku" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Brak katalogu tymczasowego" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Błąd zapisu na dysk" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Pliki" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nie udostępniaj" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Usuwa element" @@ -161,15 +162,15 @@ msgstr "{count} pliki skanowane" msgid "error while scanning" msgstr "Wystąpił błąd podczas skanowania" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nazwa" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Rozmiar" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Czas modyfikacji" @@ -197,27 +198,27 @@ msgstr "Zarządzanie plikami" msgid "Maximum upload size" msgstr "Maksymalny rozmiar wysyłanego pliku" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. możliwych" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Wymagany do pobierania wielu plików i folderów" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Włącz pobieranie ZIP-paczki" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 jest nielimitowane" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Maksymalna wielkość pliku wejściowego ZIP " -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Zapisz" @@ -225,52 +226,48 @@ msgstr "Zapisz" msgid "New" msgstr "Nowy" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Plik tekstowy" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Katalog" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Z linku" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Prześlij" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Przestań wysyłać" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Brak zawartości. Proszę wysłać pliki!" -#: templates/index.php:52 -msgid "Share" -msgstr "Współdziel" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Pobiera element" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Wysyłany plik ma za duży rozmiar" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Pliki które próbujesz przesłać, przekraczają maksymalną, dopuszczalną wielkość." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Skanowanie plików, proszę czekać." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Aktualnie skanowane" diff --git a/l10n/pl_PL/files.po b/l10n/pl_PL/files.po index a8b37951e1..2e1909d5c9 100644 --- a/l10n/pl_PL/files.po +++ b/l10n/pl_PL/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Zapisz" @@ -218,52 +219,48 @@ msgstr "Zapisz" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po index 8a4dc474a0..81bc23bfb9 100644 --- a/l10n/pt_BR/files.po +++ b/l10n/pt_BR/files.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:01+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -29,40 +29,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Não houve nenhum erro, o arquivo foi transferido com sucesso" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "O tamanho do arquivo excede o limed especifiicado em upload_max_filesize no php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "O arquivo carregado excede o MAX_FILE_SIZE que foi especificado no formulário HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "O arquivo foi transferido parcialmente" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nenhum arquivo foi transferido" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Pasta temporária não encontrada" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Falha ao escrever no disco" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Arquivos" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Descompartilhar" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Excluir" @@ -161,15 +162,15 @@ msgstr "{count} arquivos scaneados" msgid "error while scanning" msgstr "erro durante verificação" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nome" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamanho" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificado" @@ -197,27 +198,27 @@ msgstr "Tratamento de Arquivo" msgid "Maximum upload size" msgstr "Tamanho máximo para carregar" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. possível:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necessário para multiplos arquivos e diretório de downloads." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Habilitar ZIP-download" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 para ilimitado" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Tamanho máximo para arquivo ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Salvar" @@ -225,52 +226,48 @@ msgstr "Salvar" msgid "New" msgstr "Novo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Arquivo texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Pasta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Do link" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Carregar" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancelar upload" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nada aqui.Carrege alguma coisa!" -#: templates/index.php:52 -msgid "Share" -msgstr "Compartilhar" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Baixar" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Arquivo muito grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Arquivos sendo escaneados, por favor aguarde." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Scanning atual" diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index a9d8bb471e..ffcda156bf 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 15:29+0000\n" -"Last-Translator: Mouxy \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,40 +27,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Sem erro, ficheiro enviado com sucesso" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "O ficheiro enviado excede a directiva upload_max_filesize no php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "O ficheiro enviado excede o diretivo MAX_FILE_SIZE especificado no formulário HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "O ficheiro enviado só foi enviado parcialmente" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Não foi enviado nenhum ficheiro" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Falta uma pasta temporária" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Falhou a escrita no disco" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Deixar de partilhar" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Apagar" @@ -159,15 +160,15 @@ msgstr "{count} ficheiros analisados" msgid "error while scanning" msgstr "erro ao analisar" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nome" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Tamanho" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificado" @@ -195,27 +196,27 @@ msgstr "Manuseamento de ficheiros" msgid "Maximum upload size" msgstr "Tamanho máximo de envio" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. possivel: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necessário para descarregamento múltiplo de ficheiros e pastas" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Permitir descarregar em ficheiro ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 é ilimitado" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Tamanho máximo para ficheiros ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Guardar" @@ -223,52 +224,48 @@ msgstr "Guardar" msgid "New" msgstr "Novo" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Ficheiro de texto" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Pasta" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Da ligação" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Enviar" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Cancelar envio" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Vazio. Envie alguma coisa!" -#: templates/index.php:52 -msgid "Share" -msgstr "Partilhar" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Transferir" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Envio muito grande" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Os ficheiros que está a tentar enviar excedem o tamanho máximo de envio permitido neste servidor." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Os ficheiros estão a ser analisados, por favor aguarde." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Análise actual" diff --git a/l10n/pt_PT/settings.po b/l10n/pt_PT/settings.po index 7715ed8c92..71e00dc5a0 100644 --- a/l10n/pt_PT/settings.po +++ b/l10n/pt_PT/settings.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Duarte Velez Grilo , 2012. # , 2012. # Helder Meneses , 2012. @@ -11,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 01:44+0000\n" +"Last-Translator: Mouxy \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -71,7 +72,7 @@ msgstr "Idioma alterado" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Os administradores não se podem remover a eles mesmos do grupo admin." #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/ro/files.po b/l10n/ro/files.po index bd191bd7f6..a1bd981cb9 100644 --- a/l10n/ro/files.po +++ b/l10n/ro/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Nicio eroare, fișierul a fost încărcat cu succes" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Fișierul are o dimensiune mai mare decât cea specificată în variabila upload_max_filesize din php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Fișierul a fost încărcat doar parțial" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Niciun fișier încărcat" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Lipsește un dosar temporar" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Eroare la scriere pe disc" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fișiere" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Anulează partajarea" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Șterge" @@ -158,15 +159,15 @@ msgstr "" msgid "error while scanning" msgstr "eroare la scanarea" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Nume" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Dimensiune" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Modificat" @@ -194,27 +195,27 @@ msgstr "Manipulare fișiere" msgid "Maximum upload size" msgstr "Dimensiune maximă admisă la încărcare" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. posibil:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Necesar pentru descărcarea mai multor fișiere și a dosarelor" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Activează descărcare fișiere compresate" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 e nelimitat" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Dimensiunea maximă de intrare pentru fișiere compresate" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Salvare" @@ -222,52 +223,48 @@ msgstr "Salvare" msgid "New" msgstr "Nou" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Fișier text" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Dosar" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Încarcă" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Anulează încărcarea" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Nimic aici. Încarcă ceva!" -#: templates/index.php:52 -msgid "Share" -msgstr "Partajează" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Descarcă" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Fișierul încărcat este prea mare" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Fișierele sunt scanate, te rog așteptă." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "În curs de scanare" diff --git a/l10n/ru/files.po b/l10n/ru/files.po index bb7209b951..e15399b83d 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -16,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 16:49+0000\n" -"Last-Translator: mPolr \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,40 +31,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Файл успешно загружен" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Файл превышает допустимые размеры (описаны как upload_max_filesize в php.ini)" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Файл превышает размер MAX_FILE_SIZE, указаный в HTML-форме" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Файл был загружен не полностью" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Файл не был загружен" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Невозможно найти временную папку" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Ошибка записи на диск" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Файлы" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Отменить публикацию" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Удалить" @@ -163,15 +164,15 @@ msgstr "{count} файлов просканировано" msgid "error while scanning" msgstr "ошибка во время санирования" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Название" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Размер" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Изменён" @@ -199,27 +200,27 @@ msgstr "Управление файлами" msgid "Maximum upload size" msgstr "Максимальный размер загружаемого файла" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "макс. возможно: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Требуется для скачивания нескольких файлов и папок" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Включить ZIP-скачивание" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 - без ограничений" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Максимальный исходный размер для ZIP файлов" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Сохранить" @@ -227,52 +228,48 @@ msgstr "Сохранить" msgid "New" msgstr "Новый" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Текстовый файл" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Папка" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Из ссылки" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Загрузить" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Отмена загрузки" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Здесь ничего нет. Загрузите что-нибудь!" -#: templates/index.php:52 -msgid "Share" -msgstr "Опубликовать" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Скачать" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Файл слишком большой" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Файлы, которые Вы пытаетесь загрузить, превышают лимит для файлов на этом сервере." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Подождите, файлы сканируются." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Текущее сканирование" diff --git a/l10n/ru_RU/files.po b/l10n/ru_RU/files.po index a2b13fb41d..b330223c8c 100644 --- a/l10n/ru_RU/files.po +++ b/l10n/ru_RU/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 06:47+0000\n" -"Last-Translator: AnnaSch \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Ошибка отсутствует, файл загружен успешно." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Размер загруженного файла превышает заданный в директиве upload_max_filesize в php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Размер загруженного" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Загружаемый файл был загружен частично" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Файл не был загружен" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Отсутствует временная папка" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Не удалось записать на диск" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Файлы" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Скрыть" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Удалить" @@ -156,15 +157,15 @@ msgstr "{количество} файлов отсканировано" msgid "error while scanning" msgstr "ошибка при сканировании" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Имя" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Размер" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Изменен" @@ -192,27 +193,27 @@ msgstr "Работа с файлами" msgid "Maximum upload size" msgstr "Максимальный размер загружаемого файла" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "Максимально возможный" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Необходимо для множественной загрузки." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Включение ZIP-загрузки" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 без ограничений" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Максимальный размер входящих ZIP-файлов " -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Сохранить" @@ -220,52 +221,48 @@ msgstr "Сохранить" msgid "New" msgstr "Новый" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Текстовый файл" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Папка" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "По ссылке" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Загрузить " -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Отмена загрузки" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Здесь ничего нет. Загрузите что-нибудь!" -#: templates/index.php:52 -msgid "Share" -msgstr "Сделать общим" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Загрузить" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Загрузка слишком велика" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Размер файлов, которые Вы пытаетесь загрузить, превышает максимально допустимый размер для загрузки на данный сервер." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Файлы сканируются, пожалуйста, подождите." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Текущее сканирование" diff --git a/l10n/si_LK/files.po b/l10n/si_LK/files.po index be2b925353..0f0bb6776b 100644 --- a/l10n/si_LK/files.po +++ b/l10n/si_LK/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "නිවැරදි ව ගොනුව උඩුගත කෙරිනි" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "php.ini හි upload_max_filesize නියමයට වඩා උඩුගත කළ ගොනුව විශාලයි" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "උඩුගත කළ ගොනුවේ විශාලත්වය HTML පෝරමයේ නියම කළ ඇති MAX_FILE_SIZE විශාලත්වයට වඩා වැඩිය" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "උඩුගත කළ ගොනුවේ කොටසක් පමණක් උඩුගත විය" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "කිසිදු ගොනවක් උඩුගත නොවිනි" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "තාවකාලික ෆොල්ඩරයක් සොයාගත නොහැක" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "තැටිගත කිරීම අසාර්ථකයි" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "ගොනු" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "නොබෙදු" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "මකන්න" @@ -156,15 +157,15 @@ msgstr "" msgid "error while scanning" msgstr "පරීක්ෂා කිරීමේදී දෝෂයක්" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "නම" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "ප්‍රමාණය" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "වෙනස් කළ" @@ -192,27 +193,27 @@ msgstr "ගොනු පරිහරණය" msgid "Maximum upload size" msgstr "උඩුගත කිරීමක උපරිම ප්‍රමාණය" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "හැකි උපරිමය:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "බහු-ගොනු හා ෆොල්ඩර බාගත කිරීමට අවශ්‍යයි" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP-බාගත කිරීම් සක්‍රිය කරන්න" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 යනු සීමාවක් නැති බවය" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP ගොනු සඳහා දැමිය හැකි උපරිම විශාලතවය" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "සුරකින්න" @@ -220,52 +221,48 @@ msgstr "සුරකින්න" msgid "New" msgstr "නව" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "පෙළ ගොනුව" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "ෆෝල්ඩරය" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "යොමුවෙන්" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "උඩුගත කිරීම" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "උඩුගත කිරීම අත් හරින්න" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න" -#: templates/index.php:52 -msgid "Share" -msgstr "බෙදාහදාගන්න" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "බාගත කිරීම" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "උඩුගත කිරීම විශාල වැඩිය" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "වර්තමාන පරික්ෂාව" diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po index 5818cd909b..ecb1b98c08 100644 --- a/l10n/sk_SK/files.po +++ b/l10n/sk_SK/files.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Nenastala žiadna chyba, súbor bol úspešne nahraný" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Nahraný súbor presiahol direktívu upload_max_filesize v php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Nahrávaný súbor presiahol MAX_FILE_SIZE direktívu, ktorá bola špecifikovaná v HTML formulári" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Nahrávaný súbor bol iba čiastočne nahraný" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Žiaden súbor nebol nahraný" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Chýbajúci dočasný priečinok" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Zápis na disk sa nepodaril" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Súbory" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Nezdielať" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Odstrániť" @@ -157,15 +158,15 @@ msgstr "{count} súborov prehľadaných" msgid "error while scanning" msgstr "chyba počas kontroly" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Meno" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Veľkosť" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Upravené" @@ -193,27 +194,27 @@ msgstr "Nastavenie správanie k súborom" msgid "Maximum upload size" msgstr "Maximálna veľkosť odosielaného súboru" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "najväčšie možné:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Vyžadované pre sťahovanie viacerých súborov a adresárov." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Povoliť sťahovanie ZIP súborov" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 znamená neobmedzené" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Najväčšia veľkosť ZIP súborov" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Uložiť" @@ -221,52 +222,48 @@ msgstr "Uložiť" msgid "New" msgstr "Nový" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Textový súbor" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Priečinok" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Z odkazu" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Odoslať" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Zrušiť odosielanie" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Žiadny súbor. Nahrajte niečo!" -#: templates/index.php:52 -msgid "Share" -msgstr "Zdielať" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Stiahnuť" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Odosielaný súbor je príliš veľký" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Čakajte, súbory sú prehľadávané." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Práve prehliadané" diff --git a/l10n/sl/files.po b/l10n/sl/files.po index 0548027dda..7b4024e231 100644 --- a/l10n/sl/files.po +++ b/l10n/sl/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 11:33+0000\n" -"Last-Translator: Peter Peroša \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Datoteka je uspešno naložena brez napak." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Datoteka je le delno naložena" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nobena datoteka ni bila naložena" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Manjka začasna mapa" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Pisanje na disk je spodletelo" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Odstrani iz souporabe" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Izbriši" @@ -158,15 +159,15 @@ msgstr "{count} files scanned" msgid "error while scanning" msgstr "napaka med pregledovanjem datotek" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Ime" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Velikost" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Spremenjeno" @@ -194,27 +195,27 @@ msgstr "Upravljanje z datotekami" msgid "Maximum upload size" msgstr "Največja velikost za pošiljanja" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "največ mogoče:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Uporabljeno za prenos več datotek in map." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Omogoči prejemanje arhivov ZIP" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 je neskončno" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Največja vhodna velikost za datoteke ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Shrani" @@ -222,52 +223,48 @@ msgstr "Shrani" msgid "New" msgstr "Nova" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Besedilna datoteka" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mapa" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Iz povezave" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Pošlji" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Prekliči pošiljanje" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Tukaj ni ničesar. Naložite kaj!" -#: templates/index.php:52 -msgid "Share" -msgstr "Souporaba" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Prejmi" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Nalaganje ni mogoče, ker je preveliko" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Poteka preučevanje datotek, počakajte ..." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Trenutno poteka preučevanje" diff --git a/l10n/sq/files.po b/l10n/sq/files.po index ef9e0bd116..c3bd0a6325 100644 --- a/l10n/sq/files.po +++ b/l10n/sq/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2011-08-13 02:19+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "" @@ -218,52 +219,48 @@ msgstr "" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/sr/files.po b/l10n/sr/files.po index 9680cc0fa4..78494e11d2 100644 --- a/l10n/sr/files.po +++ b/l10n/sr/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Нема грешке, фајл је успешно послат" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Послати фајл превазилази директиву upload_max_filesize из " +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Послати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Послати фајл је само делимично отпремљен!" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ниједан фајл није послат" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Недостаје привремена фасцикла" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Није успело записивање на диск" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Фајлови" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Укини дељење" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Обриши" @@ -156,15 +157,15 @@ msgstr "{count} датотека се скенира" msgid "error while scanning" msgstr "грешка у скенирању" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Име" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Величина" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Задња измена" @@ -192,27 +193,27 @@ msgstr "Рад са датотекама" msgid "Maximum upload size" msgstr "Максимална величина пошиљке" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "макс. величина:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Неопходно за вишеструко преузимања датотека и директоријума." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Укључи преузимање у ЗИП-у" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 је неограничено" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Максимална величина ЗИП датотека" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Сними" @@ -220,52 +221,48 @@ msgstr "Сними" msgid "New" msgstr "Нови" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "текстуални фајл" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "фасцикла" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Са линка" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Пошаљи" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Прекини слање" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Овде нема ничег. Пошаљите нешто!" -#: templates/index.php:52 -msgid "Share" -msgstr "Дељење" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Преузми" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Пошиљка је превелика" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Скенирање датотека у току, молим вас сачекајте." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Тренутно се скенира" diff --git a/l10n/sr@latin/files.po b/l10n/sr@latin/files.po index c74c47a242..fbaee12094 100644 --- a/l10n/sr@latin/files.po +++ b/l10n/sr@latin/files.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Nema greške, fajl je uspešno poslat" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Poslati fajl prevazilazi direktivu upload_max_filesize iz " +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Poslati fajl prevazilazi direktivu MAX_FILE_SIZE koja je navedena u HTML formi" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Poslati fajl je samo delimično otpremljen!" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Nijedan fajl nije poslat" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Nedostaje privremena fascikla" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Fajlovi" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Obriši" @@ -155,15 +156,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Ime" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Veličina" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Zadnja izmena" @@ -191,27 +192,27 @@ msgstr "" msgid "Maximum upload size" msgstr "Maksimalna veličina pošiljke" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Snimi" @@ -219,52 +220,48 @@ msgstr "Snimi" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Pošalji" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Ovde nema ničeg. Pošaljite nešto!" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Preuzmi" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Pošiljka je prevelika" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/sv/files.po b/l10n/sv/files.po index 9d03aae199..ed4860b71c 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 10:00+0000\n" -"Last-Translator: Magnus Höglund \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,40 +28,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Inga fel uppstod. Filen laddades upp utan problem" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-formulär" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Den uppladdade filen var endast delvis uppladdad" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Ingen fil blev uppladdad" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Saknar en tillfällig mapp" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Misslyckades spara till disk" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Filer" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Sluta dela" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Radera" @@ -160,15 +161,15 @@ msgstr "{count} filer skannade" msgid "error while scanning" msgstr "fel vid skanning" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Namn" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Storlek" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Ändrad" @@ -196,27 +197,27 @@ msgstr "Filhantering" msgid "Maximum upload size" msgstr "Maximal storlek att ladda upp" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "max. möjligt:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Krävs för nerladdning av flera mappar och filer." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Aktivera ZIP-nerladdning" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 är oändligt" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Största tillåtna storlek för ZIP-filer" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Spara" @@ -224,52 +225,48 @@ msgstr "Spara" msgid "New" msgstr "Ny" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Textfil" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Mapp" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Från länk" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Ladda upp" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Avbryt uppladdning" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Ingenting här. Ladda upp något!" -#: templates/index.php:52 -msgid "Share" -msgstr "Dela" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Ladda ner" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "För stor uppladdning" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Filer skannas, var god vänta" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Aktuell skanning" diff --git a/l10n/ta_LK/files.po b/l10n/ta_LK/files.po index 8305b7c9cd..b6abb44c84 100644 --- a/l10n/ta_LK/files.po +++ b/l10n/ta_LK/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 16:24+0000\n" -"Last-Translator: suganthi \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,40 +23,41 @@ msgid "There is no error, the file uploaded with success" msgstr "இங்கு வழு இல்லை, கோப்பு வெற்றிகரமாக பதிவேற்றப்பட்டது" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "பதிவேற்றப்பட்ட கோப்பானது php.ini இலுள்ள upload_max_filesize directive ஐ விட கூடியது" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "பதிவேற்றப்பட்ட கோப்பானது HTML படிவத்தில் குறிப்பிடப்பட்டுள்ள MAX_FILE_SIZE directive ஐ விட கூடியது" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "பதிவேற்றப்பட்ட கோப்பானது பகுதியாக மட்டுமே பதிவேற்றப்பட்டுள்ளது" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "எந்த கோப்பும் பதிவேற்றப்படவில்லை" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "ஒரு தற்காலிகமான கோப்புறையை காணவில்லை" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "வட்டில் எழுத முடியவில்லை" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "கோப்புகள்" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "பகிரப்படாதது" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "அழிக்க" @@ -155,15 +156,15 @@ msgstr "{எண்ணிக்கை} கோப்புகள் வருட msgid "error while scanning" msgstr "வருடும் போதான வழு" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "பெயர்" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "அளவு" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "மாற்றப்பட்டது" @@ -191,27 +192,27 @@ msgstr "கோப்பு கையாளுதல்" msgid "Maximum upload size" msgstr "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு " -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "ஆகக் கூடியது:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "பல்வேறுப்பட்ட கோப்பு மற்றும் கோப்புறைகளை பதிவிறக்க தேவையானது." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP பதிவிறக்கலை இயலுமைப்படுத்துக" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 ஆனது எல்லையற்றது" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP கோப்புகளுக்கான ஆகக்கூடிய உள்ளீட்டு அளவு" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "சேமிக்க" @@ -219,52 +220,48 @@ msgstr "சேமிக்க" msgid "New" msgstr "புதிய" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "கோப்பு உரை" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "கோப்புறை" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "இணைப்பிலிருந்து" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "பதிவேற்றுக" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "பதிவேற்றலை இரத்து செய்க" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!" -#: templates/index.php:52 -msgid "Share" -msgstr "பகிர்வு" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "பதிவிறக்குக" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "பதிவேற்றல் மிகப்பெரியது" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "தற்போது வருடப்படுபவை" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index c11e349653..64fece6702 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 34cbc56b99..a37da4454f 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "" @@ -218,52 +219,48 @@ msgstr "" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 671ac58fae..8e96b98b4b 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index f45e2a0b62..bc0874342a 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 08b3c4b150..8dcff2d1b0 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 389791e802..f79ee5820a 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 95ba212816..d6fae106b3 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 7655ed9aab..f0593c89ad 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 5c227f23f1..c2a7ecb596 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 258f694f4c..eceaeea9dc 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/files.po b/l10n/th_TH/files.po index e9b988f70b..63252d6067 100644 --- a/l10n/th_TH/files.po +++ b/l10n/th_TH/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 01:43+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "ไม่มีข้อผิดพลาดใดๆ ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "ไฟล์ที่อัพโหลดมีขนาดเกินคำสั่ง upload_max_filesize ที่ระบุเอาไว้ในไฟล์ php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "ไฟล์ที่อัพโหลดมีขนาดเกินคำสั่ง MAX_FILE_SIZE ที่ระบุเอาไว้ในรูปแบบคำสั่งในภาษา HTML" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "ไฟล์ที่อัพโหลดยังไม่ได้ถูกอัพโหลดอย่างสมบูรณ์" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "ยังไม่มีไฟล์ที่ถูกอัพโหลด" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "แฟ้มเอกสารชั่วคราวเกิดการสูญหาย" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "ไฟล์" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "ยกเลิกการแชร์ข้อมูล" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "ลบ" @@ -156,15 +157,15 @@ msgstr "สแกนไฟล์แล้ว {count} ไฟล์" msgid "error while scanning" msgstr "พบข้อผิดพลาดในระหว่างการสแกนไฟล์" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "ชื่อ" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "ขนาด" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "ปรับปรุงล่าสุด" @@ -192,27 +193,27 @@ msgstr "การจัดกาไฟล์" msgid "Maximum upload size" msgstr "ขนาดไฟล์สูงสุดที่อัพโหลดได้" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "จำนวนสูงสุดที่สามารถทำได้: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "จำเป็นต้องใช้สำหรับการดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์หรือดาวน์โหลดทั้งโฟลเดอร์" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "อนุญาตให้ดาวน์โหลดเป็นไฟล์ ZIP ได้" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 หมายถึงไม่จำกัด" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ขนาดไฟล์ ZIP สูงสุด" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "บันทึก" @@ -220,52 +221,48 @@ msgstr "บันทึก" msgid "New" msgstr "อัพโหลดไฟล์ใหม่" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "ไฟล์ข้อความ" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "แฟ้มเอกสาร" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "จากลิงก์" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "อัพโหลด" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "ยกเลิกการอัพโหลด" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!" -#: templates/index.php:52 -msgid "Share" -msgstr "แชร์" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "ดาวน์โหลด" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "ไฟล์ที่กำลังสแกนอยู่ขณะนี้" diff --git a/l10n/tr/files.po b/l10n/tr/files.po index b3be208531..de74837363 100644 --- a/l10n/tr/files.po +++ b/l10n/tr/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Bir hata yok, dosya başarıyla yüklendi" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Yüklenen dosya php.ini de belirtilen upload_max_filesize sınırını aşıyor" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Yüklenen dosya HTML formundaki MAX_FILE_SIZE sınırını aşıyor" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Yüklenen dosyanın sadece bir kısmı yüklendi" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Hiç dosya yüklenmedi" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Geçici bir klasör eksik" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Diske yazılamadı" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Dosyalar" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Paylaşılmayan" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Sil" @@ -158,15 +159,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Ad" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Boyut" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Değiştirilme" @@ -194,27 +195,27 @@ msgstr "Dosya taşıma" msgid "Maximum upload size" msgstr "Maksimum yükleme boyutu" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "mümkün olan en fazla: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Çoklu dosya ve dizin indirmesi için gerekli." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "ZIP indirmeyi aktif et" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 limitsiz demektir" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP dosyaları için en fazla girdi sayısı" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Kaydet" @@ -222,52 +223,48 @@ msgstr "Kaydet" msgid "New" msgstr "Yeni" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Metin dosyası" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Klasör" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Yükle" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Yüklemeyi iptal et" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Burada hiçbir şey yok. Birşeyler yükleyin!" -#: templates/index.php:52 -msgid "Share" -msgstr "Paylaş" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "İndir" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Yüklemeniz çok büyük" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Dosyalar taranıyor, lütfen bekleyin." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Güncel tarama" diff --git a/l10n/uk/files.po b/l10n/uk/files.po index 3c75939887..04e2e33d5e 100644 --- a/l10n/uk/files.po +++ b/l10n/uk/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 15:33+0000\n" -"Last-Translator: skoptev \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,40 +25,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Файл успішно відвантажено без помилок." #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Розмір відвантаженого файлу перевищує директиву upload_max_filesize в php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Розмір відвантаженого файлу перевищує директиву MAX_FILE_SIZE вказану в HTML формі" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Файл відвантажено лише частково" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Не відвантажено жодного файлу" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Відсутній тимчасовий каталог" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Невдалося записати на диск" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Файли" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Заборонити доступ" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Видалити" @@ -157,15 +158,15 @@ msgstr "{count} файлів проскановано" msgid "error while scanning" msgstr "помилка при скануванні" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Ім'я" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Розмір" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Змінено" @@ -193,27 +194,27 @@ msgstr "Робота з файлами" msgid "Maximum upload size" msgstr "Максимальний розмір відвантажень" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "макс.можливе:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Необхідно для мульти-файлового та каталогового завантаження." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Активувати ZIP-завантаження" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 є безліміт" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Максимальний розмір завантажуємого ZIP файлу" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Зберегти" @@ -221,52 +222,48 @@ msgstr "Зберегти" msgid "New" msgstr "Створити" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Текстовий файл" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Папка" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "З посилання" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Відвантажити" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Перервати завантаження" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Тут нічого немає. Відвантажте що-небудь!" -#: templates/index.php:52 -msgid "Share" -msgstr "Поділитися" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Завантажити" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Файл занадто великий" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Файли скануються, зачекайте, будь-ласка." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Поточне сканування" diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po index ddc95e11c4..85fd27ccf8 100644 --- a/l10n/uk/settings.po +++ b/l10n/uk/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 09:53+0000\n" +"Last-Translator: volodya327 \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -69,7 +69,7 @@ msgstr "Мова змінена" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Адміністратор не може видалити себе з групи адмінів" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/vi/files.po b/l10n/vi/files.po index 7e32322143..2427e237de 100644 --- a/l10n/vi/files.po +++ b/l10n/vi/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 03:19+0000\n" -"Last-Translator: mattheu_9x \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "Không có lỗi, các tập tin đã được tải lên thành công" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "Những tập tin được tải lên vượt quá upload_max_filesize được chỉ định trong php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "Kích thước những tập tin tải lên vượt quá MAX_FILE_SIZE đã được quy định" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "Tập tin tải lên mới chỉ tải lên được một phần" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "Không có tập tin nào được tải lên" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "Không tìm thấy thư mục tạm" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "Không thể ghi " -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "Tập tin" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "Không chia sẽ" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "Xóa" @@ -158,15 +159,15 @@ msgstr "{count} tập tin đã được quét" msgid "error while scanning" msgstr "lỗi trong khi quét" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "Tên" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "Kích cỡ" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "Thay đổi" @@ -194,27 +195,27 @@ msgstr "Xử lý tập tin" msgid "Maximum upload size" msgstr "Kích thước tối đa " -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "tối đa cho phép:" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "Cần thiết cho tải nhiều tập tin và thư mục." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "Cho phép ZIP-download" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 là không giới hạn" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "Kích thước tối đa cho các tập tin ZIP" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "Lưu" @@ -222,52 +223,48 @@ msgstr "Lưu" msgid "New" msgstr "Mới" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "Tập tin văn bản" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "Thư mục" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "Từ liên kết" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "Tải lên" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "Hủy upload" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "Không có gì ở đây .Hãy tải lên một cái gì đó !" -#: templates/index.php:52 -msgid "Share" -msgstr "Chia sẻ" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "Tải xuống" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "Tập tin tải lên quá lớn" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ ." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "Tập tin đang được quét ,vui lòng chờ." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "Hiện tại đang quét" diff --git a/l10n/vi/settings.po b/l10n/vi/settings.po index b9e4316242..7fb46b1f6a 100644 --- a/l10n/vi/settings.po +++ b/l10n/vi/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-29 23:17+0000\n" +"Last-Translator: mattheu_9x \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -73,7 +73,7 @@ msgstr "Ngôn ngữ đã được thay đổi" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/zh_CN.GB2312/files.po b/l10n/zh_CN.GB2312/files.po index 6439e83d1d..7c74914a97 100644 --- a/l10n/zh_CN.GB2312/files.po +++ b/l10n/zh_CN.GB2312/files.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" @@ -24,40 +24,41 @@ msgid "There is no error, the file uploaded with success" msgstr "没有任何错误,文件上传成功了" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "上传的文件超过了php.ini指定的upload_max_filesize" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "上传的文件超过了HTML表单指定的MAX_FILE_SIZE" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "文件只有部分被上传" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "没有上传完成的文件" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "丢失了一个临时文件夹" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "写磁盘失败" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "文件" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "取消共享" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "删除" @@ -156,15 +157,15 @@ msgstr "{count} 个文件已扫描" msgid "error while scanning" msgstr "扫描出错" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "名字" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "大小" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "修改日期" @@ -192,27 +193,27 @@ msgstr "文件处理中" msgid "Maximum upload size" msgstr "最大上传大小" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "最大可能" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "需要多文件和文件夹下载." -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "支持ZIP下载" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0是无限的" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "最大的ZIP文件输入大小" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "保存" @@ -220,52 +221,48 @@ msgstr "保存" msgid "New" msgstr "新建" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "文本文档" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "文件夹" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "来自链接" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "上传" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "取消上传" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "这里没有东西.上传点什么!" -#: templates/index.php:52 -msgid "Share" -msgstr "分享" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "下载" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "上传的文件太大了" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "你正在试图上传的文件超过了此服务器支持的最大的文件大小." -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "正在扫描文件,请稍候." -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "正在扫描" diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index e55a10f86e..d92d087c66 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-25 00:02+0100\n" -"PO-Revision-Date: 2012-11-24 10:07+0000\n" -"Last-Translator: Dianjin Wang <1132321739qq@gmail.com>\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,40 +27,41 @@ msgid "There is no error, the file uploaded with success" msgstr "没有发生错误,文件上传成功。" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "上传的文件大小超过了php.ini 中指定的upload_max_filesize" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "上传的文件超过了在HTML 表单中指定的MAX_FILE_SIZE" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "只上传了文件的一部分" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "文件没有上传" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "缺少临时目录" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "写入磁盘失败" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "文件" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "取消分享" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "删除" @@ -159,15 +160,15 @@ msgstr "{count} 个文件已扫描。" msgid "error while scanning" msgstr "扫描时出错" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "名称" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "大小" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "修改日期" @@ -195,27 +196,27 @@ msgstr "文件处理" msgid "Maximum upload size" msgstr "最大上传大小" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "最大允许: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "多文件和文件夹下载需要此项。" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "启用 ZIP 下载" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0 为无限制" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "ZIP 文件的最大输入大小" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "保存" @@ -223,52 +224,48 @@ msgstr "保存" msgid "New" msgstr "新建" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "文本文件" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "文件夹" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "来自链接" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "上传" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "取消上传" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "这里还什么都没有。上传些东西吧!" -#: templates/index.php:52 -msgid "Share" -msgstr "共享" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "下载" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "上传文件过大" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "您正尝试上传的文件超过了此服务器可以上传的最大容量限制" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "文件正在被扫描,请稍候。" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "当前扫描" diff --git a/l10n/zh_HK/files.po b/l10n/zh_HK/files.po index 12b52971df..c45ea5afdd 100644 --- a/l10n/zh_HK/files.po +++ b/l10n/zh_HK/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "" @@ -218,52 +219,48 @@ msgstr "" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/l10n/zh_TW/files.po b/l10n/zh_TW/files.po index e204660689..4e18f07957 100644 --- a/l10n/zh_TW/files.po +++ b/l10n/zh_TW/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 14:11+0000\n" -"Last-Translator: dw4dev \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,40 +26,41 @@ msgid "There is no error, the file uploaded with success" msgstr "無錯誤,檔案上傳成功" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "上傳的檔案超過了 php.ini 中的 upload_max_filesize 設定" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "上傳黨案的超過 HTML 表單中指定 MAX_FILE_SIZE 限制" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "只有部分檔案被上傳" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "無已上傳檔案" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "遺失暫存資料夾" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "寫入硬碟失敗" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "檔案" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "取消共享" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "刪除" @@ -158,15 +159,15 @@ msgstr "" msgid "error while scanning" msgstr "掃描時發生錯誤" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "名稱" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "大小" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "修改" @@ -194,27 +195,27 @@ msgstr "檔案處理" msgid "Maximum upload size" msgstr "最大上傳容量" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "最大允許: " -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "針對多檔案和目錄下載是必填的" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "啟用 Zip 下載" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "0代表沒有限制" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "針對ZIP檔案最大輸入大小" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "儲存" @@ -222,52 +223,48 @@ msgstr "儲存" msgid "New" msgstr "新增" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "文字檔" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "資料夾" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "上傳" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "取消上傳" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "沒有任何東西。請上傳內容!" -#: templates/index.php:52 -msgid "Share" -msgstr "分享" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "下載" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "上傳過大" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "你試圖上傳的檔案已超過伺服器的最大容量限制。 " -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "正在掃描檔案,請稍等。" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "目前掃描" diff --git a/l10n/zh_TW/settings.po b/l10n/zh_TW/settings.po index 1f0a0177f5..5727548920 100644 --- a/l10n/zh_TW/settings.po +++ b/l10n/zh_TW/settings.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 01:19+0000\n" +"Last-Translator: dw4dev \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -73,7 +73,7 @@ msgstr "語言已變更" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "管理者帳號無法從管理者群組中移除" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/zu_ZA/files.po b/l10n/zu_ZA/files.po index 3e5e478458..078ee8781e 100644 --- a/l10n/zu_ZA/files.po +++ b/l10n/zu_ZA/files.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 23:02+0000\n" +"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"PO-Revision-Date: 2012-11-30 23:02+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" @@ -22,40 +22,41 @@ msgid "There is no error, the file uploaded with success" msgstr "" #: ajax/upload.php:21 -msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " msgstr "" -#: ajax/upload.php:22 +#: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:23 +#: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:24 +#: ajax/upload.php:26 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:27 msgid "Missing a temporary folder" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:28 msgid "Failed to write to disk" msgstr "" -#: appinfo/app.php:6 +#: appinfo/app.php:10 msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:64 +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:66 +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 msgid "Delete" msgstr "" @@ -154,15 +155,15 @@ msgstr "" msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:50 +#: js/files.js:785 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:58 +#: js/files.js:786 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:60 +#: js/files.js:787 templates/index.php:78 msgid "Modified" msgstr "" @@ -190,27 +191,27 @@ msgstr "" msgid "Maximum upload size" msgstr "" -#: templates/admin.php:7 +#: templates/admin.php:9 msgid "max. possible: " msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." msgstr "" -#: templates/admin.php:9 +#: templates/admin.php:14 msgid "Enable ZIP-download" msgstr "" -#: templates/admin.php:11 +#: templates/admin.php:17 msgid "0 is unlimited" msgstr "" -#: templates/admin.php:12 +#: templates/admin.php:19 msgid "Maximum input size for ZIP files" msgstr "" -#: templates/admin.php:15 +#: templates/admin.php:23 msgid "Save" msgstr "" @@ -218,52 +219,48 @@ msgstr "" msgid "New" msgstr "" -#: templates/index.php:9 +#: templates/index.php:10 msgid "Text file" msgstr "" -#: templates/index.php:10 +#: templates/index.php:12 msgid "Folder" msgstr "" -#: templates/index.php:11 +#: templates/index.php:14 msgid "From link" msgstr "" -#: templates/index.php:22 +#: templates/index.php:35 msgid "Upload" msgstr "" -#: templates/index.php:29 +#: templates/index.php:43 msgid "Cancel upload" msgstr "" -#: templates/index.php:42 +#: templates/index.php:57 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:52 -msgid "Share" -msgstr "" - -#: templates/index.php:54 +#: templates/index.php:71 msgid "Download" msgstr "" -#: templates/index.php:77 +#: templates/index.php:103 msgid "Upload too large" msgstr "" -#: templates/index.php:79 +#: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:84 +#: templates/index.php:110 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:87 +#: templates/index.php:113 msgid "Current scanning" msgstr "" diff --git a/settings/l10n/cs_CZ.php b/settings/l10n/cs_CZ.php index 2d4fff615c..ee30583b04 100644 --- a/settings/l10n/cs_CZ.php +++ b/settings/l10n/cs_CZ.php @@ -11,6 +11,7 @@ "Authentication error" => "Chyba ověření", "Unable to delete user" => "Nelze smazat uživatele", "Language changed" => "Jazyk byl změněn", +"Admins can't remove themself from the admin group" => "Správci se nemohou odebrat sami ze skupiny správců", "Unable to add user to group %s" => "Nelze přidat uživatele do skupiny %s", "Unable to remove user from group %s" => "Nelze odstranit uživatele ze skupiny %s", "Disable" => "Zakázat", diff --git a/settings/l10n/fa.php b/settings/l10n/fa.php index a43dae386b..3dcb770c73 100644 --- a/settings/l10n/fa.php +++ b/settings/l10n/fa.php @@ -21,6 +21,7 @@ "Answer" => "پاسخ", "Desktop and Mobile Syncing Clients" => " ابزار مدیریت با دسکتاپ و موبایل", "Download" => "بارگیری", +"Your password was changed" => "رمز عبور شما تغییر یافت", "Unable to change your password" => "ناتوان در تغییر گذرواژه", "Current password" => "گذرواژه کنونی", "New password" => "گذرواژه جدید", diff --git a/settings/l10n/it.php b/settings/l10n/it.php index 5b5187ae41..fa24156b58 100644 --- a/settings/l10n/it.php +++ b/settings/l10n/it.php @@ -11,6 +11,7 @@ "Authentication error" => "Errore di autenticazione", "Unable to delete user" => "Impossibile eliminare l'utente", "Language changed" => "Lingua modificata", +"Admins can't remove themself from the admin group" => "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", "Unable to add user to group %s" => "Impossibile aggiungere l'utente al gruppo %s", "Unable to remove user from group %s" => "Impossibile rimuovere l'utente dal gruppo %s", "Disable" => "Disabilita", diff --git a/settings/l10n/ja_JP.php b/settings/l10n/ja_JP.php index 4504de565f..098cce843d 100644 --- a/settings/l10n/ja_JP.php +++ b/settings/l10n/ja_JP.php @@ -11,6 +11,7 @@ "Authentication error" => "認証エラー", "Unable to delete user" => "ユーザを削除できません", "Language changed" => "言語が変更されました", +"Admins can't remove themself from the admin group" => "管理者は自身を管理者グループから削除できません。", "Unable to add user to group %s" => "ユーザをグループ %s に追加できません", "Unable to remove user from group %s" => "ユーザをグループ %s から削除できません", "Disable" => "無効", diff --git a/settings/l10n/nl.php b/settings/l10n/nl.php index ed566b6550..f419ecf74e 100644 --- a/settings/l10n/nl.php +++ b/settings/l10n/nl.php @@ -11,6 +11,7 @@ "Authentication error" => "Authenticatie fout", "Unable to delete user" => "Niet in staat om gebruiker te verwijderen", "Language changed" => "Taal aangepast", +"Admins can't remove themself from the admin group" => "Admins kunnen zichzelf niet uit de admin groep verwijderen", "Unable to add user to group %s" => "Niet in staat om gebruiker toe te voegen aan groep %s", "Unable to remove user from group %s" => "Niet in staat om gebruiker te verwijderen uit groep %s", "Disable" => "Uitschakelen", diff --git a/settings/l10n/pt_PT.php b/settings/l10n/pt_PT.php index 5c6e018687..96d9ac67ac 100644 --- a/settings/l10n/pt_PT.php +++ b/settings/l10n/pt_PT.php @@ -11,6 +11,7 @@ "Authentication error" => "Erro de autenticação", "Unable to delete user" => "Impossível apagar utilizador", "Language changed" => "Idioma alterado", +"Admins can't remove themself from the admin group" => "Os administradores não se podem remover a eles mesmos do grupo admin.", "Unable to add user to group %s" => "Impossível acrescentar utilizador ao grupo %s", "Unable to remove user from group %s" => "Impossível apagar utilizador do grupo %s", "Disable" => "Desactivar", diff --git a/settings/l10n/uk.php b/settings/l10n/uk.php index dd8ed567a7..d1a0d6d909 100644 --- a/settings/l10n/uk.php +++ b/settings/l10n/uk.php @@ -11,6 +11,7 @@ "Authentication error" => "Помилка автентифікації", "Unable to delete user" => "Не вдалося видалити користувача", "Language changed" => "Мова змінена", +"Admins can't remove themself from the admin group" => "Адміністратор не може видалити себе з групи адмінів", "Unable to add user to group %s" => "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" => "Не вдалося видалити користувача із групи %s", "Disable" => "Вимкнути", diff --git a/settings/l10n/vi.php b/settings/l10n/vi.php index c7c2090a64..7857b0509e 100644 --- a/settings/l10n/vi.php +++ b/settings/l10n/vi.php @@ -11,6 +11,7 @@ "Authentication error" => "Lỗi xác thực", "Unable to delete user" => "Không thể xóa người dùng", "Language changed" => "Ngôn ngữ đã được thay đổi", +"Admins can't remove themself from the admin group" => "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", "Unable to add user to group %s" => "Không thể thêm người dùng vào nhóm %s", "Unable to remove user from group %s" => "Không thể xóa người dùng từ nhóm %s", "Disable" => "Tắt", diff --git a/settings/l10n/zh_TW.php b/settings/l10n/zh_TW.php index 35d77df214..7de5ee5f54 100644 --- a/settings/l10n/zh_TW.php +++ b/settings/l10n/zh_TW.php @@ -11,6 +11,7 @@ "Authentication error" => "認證錯誤", "Unable to delete user" => "使用者刪除錯誤", "Language changed" => "語言已變更", +"Admins can't remove themself from the admin group" => "管理者帳號無法從管理者群組中移除", "Unable to add user to group %s" => "使用者加入群組%s錯誤", "Unable to remove user from group %s" => "使用者移出群組%s錯誤", "Disable" => "停用", From 401c56ce7bda6b8fb782e3cea962e47546626eef Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 2 Dec 2012 00:03:12 +0100 Subject: [PATCH 400/481] [tx-robot] updated from transifex --- apps/files/l10n/ca.php | 1 + apps/files/l10n/cs_CZ.php | 1 + apps/files/l10n/es.php | 1 + apps/files/l10n/he.php | 23 ++++ apps/files/l10n/it.php | 1 + apps/files/l10n/pt_PT.php | 1 + apps/files/l10n/sk_SK.php | 3 + apps/files/l10n/sr.php | 87 ++++++------- apps/files_encryption/l10n/sr.php | 5 + apps/files_external/l10n/he.php | 11 ++ apps/files_versions/l10n/he.php | 5 +- apps/user_webdavauth/l10n/sk_SK.php | 3 + core/l10n/he.php | 51 +++++++- core/l10n/pt_BR.php | 3 + core/l10n/sk_SK.php | 11 ++ l10n/ca/files.po | 9 +- l10n/ca/settings.po | 9 +- l10n/cs_CZ/files.po | 8 +- l10n/es/files.po | 10 +- l10n/es/settings.po | 10 +- l10n/he/core.po | 186 ++++++++++++++-------------- l10n/he/files.po | 52 ++++---- l10n/he/files_external.po | 29 ++--- l10n/he/files_versions.po | 13 +- l10n/he/lib.po | 25 ++-- l10n/he/settings.po | 36 +++--- l10n/it/files.po | 8 +- l10n/pt_BR/core.po | 93 +++++++------- l10n/pt_BR/lib.po | 23 ++-- l10n/pt_PT/files.po | 8 +- l10n/sk_SK/core.po | 109 ++++++++-------- l10n/sk_SK/files.po | 13 +- l10n/sk_SK/lib.po | 23 ++-- l10n/sk_SK/settings.po | 11 +- l10n/sk_SK/user_webdavauth.po | 9 +- l10n/sr/files.po | 97 ++++++++------- l10n/sr/files_encryption.po | 15 +-- l10n/sr/lib.po | 47 +++---- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- lib/l10n/he.php | 7 +- lib/l10n/pt_BR.php | 6 +- lib/l10n/sk_SK.php | 6 +- lib/l10n/sr.php | 28 +++-- settings/l10n/ca.php | 1 + settings/l10n/es.php | 1 + settings/l10n/he.php | 15 +++ settings/l10n/sk_SK.php | 2 + 56 files changed, 653 insertions(+), 483 deletions(-) create mode 100644 apps/files_encryption/l10n/sr.php create mode 100644 apps/user_webdavauth/l10n/sk_SK.php diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index c612d6bdff..0866d97bd7 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -1,5 +1,6 @@ "El fitxer s'ha pujat correctament", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer de pujada excedeix la directiva MAX_FILE_SIZE especificada al formulari HTML", "The uploaded file was only partially uploaded" => "El fitxer només s'ha pujat parcialment", "No file was uploaded" => "El fitxer no s'ha pujat", diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index 0f8a2dc4d0..12eb79a1a1 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -1,5 +1,6 @@ "Soubor byl odeslán úspěšně", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Odesílaný soubor přesahuje velikost upload_max_filesize povolenou v php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný v formuláři HTML", "The uploaded file was only partially uploaded" => "Soubor byl odeslán pouze částečně", "No file was uploaded" => "Žádný soubor nebyl odeslán", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index 0ab442a68e..40b9ea9f23 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -1,5 +1,6 @@ "No se ha producido ningún error, el archivo se ha subido con éxito", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "El archivo que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo que intentas subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML", "The uploaded file was only partially uploaded" => "El archivo que intentas subir solo se subió parcialmente", "No file was uploaded" => "No se ha subido ningún archivo", diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 773a5c4812..4c73493211 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -1,5 +1,6 @@ "לא אירעה תקלה, הקבצים הועלו בהצלחה", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ה־HTML", "The uploaded file was only partially uploaded" => "הקובץ שהועלה הועלה בצורה חלקית", "No file was uploaded" => "לא הועלו קבצים", @@ -8,15 +9,36 @@ "Files" => "קבצים", "Unshare" => "הסר שיתוף", "Delete" => "מחיקה", +"Rename" => "שינוי שם", +"{new_name} already exists" => "{new_name} כבר קיים", +"replace" => "החלפה", +"suggest name" => "הצעת שם", +"cancel" => "ביטול", +"replaced {new_name}" => "{new_name} הוחלף", +"undo" => "ביטול", +"replaced {new_name} with {old_name}" => "{new_name} הוחלף ב־{old_name}", +"unshared {files}" => "בוטל שיתופם של {files}", +"deleted {files}" => "{files} נמחקו", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.", "generating ZIP-file, it may take some time." => "יוצר קובץ ZIP, אנא המתן.", "Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים", "Upload Error" => "שגיאת העלאה", "Close" => "סגירה", "Pending" => "ממתין", +"1 file uploading" => "קובץ אחד נשלח", +"{count} files uploading" => "{count} קבצים נשלחים", "Upload cancelled." => "ההעלאה בוטלה.", +"File upload is in progress. Leaving the page now will cancel the upload." => "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "שם התיקייה שגוי. השימוש בשם „Shared“ שמור לטובת Owncloud", +"{count} files scanned" => "{count} קבצים נסרקו", +"error while scanning" => "אירעה שגיאה במהלך הסריקה", "Name" => "שם", "Size" => "גודל", "Modified" => "זמן שינוי", +"1 folder" => "תיקייה אחת", +"{count} folders" => "{count} תיקיות", +"1 file" => "קובץ אחד", +"{count} files" => "{count} קבצים", "File handling" => "טיפול בקבצים", "Maximum upload size" => "גודל העלאה מקסימלי", "max. possible: " => "המרבי האפשרי: ", @@ -28,6 +50,7 @@ "New" => "חדש", "Text file" => "קובץ טקסט", "Folder" => "תיקייה", +"From link" => "מקישור", "Upload" => "העלאה", "Cancel upload" => "ביטול ההעלאה", "Nothing in here. Upload something!" => "אין כאן שום דבר. אולי ברצונך להעלות משהו?", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index e134f37014..90b3417122 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -1,5 +1,6 @@ "Non ci sono errori, file caricato con successo", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Il file caricato supera la direttiva upload_max_filesize in php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file caricato supera il valore MAX_FILE_SIZE definito nel form HTML", "The uploaded file was only partially uploaded" => "Il file è stato parzialmente caricato", "No file was uploaded" => "Nessun file è stato caricato", diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index 4977554d75..8c90fd4771 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -1,5 +1,6 @@ "Sem erro, ficheiro enviado com sucesso", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O ficheiro enviado excede o limite permitido na directiva do php.ini upload_max_filesize", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado excede o diretivo MAX_FILE_SIZE especificado no formulário HTML", "The uploaded file was only partially uploaded" => "O ficheiro enviado só foi enviado parcialmente", "No file was uploaded" => "Não foi enviado nenhum ficheiro", diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index 81e30dc0dc..21d9710f6b 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -1,5 +1,6 @@ "Nenastala žiadna chyba, súbor bol úspešne nahraný", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Nahraný súbor predčil konfiguračnú direktívu upload_max_filesize v súbore php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný súbor presiahol MAX_FILE_SIZE direktívu, ktorá bola špecifikovaná v HTML formulári", "The uploaded file was only partially uploaded" => "Nahrávaný súbor bol iba čiastočne nahraný", "No file was uploaded" => "Žiaden súbor nebol nahraný", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "prepísaný {new_name} súborom {old_name}", "unshared {files}" => "zdieľanie zrušené pre {files}", "deleted {files}" => "zmazané {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.", "generating ZIP-file, it may take some time." => "generujem ZIP-súbor, môže to chvíľu trvať.", "Unable to upload your file as it is a directory or has 0 bytes" => "Nemôžem nahrať súbor lebo je to priečinok alebo má 0 bajtov.", "Upload Error" => "Chyba odosielania", @@ -27,6 +29,7 @@ "{count} files uploading" => "{count} súborov odosielaných", "Upload cancelled." => "Odosielanie zrušené", "File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nesprávne meno adresára. Použitie slova \"Shared\" (Zdieľané) je vyhradené službou ownCloud.", "{count} files scanned" => "{count} súborov prehľadaných", "error while scanning" => "chyba počas kontroly", "Name" => "Meno", diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index 3ce2585a23..48b258862b 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -1,59 +1,62 @@ "Нема грешке, фајл је успешно послат", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Послати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми", -"The uploaded file was only partially uploaded" => "Послати фајл је само делимично отпремљен!", -"No file was uploaded" => "Ниједан фајл није послат", +"There is no error, the file uploaded with success" => "Није дошло до грешке. Датотека је успешно отпремљена.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Отпремљена датотека прелази смерницу upload_max_filesize у датотеци php.ini:", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Отпремљена датотека прелази смерницу MAX_FILE_SIZE која је наведена у HTML обрасцу", +"The uploaded file was only partially uploaded" => "Датотека је делимично отпремљена", +"No file was uploaded" => "Датотека није отпремљена", "Missing a temporary folder" => "Недостаје привремена фасцикла", -"Failed to write to disk" => "Није успело записивање на диск", -"Files" => "Фајлови", +"Failed to write to disk" => "Не могу да пишем на диск", +"Files" => "Датотеке", "Unshare" => "Укини дељење", "Delete" => "Обриши", "Rename" => "Преименуј", "{new_name} already exists" => "{new_name} већ постоји", "replace" => "замени", "suggest name" => "предложи назив", -"cancel" => "поништи", -"replaced {new_name}" => "замењена са {new_name}", -"undo" => "врати", +"cancel" => "откажи", +"replaced {new_name}" => "замењено {new_name}", +"undo" => "опозови", "replaced {new_name} with {old_name}" => "замењено {new_name} са {old_name}", -"unshared {files}" => "укинуто дељење над {files}", -"deleted {files}" => "обриши {files}", -"generating ZIP-file, it may take some time." => "генерисање ЗИП датотеке, потрајаће неко време.", -"Unable to upload your file as it is a directory or has 0 bytes" => "Није могуће послати датотеку или зато што је директоријуму или јој је величина 0 бајта", -"Upload Error" => "Грешка у слању", +"unshared {files}" => "укинуто дељење {files}", +"deleted {files}" => "обрисано {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *.", +"generating ZIP-file, it may take some time." => "правим ZIP датотеку…", +"Unable to upload your file as it is a directory or has 0 bytes" => "Не могу да отпремим датотеку као фасциклу или она има 0 бајтова", +"Upload Error" => "Грешка при отпремању", "Close" => "Затвори", "Pending" => "На чекању", -"1 file uploading" => "1 датотека се шаље", -"{count} files uploading" => "Шаље се {count} датотека", -"Upload cancelled." => "Слање је прекинуто.", -"File upload is in progress. Leaving the page now will cancel the upload." => "Слање датотеке је у току. Ако сада напустите страну слање ће бити прекинуто.", -"{count} files scanned" => "{count} датотека се скенира", -"error while scanning" => "грешка у скенирању", -"Name" => "Име", +"1 file uploading" => "Отпремам 1 датотеку", +"{count} files uploading" => "Отпремам {count} датотеке/а", +"Upload cancelled." => "Отпремање је прекинуто.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Неисправан назив фасцикле. „Дељено“ користи Оунклауд.", +"{count} files scanned" => "Скенирано датотека: {count}", +"error while scanning" => "грешка при скенирању", +"Name" => "Назив", "Size" => "Величина", -"Modified" => "Задња измена", -"1 folder" => "1 директоријум", -"{count} folders" => "{count} директоријума", +"Modified" => "Измењено", +"1 folder" => "1 фасцикла", +"{count} folders" => "{count} фасцикле/и", "1 file" => "1 датотека", -"{count} files" => "{count} датотека", -"File handling" => "Рад са датотекама", -"Maximum upload size" => "Максимална величина пошиљке", -"max. possible: " => "макс. величина:", -"Needed for multi-file and folder downloads." => "Неопходно за вишеструко преузимања датотека и директоријума.", -"Enable ZIP-download" => "Укључи преузимање у ЗИП-у", +"{count} files" => "{count} датотеке/а", +"File handling" => "Управљање датотекама", +"Maximum upload size" => "Највећа величина датотеке", +"max. possible: " => "највећа величина:", +"Needed for multi-file and folder downloads." => "Неопходно за преузимање вишеделних датотека и фасцикли.", +"Enable ZIP-download" => "Омогући преузимање у ZIP-у", "0 is unlimited" => "0 је неограничено", -"Maximum input size for ZIP files" => "Максимална величина ЗИП датотека", -"Save" => "Сними", -"New" => "Нови", -"Text file" => "текстуални фајл", +"Maximum input size for ZIP files" => "Највећа величина ZIP датотека", +"Save" => "Сачувај", +"New" => "Нова", +"Text file" => "текстуална датотека", "Folder" => "фасцикла", -"From link" => "Са линка", -"Upload" => "Пошаљи", -"Cancel upload" => "Прекини слање", -"Nothing in here. Upload something!" => "Овде нема ничег. Пошаљите нешто!", +"From link" => "Са везе", +"Upload" => "Отпреми", +"Cancel upload" => "Прекини отпремање", +"Nothing in here. Upload something!" => "Овде нема ничег. Отпремите нешто!", "Download" => "Преузми", -"Upload too large" => "Пошиљка је превелика", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу.", -"Files are being scanned, please wait." => "Скенирање датотека у току, молим вас сачекајте.", -"Current scanning" => "Тренутно се скенира" +"Upload too large" => "Датотека је превелика", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеке које желите да отпремите прелазе ограничење у величини.", +"Files are being scanned, please wait." => "Скенирам датотеке…", +"Current scanning" => "Тренутно скенирање" ); diff --git a/apps/files_encryption/l10n/sr.php b/apps/files_encryption/l10n/sr.php new file mode 100644 index 0000000000..dbeda58af0 --- /dev/null +++ b/apps/files_encryption/l10n/sr.php @@ -0,0 +1,5 @@ + "Шифровање", +"None" => "Ништа", +"Enable Encryption" => "Омогући шифровање" +); diff --git a/apps/files_external/l10n/he.php b/apps/files_external/l10n/he.php index 12dfa62e7c..3dc04d4e79 100644 --- a/apps/files_external/l10n/he.php +++ b/apps/files_external/l10n/he.php @@ -1,7 +1,18 @@ "הוענקה גישה", +"Error configuring Dropbox storage" => "אירעה שגיאה בעת הגדרת אחסון ב־Dropbox", +"Grant access" => "הענקת גישה", +"Fill out all required fields" => "נא למלא את כל השדות הנדרשים", +"Please provide a valid Dropbox app key and secret." => "נא לספק קוד יישום וסוד תקניים של Dropbox.", +"Error configuring Google Drive storage" => "אירעה שגיאה בעת הגדרת אחסון ב־Google Drive", "External Storage" => "אחסון חיצוני", +"Mount point" => "נקודת עגינה", +"Backend" => "מנגנון", "Configuration" => "הגדרות", "Options" => "אפשרויות", +"Applicable" => "ניתן ליישום", +"Add mount point" => "הוספת נקודת עגינה", +"None set" => "לא הוגדרה", "All Users" => "כל המשתמשים", "Groups" => "קבוצות", "Users" => "משתמשים", diff --git a/apps/files_versions/l10n/he.php b/apps/files_versions/l10n/he.php index 09a013f45a..061e88b0db 100644 --- a/apps/files_versions/l10n/he.php +++ b/apps/files_versions/l10n/he.php @@ -1,5 +1,8 @@ "הפגת תוקף כל הגרסאות", +"History" => "היסטוריה", "Versions" => "גרסאות", -"This will delete all existing backup versions of your files" => "פעולה זו תמחק את כל גיבויי הגרסאות הקיימים של הקבצים שלך" +"This will delete all existing backup versions of your files" => "פעולה זו תמחק את כל גיבויי הגרסאות הקיימים של הקבצים שלך", +"Files Versioning" => "שמירת הבדלי גרסאות של קבצים", +"Enable" => "הפעלה" ); diff --git a/apps/user_webdavauth/l10n/sk_SK.php b/apps/user_webdavauth/l10n/sk_SK.php new file mode 100644 index 0000000000..9bd32954b0 --- /dev/null +++ b/apps/user_webdavauth/l10n/sk_SK.php @@ -0,0 +1,3 @@ + "WebDAV URL: http://" +); diff --git a/core/l10n/he.php b/core/l10n/he.php index 4b63035a1a..d4ec0ab84c 100644 --- a/core/l10n/he.php +++ b/core/l10n/he.php @@ -1,26 +1,65 @@ "סוג הקטגוריה לא סופק.", "No category to add?" => "אין קטגוריה להוספה?", "This category already exists: " => "קטגוריה זאת כבר קיימת: ", +"Object type not provided." => "סוג הפריט לא סופק.", +"%s ID not provided." => "מזהה %s לא סופק.", +"Error adding %s to favorites." => "אירעה שגיאה בעת הוספת %s למועדפים.", "No categories selected for deletion." => "לא נבחרו קטגוריות למחיקה", +"Error removing %s from favorites." => "שגיאה בהסרת %s מהמועדפים.", "Settings" => "הגדרות", "seconds ago" => "שניות", "1 minute ago" => "לפני דקה אחת", +"{minutes} minutes ago" => "לפני {minutes} דקות", +"1 hour ago" => "לפני שעה", +"{hours} hours ago" => "לפני {hours} שעות", "today" => "היום", "yesterday" => "אתמול", +"{days} days ago" => "לפני {days} ימים", "last month" => "חודש שעבר", +"{months} months ago" => "לפני {months} חודשים", "months ago" => "חודשים", "last year" => "שנה שעברה", "years ago" => "שנים", +"Choose" => "בחירה", "Cancel" => "ביטול", "No" => "לא", "Yes" => "כן", "Ok" => "בסדר", +"The object type is not specified." => "סוג הפריט לא צוין.", "Error" => "שגיאה", +"The app name is not specified." => "שם היישום לא צוין.", +"The required file {file} is not installed!" => "הקובץ הנדרש {file} אינו מותקן!", +"Error while sharing" => "שגיאה במהלך השיתוף", +"Error while unsharing" => "שגיאה במהלך ביטול השיתוף", +"Error while changing permissions" => "שגיאה במהלך שינוי ההגדרות", +"Shared with you and the group {group} by {owner}" => "שותף אתך ועם הקבוצה {group} שבבעלות {owner}", +"Shared with you by {owner}" => "שותף אתך על ידי {owner}", +"Share with" => "שיתוף עם", +"Share with link" => "שיתוף עם קישור", +"Password protect" => "הגנה בססמה", "Password" => "ססמה", +"Set expiration date" => "הגדרת תאריך תפוגה", +"Expiration date" => "תאריך התפוגה", +"Share via email:" => "שיתוף באמצעות דוא״ל:", +"No people found" => "לא נמצאו אנשים", +"Resharing is not allowed" => "אסור לעשות שיתוף מחדש", +"Shared in {item} with {user}" => "שותף תחת {item} עם {user}", "Unshare" => "הסר שיתוף", +"can edit" => "ניתן לערוך", +"access control" => "בקרת גישה", +"create" => "יצירה", +"update" => "עדכון", +"delete" => "מחיקה", +"share" => "שיתוף", +"Password protected" => "מוגן בססמה", +"Error unsetting expiration date" => "אירעה שגיאה בביטול תאריך התפוגה", +"Error setting expiration date" => "אירעה שגיאה בעת הגדרת תאריך התפוגה", "ownCloud password reset" => "איפוס הססמה של ownCloud", "Use the following link to reset your password: {link}" => "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", "You will receive a link to reset your password via Email." => "יישלח לתיבת הדוא״ל שלך קישור לאיפוס הססמה.", +"Reset email send." => "איפוס שליחת דוא״ל.", +"Request failed!" => "הבקשה נכשלה!", "Username" => "שם משתמש", "Request reset" => "בקשת איפוס", "Your password was reset" => "הססמה שלך אופסה", @@ -36,6 +75,10 @@ "Cloud not found" => "ענן לא נמצא", "Edit categories" => "עריכת הקטגוריות", "Add" => "הוספה", +"Security Warning" => "אזהרת אבטחה", +"No secure random number generator is available, please enable the PHP OpenSSL extension." => "אין מחולל מספרים אקראיים מאובטח, נא להפעיל את ההרחבה OpenSSL ב־PHP.", +"Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "ללא מחולל מספרים אקראיים מאובטח תוקף יכול לנבא את מחרוזות איפוס הססמה ולהשתלט על החשבון שלך.", +"Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "יתכן שתיקיית הנתונים והקבצים שלך נגישים דרך האינטרנט. קובץ ה־‎.htaccess שמסופק על ידי ownCloud כנראה אינו עובד. אנו ממליצים בחום להגדיר את שרת האינטרנט שלך בדרך שבה תיקיית הנתונים לא תהיה זמינה עוד או להעביר את תיקיית הנתונים מחוץ לספריית העל של שרת האינטרנט.", "Create an admin account" => "יצירת חשבון מנהל", "Advanced" => "מתקדם", "Data folder" => "תיקיית נתונים", @@ -68,10 +111,16 @@ "December" => "דצמבר", "web services under your control" => "שירותי רשת בשליטתך", "Log out" => "התנתקות", +"Automatic logon rejected!" => "בקשת הכניסה האוטומטית נדחתה!", +"If you did not change your password recently, your account may be compromised!" => "אם לא שינית את ססמתך לאחרונה, יתכן שחשבונך נפגע!", +"Please change your password to secure your account again." => "נא לשנות את הססמה שלך כדי לאבטח את חשבונך מחדש.", "Lost your password?" => "שכחת את ססמתך?", "remember" => "שמירת הססמה", "Log in" => "כניסה", "You are logged out." => "לא התחברת.", "prev" => "הקודם", -"next" => "הבא" +"next" => "הבא", +"Security Warning!" => "אזהרת אבטחה!", +"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "נא לאמת את הססמה שלך.
    מטעמי אבטחה יתכן שתופיע בקשה להזין את הססמה שוב.", +"Verify" => "אימות" ); diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php index f0f71e4a26..6782cc1ebf 100644 --- a/core/l10n/pt_BR.php +++ b/core/l10n/pt_BR.php @@ -6,10 +6,13 @@ "seconds ago" => "segundos atrás", "1 minute ago" => "1 minuto atrás", "{minutes} minutes ago" => "{minutes} minutos atrás", +"1 hour ago" => "1 hora atrás", +"{hours} hours ago" => "{hours} horas atrás", "today" => "hoje", "yesterday" => "ontem", "{days} days ago" => "{days} dias atrás", "last month" => "último mês", +"{months} months ago" => "{months} meses atrás", "months ago" => "meses atrás", "last year" => "último ano", "years ago" => "anos atrás", diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php index ca5622fb6e..162d94e824 100644 --- a/core/l10n/sk_SK.php +++ b/core/l10n/sk_SK.php @@ -1,15 +1,23 @@ "Neposkytnutý kategorický typ.", "No category to add?" => "Žiadna kategória pre pridanie?", "This category already exists: " => "Táto kategória už existuje:", +"Object type not provided." => "Neposkytnutý typ objektu.", +"%s ID not provided." => "%s ID neposkytnuté.", +"Error adding %s to favorites." => "Chyba pri pridávaní %s do obľúbených položiek.", "No categories selected for deletion." => "Neboli vybrané žiadne kategórie pre odstránenie.", +"Error removing %s from favorites." => "Chyba pri odstraňovaní %s z obľúbených položiek.", "Settings" => "Nastavenia", "seconds ago" => "pred sekundami", "1 minute ago" => "pred minútou", "{minutes} minutes ago" => "pred {minutes} minútami", +"1 hour ago" => "Pred 1 hodinou.", +"{hours} hours ago" => "Pred {hours} hodinami.", "today" => "dnes", "yesterday" => "včera", "{days} days ago" => "pred {days} dňami", "last month" => "minulý mesiac", +"{months} months ago" => "Pred {months} mesiacmi.", "months ago" => "pred mesiacmi", "last year" => "minulý rok", "years ago" => "pred rokmi", @@ -18,7 +26,10 @@ "No" => "Nie", "Yes" => "Áno", "Ok" => "Ok", +"The object type is not specified." => "Nešpecifikovaný typ objektu.", "Error" => "Chyba", +"The app name is not specified." => "Nešpecifikované meno aplikácie.", +"The required file {file} is not installed!" => "Požadovaný súbor {file} nie je inštalovaný!", "Error while sharing" => "Chyba počas zdieľania", "Error while unsharing" => "Chyba počas ukončenia zdieľania", "Error while changing permissions" => "Chyba počas zmeny oprávnení", diff --git a/l10n/ca/files.po b/l10n/ca/files.po index 3d7d344586..478d4fded6 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -6,14 +6,15 @@ # , 2012. # , 2012. # , 2012. +# Josep Tomàs , 2012. # , 2011-2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:57+0000\n" +"Last-Translator: Josep Tomàs \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +29,7 @@ msgstr "El fitxer s'ha pujat correctament" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po index 56ad9cd1fc..d87a9e5a34 100644 --- a/l10n/ca/settings.po +++ b/l10n/ca/settings.po @@ -6,14 +6,15 @@ # , 2012. # , 2012. # , 2012. +# Josep Tomàs , 2012. # , 2011-2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:58+0000\n" +"Last-Translator: Josep Tomàs \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -71,7 +72,7 @@ msgstr "S'ha canviat l'idioma" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Els administradors no es poden eliminar del grup admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index 944830b1af..ae2e468235 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 05:15+0000\n" +"Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgstr "Soubor byl odeslán úspěšně" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Odesílaný soubor přesahuje velikost upload_max_filesize povolenou v php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/es/files.po b/l10n/es/files.po index e366a8827d..8925d2d93d 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -8,15 +8,15 @@ # Javier Llorente , 2012. # , 2012. # Rubén Trujillo , 2012. -# , 2011, 2012. +# , 2011-2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 20:49+0000\n" +"Last-Translator: xsergiolpx \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +31,7 @@ msgstr "No se ha producido ningún error, el archivo se ha subido con éxito" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "El archivo que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini" #: ajax/upload.php:23 msgid "" diff --git a/l10n/es/settings.po b/l10n/es/settings.po index 38803f42a9..cddf430646 100644 --- a/l10n/es/settings.po +++ b/l10n/es/settings.po @@ -13,14 +13,14 @@ # , 2012. # , 2011. # Rubén Trujillo , 2012. -# , 2011, 2012. +# , 2011-2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 20:49+0000\n" +"Last-Translator: xsergiolpx \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -78,7 +78,7 @@ msgstr "Idioma cambiado" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/he/core.po b/l10n/he/core.po index a2d1e92815..7595b43248 100644 --- a/l10n/he/core.po +++ b/l10n/he/core.po @@ -6,14 +6,14 @@ # Dovix Dovix , 2012. # , 2012. # , 2011. -# Yaron Shahrabani , 2011, 2012. +# Yaron Shahrabani , 2011-2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 06:47+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "סוג הקטגוריה לא סופק." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -37,18 +37,18 @@ msgstr "קטגוריה זאת כבר קיימת: " #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "סוג הפריט לא סופק." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "מזהה %s לא סופק." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "אירעה שגיאה בעת הוספת %s למועדפים." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -57,67 +57,67 @@ msgstr "לא נבחרו קטגוריות למחיקה" #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "שגיאה בהסרת %s מהמועדפים." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "הגדרות" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "שניות" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "לפני דקה אחת" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" -msgstr "" +msgstr "לפני {minutes} דקות" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "לפני שעה" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "לפני {hours} שעות" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "היום" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "אתמול" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" -msgstr "" +msgstr "לפני {days} ימים" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "חודש שעבר" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "לפני {months} חודשים" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "חודשים" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "שנה שעברה" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "שנים" #: js/oc-dialogs.js:126 msgid "Choose" -msgstr "" +msgstr "בחירה" #: js/oc-dialogs.js:146 js/oc-dialogs.js:166 msgid "Cancel" @@ -138,53 +138,53 @@ msgstr "בסדר" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "סוג הפריט לא צוין." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "שגיאה" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "שם היישום לא צוין." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "הקובץ הנדרש {file} אינו מותקן!" #: js/share.js:124 msgid "Error while sharing" -msgstr "" +msgstr "שגיאה במהלך השיתוף" #: js/share.js:135 msgid "Error while unsharing" -msgstr "" +msgstr "שגיאה במהלך ביטול השיתוף" #: js/share.js:142 msgid "Error while changing permissions" -msgstr "" +msgstr "שגיאה במהלך שינוי ההגדרות" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr "שותף אתך ועם הקבוצה {group} שבבעלות {owner}" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "שותף אתך על ידי {owner}" #: js/share.js:158 msgid "Share with" -msgstr "" +msgstr "שיתוף עם" #: js/share.js:163 msgid "Share with link" -msgstr "" +msgstr "שיתוף עם קישור" #: js/share.js:164 msgid "Password protect" -msgstr "" +msgstr "הגנה בססמה" #: js/share.js:168 templates/installation.php:42 templates/login.php:24 #: templates/verify.php:13 @@ -193,27 +193,27 @@ msgstr "ססמה" #: js/share.js:173 msgid "Set expiration date" -msgstr "" +msgstr "הגדרת תאריך תפוגה" #: js/share.js:174 msgid "Expiration date" -msgstr "" +msgstr "תאריך התפוגה" #: js/share.js:206 msgid "Share via email:" -msgstr "" +msgstr "שיתוף באמצעות דוא״ל:" #: js/share.js:208 msgid "No people found" -msgstr "" +msgstr "לא נמצאו אנשים" #: js/share.js:235 msgid "Resharing is not allowed" -msgstr "" +msgstr "אסור לעשות שיתוף מחדש" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "שותף תחת {item} עם {user}" #: js/share.js:292 msgid "Unshare" @@ -221,39 +221,39 @@ msgstr "הסר שיתוף" #: js/share.js:304 msgid "can edit" -msgstr "" +msgstr "ניתן לערוך" #: js/share.js:306 msgid "access control" -msgstr "" +msgstr "בקרת גישה" #: js/share.js:309 msgid "create" -msgstr "" +msgstr "יצירה" #: js/share.js:312 msgid "update" -msgstr "" +msgstr "עדכון" #: js/share.js:315 msgid "delete" -msgstr "" +msgstr "מחיקה" #: js/share.js:318 msgid "share" -msgstr "" +msgstr "שיתוף" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" -msgstr "" +msgstr "מוגן בססמה" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" -msgstr "" +msgstr "אירעה שגיאה בביטול תאריך התפוגה" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" -msgstr "" +msgstr "אירעה שגיאה בעת הגדרת תאריך התפוגה" #: lostpassword/controller.php:47 msgid "ownCloud password reset" @@ -269,11 +269,11 @@ msgstr "יישלח לתיבת הדוא״ל שלך קישור לאיפוס הסס #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." -msgstr "" +msgstr "איפוס שליחת דוא״ל." #: lostpassword/templates/lostpassword.php:8 msgid "Request failed!" -msgstr "" +msgstr "הבקשה נכשלה!" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 #: templates/login.php:20 @@ -338,19 +338,19 @@ msgstr "הוספה" #: templates/installation.php:23 templates/installation.php:31 msgid "Security Warning" -msgstr "" +msgstr "אזהרת אבטחה" #: templates/installation.php:24 msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." -msgstr "" +msgstr "אין מחולל מספרים אקראיים מאובטח, נא להפעיל את ההרחבה OpenSSL ב־PHP." #: templates/installation.php:26 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." -msgstr "" +msgstr "ללא מחולל מספרים אקראיים מאובטח תוקף יכול לנבא את מחרוזות איפוס הססמה ולהשתלט על החשבון שלך." #: templates/installation.php:32 msgid "" @@ -359,7 +359,7 @@ msgid "" "strongly suggest that you configure your webserver in a way that the data " "directory is no longer accessible or you move the data directory outside the" " webserver document root." -msgstr "" +msgstr "יתכן שתיקיית הנתונים והקבצים שלך נגישים דרך האינטרנט. קובץ ה־‎.htaccess שמסופק על ידי ownCloud כנראה אינו עובד. אנו ממליצים בחום להגדיר את שרת האינטרנט שלך בדרך שבה תיקיית הנתונים לא תהיה זמינה עוד או להעביר את תיקיית הנתונים מחוץ לספריית העל של שרת האינטרנט." #: templates/installation.php:36 msgid "Create an admin account" @@ -406,103 +406,103 @@ msgstr "שרת בסיס נתונים" msgid "Finish setup" msgstr "סיום התקנה" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "יום ראשון" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "יום שני" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "יום שלישי" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "יום רביעי" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "יום חמישי" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "יום שישי" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "שבת" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "ינואר" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "פברואר" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "מרץ" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "אפריל" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "מאי" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "יוני" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "יולי" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "אוגוסט" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "ספטמבר" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "אוקטובר" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "נובמבר" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "דצמבר" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "שירותי רשת בשליטתך" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "התנתקות" #: templates/login.php:8 msgid "Automatic logon rejected!" -msgstr "" +msgstr "בקשת הכניסה האוטומטית נדחתה!" #: templates/login.php:9 msgid "" "If you did not change your password recently, your account may be " "compromised!" -msgstr "" +msgstr "אם לא שינית את ססמתך לאחרונה, יתכן שחשבונך נפגע!" #: templates/login.php:10 msgid "Please change your password to secure your account again." -msgstr "" +msgstr "נא לשנות את הססמה שלך כדי לאבטח את חשבונך מחדש." #: templates/login.php:15 msgid "Lost your password?" @@ -530,14 +530,14 @@ msgstr "הבא" #: templates/verify.php:5 msgid "Security Warning!" -msgstr "" +msgstr "אזהרת אבטחה!" #: templates/verify.php:6 msgid "" "Please verify your password.
    For security reasons you may be " "occasionally asked to enter your password again." -msgstr "" +msgstr "נא לאמת את הססמה שלך.
    מטעמי אבטחה יתכן שתופיע בקשה להזין את הססמה שוב." #: templates/verify.php:16 msgid "Verify" -msgstr "" +msgstr "אימות" diff --git a/l10n/he/files.po b/l10n/he/files.po index 7a8fd19841..2d18545dbb 100644 --- a/l10n/he/files.po +++ b/l10n/he/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 06:37+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgstr "לא אירעה תקלה, הקבצים הועלו בהצלחה" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:" #: ajax/upload.php:23 msgid "" @@ -66,49 +66,49 @@ msgstr "מחיקה" #: js/fileactions.js:181 msgid "Rename" -msgstr "" +msgstr "שינוי שם" #: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" -msgstr "" +msgstr "{new_name} כבר קיים" #: js/filelist.js:201 js/filelist.js:203 msgid "replace" -msgstr "" +msgstr "החלפה" #: js/filelist.js:201 msgid "suggest name" -msgstr "" +msgstr "הצעת שם" #: js/filelist.js:201 js/filelist.js:203 msgid "cancel" -msgstr "" +msgstr "ביטול" #: js/filelist.js:250 msgid "replaced {new_name}" -msgstr "" +msgstr "{new_name} הוחלף" #: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" -msgstr "" +msgstr "ביטול" #: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" -msgstr "" +msgstr "{new_name} הוחלף ב־{old_name}" #: js/filelist.js:284 msgid "unshared {files}" -msgstr "" +msgstr "בוטל שיתופם של {files}" #: js/filelist.js:286 msgid "deleted {files}" -msgstr "" +msgstr "{files} נמחקו" #: js/files.js:33 msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -132,11 +132,11 @@ msgstr "ממתין" #: js/files.js:274 msgid "1 file uploading" -msgstr "" +msgstr "קובץ אחד נשלח" #: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" -msgstr "" +msgstr "{count} קבצים נשלחים" #: js/files.js:349 js/files.js:382 msgid "Upload cancelled." @@ -145,19 +145,19 @@ msgstr "ההעלאה בוטלה." #: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." -msgstr "" +msgstr "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה." #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "שם התיקייה שגוי. השימוש בשם „Shared“ שמור לטובת Owncloud" #: js/files.js:704 msgid "{count} files scanned" -msgstr "" +msgstr "{count} קבצים נסרקו" #: js/files.js:712 msgid "error while scanning" -msgstr "" +msgstr "אירעה שגיאה במהלך הסריקה" #: js/files.js:785 templates/index.php:65 msgid "Name" @@ -173,19 +173,19 @@ msgstr "זמן שינוי" #: js/files.js:814 msgid "1 folder" -msgstr "" +msgstr "תיקייה אחת" #: js/files.js:816 msgid "{count} folders" -msgstr "" +msgstr "{count} תיקיות" #: js/files.js:824 msgid "1 file" -msgstr "" +msgstr "קובץ אחד" #: js/files.js:826 msgid "{count} files" -msgstr "" +msgstr "{count} קבצים" #: templates/admin.php:5 msgid "File handling" @@ -233,7 +233,7 @@ msgstr "תיקייה" #: templates/index.php:14 msgid "From link" -msgstr "" +msgstr "מקישור" #: templates/index.php:35 msgid "Upload" diff --git a/l10n/he/files_external.po b/l10n/he/files_external.po index 0b3be3a33b..bf65ccc356 100644 --- a/l10n/he/files_external.po +++ b/l10n/he/files_external.po @@ -4,13 +4,14 @@ # # Translators: # Tomer Cohen , 2012. +# Yaron Shahrabani , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 07:19+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,27 +21,27 @@ msgstr "" #: js/dropbox.js:7 js/dropbox.js:25 js/google.js:7 js/google.js:23 msgid "Access granted" -msgstr "" +msgstr "הוענקה גישה" #: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 msgid "Error configuring Dropbox storage" -msgstr "" +msgstr "אירעה שגיאה בעת הגדרת אחסון ב־Dropbox" #: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 msgid "Grant access" -msgstr "" +msgstr "הענקת גישה" #: js/dropbox.js:73 js/google.js:72 msgid "Fill out all required fields" -msgstr "" +msgstr "נא למלא את כל השדות הנדרשים" #: js/dropbox.js:85 msgid "Please provide a valid Dropbox app key and secret." -msgstr "" +msgstr "נא לספק קוד יישום וסוד תקניים של Dropbox." #: js/google.js:26 js/google.js:73 js/google.js:78 msgid "Error configuring Google Drive storage" -msgstr "" +msgstr "אירעה שגיאה בעת הגדרת אחסון ב־Google Drive" #: templates/settings.php:3 msgid "External Storage" @@ -48,11 +49,11 @@ msgstr "אחסון חיצוני" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "נקודת עגינה" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "מנגנון" #: templates/settings.php:9 msgid "Configuration" @@ -64,15 +65,15 @@ msgstr "אפשרויות" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "ניתן ליישום" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "הוספת נקודת עגינה" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "לא הוגדרה" #: templates/settings.php:63 msgid "All Users" diff --git a/l10n/he/files_versions.po b/l10n/he/files_versions.po index 20cfd9e737..6c4367359d 100644 --- a/l10n/he/files_versions.po +++ b/l10n/he/files_versions.po @@ -4,13 +4,14 @@ # # Translators: # Tomer Cohen , 2012. +# Yaron Shahrabani , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-09-22 01:14+0200\n" -"PO-Revision-Date: 2012-09-21 23:15+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 07:21+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "הפגת תוקף כל הגרסאות" #: js/versions.js:16 msgid "History" -msgstr "" +msgstr "היסטוריה" #: templates/settings-personal.php:4 msgid "Versions" @@ -36,8 +37,8 @@ msgstr "פעולה זו תמחק את כל גיבויי הגרסאות הקיי #: templates/settings.php:3 msgid "Files Versioning" -msgstr "" +msgstr "שמירת הבדלי גרסאות של קבצים" #: templates/settings.php:4 msgid "Enable" -msgstr "" +msgstr "הפעלה" diff --git a/l10n/he/lib.po b/l10n/he/lib.po index 36cae0c141..de97f2df88 100644 --- a/l10n/he/lib.po +++ b/l10n/he/lib.po @@ -4,13 +4,14 @@ # # Translators: # Tomer Cohen , 2012. +# Yaron Shahrabani , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 06:32+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,19 +43,19 @@ msgstr "יישומים" msgid "Admin" msgstr "מנהל" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "הורדת ZIP כבויה" -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "יש להוריד את הקבצים אחד אחרי השני." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "חזרה לקבצים" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "הקבצים הנבחרים גדולים מידי ליצירת קובץ zip." @@ -80,7 +81,7 @@ msgstr "טקסט" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "תמונות" #: template.php:103 msgid "seconds ago" @@ -97,12 +98,12 @@ msgstr "לפני %d דקות" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "לפני שעה" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "לפני %d שעות" #: template.php:108 msgid "today" @@ -124,7 +125,7 @@ msgstr "חודש שעבר" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "לפני %d חודשים" #: template.php:113 msgid "last year" @@ -150,4 +151,4 @@ msgstr "בדיקת עדכונים מנוטרלת" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "לא ניתן למצוא את הקטגוריה „%s“" diff --git a/l10n/he/settings.po b/l10n/he/settings.po index 98a2205692..245b0b50b4 100644 --- a/l10n/he/settings.po +++ b/l10n/he/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 06:31+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,19 +22,19 @@ msgstr "" #: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" -msgstr "" +msgstr "לא ניתן לטעון רשימה מה־App Store" #: ajax/creategroup.php:10 msgid "Group already exists" -msgstr "" +msgstr "הקבוצה כבר קיימת" #: ajax/creategroup.php:19 msgid "Unable to add group" -msgstr "" +msgstr "לא ניתן להוסיף קבוצה" #: ajax/enableapp.php:12 msgid "Could not enable app. " -msgstr "" +msgstr "לא ניתן להפעיל את היישום" #: ajax/lostpassword.php:12 msgid "Email saved" @@ -54,7 +54,7 @@ msgstr "בקשה לא חוקית" #: ajax/removegroup.php:13 msgid "Unable to delete group" -msgstr "" +msgstr "לא ניתן למחוק את הקבוצה" #: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" @@ -62,7 +62,7 @@ msgstr "שגיאת הזדהות" #: ajax/removeuser.php:24 msgid "Unable to delete user" -msgstr "" +msgstr "לא ניתן למחוק את המשתמש" #: ajax/setlanguage.php:15 msgid "Language changed" @@ -70,17 +70,17 @@ msgstr "שפה השתנתה" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים" #: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" -msgstr "" +msgstr "לא ניתן להוסיף משתמש לקבוצה %s" #: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" -msgstr "" +msgstr "לא ניתן להסיר משתמש מהקבוצה %s" #: js/apps.js:28 js/apps.js:67 msgid "Disable" @@ -104,7 +104,7 @@ msgstr "הוספת היישום שלך" #: templates/apps.php:11 msgid "More Apps" -msgstr "" +msgstr "יישומים נוספים" #: templates/apps.php:27 msgid "Select an App" @@ -116,7 +116,7 @@ msgstr "צפה בעמוד הישום ב apps.owncloud.com" #: templates/apps.php:32 msgid "-licensed by " -msgstr "" +msgstr "ברישיון לטובת " #: templates/help.php:9 msgid "Documentation" @@ -145,7 +145,7 @@ msgstr "מענה" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "" +msgstr "השתמשת ב־%s מתוך %s הזמינים לך" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" @@ -157,7 +157,7 @@ msgstr "הורדה" #: templates/personal.php:19 msgid "Your password was changed" -msgstr "" +msgstr "הססמה שלך הוחלפה" #: templates/personal.php:20 msgid "Unable to change your password" @@ -211,7 +211,7 @@ msgid "" "licensed under the AGPL." -msgstr "" +msgstr "פותח על די קהילתownCloud, קוד המקור מוגן ברישיון AGPL." #: templates/users.php:21 templates/users.php:76 msgid "Name" @@ -239,7 +239,7 @@ msgstr "אחר" #: templates/users.php:80 templates/users.php:112 msgid "Group Admin" -msgstr "" +msgstr "מנהל הקבוצה" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/it/files.po b/l10n/it/files.po index b3a9a50b6f..062fa2906f 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 01:41+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgstr "Non ci sono errori, file caricato con successo" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Il file caricato supera la direttiva upload_max_filesize in php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po index 5f02e64c25..c40ffb6fb0 100644 --- a/l10n/pt_BR/core.po +++ b/l10n/pt_BR/core.po @@ -5,6 +5,7 @@ # Translators: # , 2012. # , 2011. +# , 2012. # Guilherme Maluf Balzana , 2012. # , 2012. # , 2012. @@ -15,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 18:48+0000\n" +"Last-Translator: Schopfer \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -63,59 +64,59 @@ msgstr "Nenhuma categoria selecionada para deletar." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Configurações" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "segundos atrás" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minuto atrás" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minutos atrás" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "1 hora atrás" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "{hours} horas atrás" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "hoje" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "ontem" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} dias atrás" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "último mês" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "{months} meses atrás" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "meses atrás" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "último ano" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "anos atrás" @@ -145,8 +146,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Erro" @@ -247,15 +248,15 @@ msgstr "remover" msgid "share" msgstr "compartilhar" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "Protegido com senha" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "Erro ao remover data de expiração" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "Erro ao definir data de expiração" @@ -410,87 +411,87 @@ msgstr "Banco de dados do host" msgid "Finish setup" msgstr "Concluir configuração" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Domingo" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Segunda-feira" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Terça-feira" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Quarta-feira" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Quinta-feira" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Sexta-feira" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sábado" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Janeiro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Fevereiro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Março" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Maio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Junho" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Julho" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Agosto" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Setembro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Outubro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Novembro" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Dezembro" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "web services sob seu controle" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Sair" diff --git a/l10n/pt_BR/lib.po b/l10n/pt_BR/lib.po index cecfd4dd67..a42adb315b 100644 --- a/l10n/pt_BR/lib.po +++ b/l10n/pt_BR/lib.po @@ -4,14 +4,15 @@ # # Translators: # , 2012. +# , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 18:47+0000\n" +"Last-Translator: Schopfer \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +44,19 @@ msgstr "Aplicações" msgid "Admin" msgstr "Admin" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "Download ZIP está desligado." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Arquivos precisam ser baixados um de cada vez." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Voltar para Arquivos" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "Arquivos selecionados são muito grandes para gerar arquivo zip." @@ -98,12 +99,12 @@ msgstr "%d minutos atrás" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "1 hora atrás" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "%d horas atrás" #: template.php:108 msgid "today" @@ -125,7 +126,7 @@ msgstr "último mês" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "%d meses atrás" #: template.php:113 msgid "last year" @@ -151,4 +152,4 @@ msgstr "checagens de atualização estão desativadas" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Impossível localizar categoria \"%s\"" diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index ffcda156bf..8628e63a4d 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 00:41+0000\n" +"Last-Translator: Mouxy \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,7 +29,7 @@ msgstr "Sem erro, ficheiro enviado com sucesso" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "O ficheiro enviado excede o limite permitido na directiva do php.ini upload_max_filesize" #: ajax/upload.php:23 msgid "" diff --git a/l10n/sk_SK/core.po b/l10n/sk_SK/core.po index 820faf753d..711f713379 100644 --- a/l10n/sk_SK/core.po +++ b/l10n/sk_SK/core.po @@ -6,13 +6,14 @@ # , 2011, 2012. # , 2012. # Roman Priesol , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:24+0000\n" +"Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +23,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Neposkytnutý kategorický typ." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -36,18 +37,18 @@ msgstr "Táto kategória už existuje:" #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Neposkytnutý typ objektu." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "%s ID neposkytnuté." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Chyba pri pridávaní %s do obľúbených položiek." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -56,61 +57,61 @@ msgstr "Neboli vybrané žiadne kategórie pre odstránenie." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Chyba pri odstraňovaní %s z obľúbených položiek." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Nastavenia" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "pred sekundami" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "pred minútou" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "pred {minutes} minútami" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "Pred 1 hodinou." -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "Pred {hours} hodinami." -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "dnes" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "včera" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "pred {days} dňami" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "minulý mesiac" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "Pred {months} mesiacmi." -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "pred mesiacmi" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "minulý rok" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "pred rokmi" @@ -137,21 +138,21 @@ msgstr "Ok" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Nešpecifikovaný typ objektu." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Chyba" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "Nešpecifikované meno aplikácie." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "Požadovaný súbor {file} nie je inštalovaný!" #: js/share.js:124 msgid "Error while sharing" @@ -242,15 +243,15 @@ msgstr "zmazať" msgid "share" msgstr "zdieľať" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "Chránené heslom" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "Chyba pri odstraňovaní dátumu vypršania platnosti" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "Chyba pri nastavení dátumu vypršania platnosti" @@ -405,87 +406,87 @@ msgstr "Server databázy" msgid "Finish setup" msgstr "Dokončiť inštaláciu" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Nedeľa" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Pondelok" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Utorok" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Streda" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Štvrtok" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Piatok" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sobota" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Január" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Február" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Marec" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Apríl" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Máj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Jún" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Júl" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Október" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "December" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "webové služby pod vašou kontrolou" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Odhlásiť" diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po index ecb1b98c08..d55899f3b3 100644 --- a/l10n/sk_SK/files.po +++ b/l10n/sk_SK/files.po @@ -6,13 +6,14 @@ # , 2012. # , 2012. # Roman Priesol , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:18+0000\n" +"Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +28,7 @@ msgstr "Nenastala žiadna chyba, súbor bol úspešne nahraný" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Nahraný súbor predčil konfiguračnú direktívu upload_max_filesize v súbore php.ini:" #: ajax/upload.php:23 msgid "" @@ -107,7 +108,7 @@ msgstr "zmazané {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -148,7 +149,7 @@ msgstr "Opustenie stránky zruší práve prebiehajúce odosielanie súboru." #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nesprávne meno adresára. Použitie slova \"Shared\" (Zdieľané) je vyhradené službou ownCloud." #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/sk_SK/lib.po b/l10n/sk_SK/lib.po index fd68241526..ba1e859d9c 100644 --- a/l10n/sk_SK/lib.po +++ b/l10n/sk_SK/lib.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # Roman Priesol , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:27+0000\n" +"Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +44,19 @@ msgstr "Aplikácie" msgid "Admin" msgstr "Správca" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "Sťahovanie súborov ZIP je vypnuté." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Súbory musia byť nahrávané jeden za druhým." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Späť na súbory" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "Zvolené súbory sú príliž veľké na vygenerovanie zip súboru." @@ -98,12 +99,12 @@ msgstr "pred %d minútami" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "Pred 1 hodinou" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "Pred %d hodinami." #: template.php:108 msgid "today" @@ -125,7 +126,7 @@ msgstr "minulý mesiac" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "Pred %d mesiacmi." #: template.php:113 msgid "last year" @@ -151,4 +152,4 @@ msgstr "sledovanie aktualizácií je vypnuté" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Nemožno nájsť danú kategóriu \"%s\"" diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po index 6ece3cb550..b0b41c5f01 100644 --- a/l10n/sk_SK/settings.po +++ b/l10n/sk_SK/settings.po @@ -7,13 +7,14 @@ # , 2012. # Roman Priesol , 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:16+0000\n" +"Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -71,7 +72,7 @@ msgstr "Jazyk zmenený" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administrátori nesmú odstrániť sami seba zo skupiny admin" #: ajax/togglegroups.php:28 #, php-format @@ -146,7 +147,7 @@ msgstr "Odpoveď" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "" +msgstr "Použili ste %s z %s dostupných " #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" diff --git a/l10n/sk_SK/user_webdavauth.po b/l10n/sk_SK/user_webdavauth.po index fa57bbd15d..d38bbf56f0 100644 --- a/l10n/sk_SK/user_webdavauth.po +++ b/l10n/sk_SK/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 16:41+0000\n" +"Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV URL: http://" diff --git a/l10n/sr/files.po b/l10n/sr/files.po index 78494e11d2..2eac1068a2 100644 --- a/l10n/sr/files.po +++ b/l10n/sr/files.po @@ -5,13 +5,14 @@ # Translators: # Ivan Petrović , 2012. # Slobodan Terzić , 2011, 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 18:27+0000\n" +"Last-Translator: Rancher \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,26 +22,26 @@ msgstr "" #: ajax/upload.php:20 msgid "There is no error, the file uploaded with success" -msgstr "Нема грешке, фајл је успешно послат" +msgstr "Није дошло до грешке. Датотека је успешно отпремљена." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Отпремљена датотека прелази смерницу upload_max_filesize у датотеци php.ini:" #: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" -msgstr "Послати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми" +msgstr "Отпремљена датотека прелази смерницу MAX_FILE_SIZE која је наведена у HTML обрасцу" #: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" -msgstr "Послати фајл је само делимично отпремљен!" +msgstr "Датотека је делимично отпремљена" #: ajax/upload.php:26 msgid "No file was uploaded" -msgstr "Ниједан фајл није послат" +msgstr "Датотека није отпремљена" #: ajax/upload.php:27 msgid "Missing a temporary folder" @@ -48,11 +49,11 @@ msgstr "Недостаје привремена фасцикла" #: ajax/upload.php:28 msgid "Failed to write to disk" -msgstr "Није успело записивање на диск" +msgstr "Не могу да пишем на диск" #: appinfo/app.php:10 msgid "Files" -msgstr "Фајлови" +msgstr "Датотеке" #: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 msgid "Unshare" @@ -80,15 +81,15 @@ msgstr "предложи назив" #: js/filelist.js:201 js/filelist.js:203 msgid "cancel" -msgstr "поништи" +msgstr "откажи" #: js/filelist.js:250 msgid "replaced {new_name}" -msgstr "замењена са {new_name}" +msgstr "замењено {new_name}" #: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" -msgstr "врати" +msgstr "опозови" #: js/filelist.js:252 msgid "replaced {new_name} with {old_name}" @@ -96,29 +97,29 @@ msgstr "замењено {new_name} са {old_name}" #: js/filelist.js:284 msgid "unshared {files}" -msgstr "укинуто дељење над {files}" +msgstr "укинуто дељење {files}" #: js/filelist.js:286 msgid "deleted {files}" -msgstr "обриши {files}" +msgstr "обрисано {files}" #: js/files.js:33 msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." -msgstr "генерисање ЗИП датотеке, потрајаће неко време." +msgstr "правим ZIP датотеку…" #: js/files.js:218 msgid "Unable to upload your file as it is a directory or has 0 bytes" -msgstr "Није могуће послати датотеку или зато што је директоријуму или јој је величина 0 бајта" +msgstr "Не могу да отпремим датотеку као фасциклу или она има 0 бајтова" #: js/files.js:218 msgid "Upload Error" -msgstr "Грешка у слању" +msgstr "Грешка при отпремању" #: js/files.js:235 msgid "Close" @@ -130,36 +131,36 @@ msgstr "На чекању" #: js/files.js:274 msgid "1 file uploading" -msgstr "1 датотека се шаље" +msgstr "Отпремам 1 датотеку" #: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" -msgstr "Шаље се {count} датотека" +msgstr "Отпремам {count} датотеке/а" #: js/files.js:349 js/files.js:382 msgid "Upload cancelled." -msgstr "Слање је прекинуто." +msgstr "Отпремање је прекинуто." #: js/files.js:451 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." -msgstr "Слање датотеке је у току. Ако сада напустите страну слање ће бити прекинуто." +msgstr "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање." #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Неисправан назив фасцикле. „Дељено“ користи Оунклауд." #: js/files.js:704 msgid "{count} files scanned" -msgstr "{count} датотека се скенира" +msgstr "Скенирано датотека: {count}" #: js/files.js:712 msgid "error while scanning" -msgstr "грешка у скенирању" +msgstr "грешка при скенирању" #: js/files.js:785 templates/index.php:65 msgid "Name" -msgstr "Име" +msgstr "Назив" #: js/files.js:786 templates/index.php:76 msgid "Size" @@ -167,15 +168,15 @@ msgstr "Величина" #: js/files.js:787 templates/index.php:78 msgid "Modified" -msgstr "Задња измена" +msgstr "Измењено" #: js/files.js:814 msgid "1 folder" -msgstr "1 директоријум" +msgstr "1 фасцикла" #: js/files.js:816 msgid "{count} folders" -msgstr "{count} директоријума" +msgstr "{count} фасцикле/и" #: js/files.js:824 msgid "1 file" @@ -183,27 +184,27 @@ msgstr "1 датотека" #: js/files.js:826 msgid "{count} files" -msgstr "{count} датотека" +msgstr "{count} датотеке/а" #: templates/admin.php:5 msgid "File handling" -msgstr "Рад са датотекама" +msgstr "Управљање датотекама" #: templates/admin.php:7 msgid "Maximum upload size" -msgstr "Максимална величина пошиљке" +msgstr "Највећа величина датотеке" #: templates/admin.php:9 msgid "max. possible: " -msgstr "макс. величина:" +msgstr "највећа величина:" #: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." -msgstr "Неопходно за вишеструко преузимања датотека и директоријума." +msgstr "Неопходно за преузимање вишеделних датотека и фасцикли." #: templates/admin.php:14 msgid "Enable ZIP-download" -msgstr "Укључи преузимање у ЗИП-у" +msgstr "Омогући преузимање у ZIP-у" #: templates/admin.php:17 msgid "0 is unlimited" @@ -211,19 +212,19 @@ msgstr "0 је неограничено" #: templates/admin.php:19 msgid "Maximum input size for ZIP files" -msgstr "Максимална величина ЗИП датотека" +msgstr "Највећа величина ZIP датотека" #: templates/admin.php:23 msgid "Save" -msgstr "Сними" +msgstr "Сачувај" #: templates/index.php:7 msgid "New" -msgstr "Нови" +msgstr "Нова" #: templates/index.php:10 msgid "Text file" -msgstr "текстуални фајл" +msgstr "текстуална датотека" #: templates/index.php:12 msgid "Folder" @@ -231,19 +232,19 @@ msgstr "фасцикла" #: templates/index.php:14 msgid "From link" -msgstr "Са линка" +msgstr "Са везе" #: templates/index.php:35 msgid "Upload" -msgstr "Пошаљи" +msgstr "Отпреми" #: templates/index.php:43 msgid "Cancel upload" -msgstr "Прекини слање" +msgstr "Прекини отпремање" #: templates/index.php:57 msgid "Nothing in here. Upload something!" -msgstr "Овде нема ничег. Пошаљите нешто!" +msgstr "Овде нема ничег. Отпремите нешто!" #: templates/index.php:71 msgid "Download" @@ -251,18 +252,18 @@ msgstr "Преузми" #: templates/index.php:103 msgid "Upload too large" -msgstr "Пошиљка је превелика" +msgstr "Датотека је превелика" #: templates/index.php:105 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." -msgstr "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу." +msgstr "Датотеке које желите да отпремите прелазе ограничење у величини." #: templates/index.php:110 msgid "Files are being scanned, please wait." -msgstr "Скенирање датотека у току, молим вас сачекајте." +msgstr "Скенирам датотеке…" #: templates/index.php:113 msgid "Current scanning" -msgstr "Тренутно се скенира" +msgstr "Тренутно скенирање" diff --git a/l10n/sr/files_encryption.po b/l10n/sr/files_encryption.po index b1c6edcc0c..2d46f4f9b5 100644 --- a/l10n/sr/files_encryption.po +++ b/l10n/sr/files_encryption.po @@ -3,23 +3,24 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 20:46+0000\n" +"Last-Translator: Rancher \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Шифровање" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" @@ -27,8 +28,8 @@ msgstr "" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Ништа" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Омогући шифровање" diff --git a/l10n/sr/lib.po b/l10n/sr/lib.po index 1d93605a13..0ffcb3e09d 100644 --- a/l10n/sr/lib.po +++ b/l10n/sr/lib.po @@ -4,13 +4,14 @@ # # Translators: # Ivan Petrović , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"PO-Revision-Date: 2012-12-01 19:18+0000\n" +"Last-Translator: Rancher \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,33 +43,33 @@ msgstr "Апликације" msgid "Admin" msgstr "Администрација" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." -msgstr "Преузимање ЗИПа је искључено." +msgstr "Преузимање ZIP-а је искључено." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." -msgstr "Преузимање морате радити једану по једану." +msgstr "Датотеке морате преузимати једну по једну." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Назад на датотеке" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." -msgstr "Изабране датотеке су превелике да бисте правили зип датотеку." +msgstr "Изабране датотеке су превелике да бисте направили ZIP датотеку." #: json.php:28 msgid "Application is not enabled" -msgstr "Апликација није укључена" +msgstr "Апликација није омогућена" #: json.php:39 json.php:64 json.php:77 json.php:89 msgid "Authentication error" -msgstr "Грешка при аутентификацији" +msgstr "Грешка при провери идентитета" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "Токен је истекао. Поново учитајте страну." +msgstr "Жетон је истекао. Поново учитајте страницу." #: search/provider/file.php:17 search/provider/file.php:35 msgid "Files" @@ -88,21 +89,21 @@ msgstr "пре неколико секунди" #: template.php:104 msgid "1 minute ago" -msgstr "пре 1 минута" +msgstr "пре 1 минут" #: template.php:105 #, php-format msgid "%d minutes ago" -msgstr "%d минута раније" +msgstr "пре %d минута" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "пре 1 сат" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "пре %d сата/и" #: template.php:108 msgid "today" @@ -115,7 +116,7 @@ msgstr "јуче" #: template.php:110 #, php-format msgid "%d days ago" -msgstr "%d дана раније" +msgstr "пре %d дана" #: template.php:111 msgid "last month" @@ -124,7 +125,7 @@ msgstr "прошлог месеца" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "пре %d месеца/и" #: template.php:113 msgid "last year" @@ -137,17 +138,17 @@ msgstr "година раније" #: updater.php:75 #, php-format msgid "%s is available. Get more information" -msgstr "%s је доступна. Погледајте више информација" +msgstr "%s је доступна. Погледајте више информација." #: updater.php:77 msgid "up to date" -msgstr "је ажурна" +msgstr "је ажурна." #: updater.php:80 msgid "updates check is disabled" -msgstr "провера ажурирања је искључена" +msgstr "провера ажурирања је онемогућена." #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Не могу да пронађем категорију „%s“." diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 64fece6702..41f4f890ba 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index a37da4454f..5f70311e55 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 8e96b98b4b..2fb3ee3606 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index bc0874342a..2bab82e112 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 8dcff2d1b0..a049f5cf2a 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index f79ee5820a..457c6ed09e 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index d6fae106b3..82efa45aa6 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index f0593c89ad..49db7f9c9a 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index c2a7ecb596..a8733cf81a 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index eceaeea9dc..191fb7704f 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" +"POT-Creation-Date: 2012-12-02 00:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/lib/l10n/he.php b/lib/l10n/he.php index aa11a784e5..078a731afc 100644 --- a/lib/l10n/he.php +++ b/lib/l10n/he.php @@ -14,16 +14,21 @@ "Token expired. Please reload page." => "פג תוקף. נא לטעון שוב את הדף.", "Files" => "קבצים", "Text" => "טקסט", +"Images" => "תמונות", "seconds ago" => "שניות", "1 minute ago" => "לפני דקה אחת", "%d minutes ago" => "לפני %d דקות", +"1 hour ago" => "לפני שעה", +"%d hours ago" => "לפני %d שעות", "today" => "היום", "yesterday" => "אתמול", "%d days ago" => "לפני %d ימים", "last month" => "חודש שעבר", +"%d months ago" => "לפני %d חודשים", "last year" => "שנה שעברה", "years ago" => "שנים", "%s is available. Get more information" => "%s זמין. קבלת מידע נוסף", "up to date" => "עדכני", -"updates check is disabled" => "בדיקת עדכונים מנוטרלת" +"updates check is disabled" => "בדיקת עדכונים מנוטרלת", +"Could not find category \"%s\"" => "לא ניתן למצוא את הקטגוריה „%s“" ); diff --git a/lib/l10n/pt_BR.php b/lib/l10n/pt_BR.php index b46de858e2..fb7087d35d 100644 --- a/lib/l10n/pt_BR.php +++ b/lib/l10n/pt_BR.php @@ -18,13 +18,17 @@ "seconds ago" => "segundos atrás", "1 minute ago" => "1 minuto atrás", "%d minutes ago" => "%d minutos atrás", +"1 hour ago" => "1 hora atrás", +"%d hours ago" => "%d horas atrás", "today" => "hoje", "yesterday" => "ontem", "%d days ago" => "%d dias atrás", "last month" => "último mês", +"%d months ago" => "%d meses atrás", "last year" => "último ano", "years ago" => "anos atrás", "%s is available. Get more information" => "%s está disponível. Obtenha mais informações", "up to date" => "atualizado", -"updates check is disabled" => "checagens de atualização estão desativadas" +"updates check is disabled" => "checagens de atualização estão desativadas", +"Could not find category \"%s\"" => "Impossível localizar categoria \"%s\"" ); diff --git a/lib/l10n/sk_SK.php b/lib/l10n/sk_SK.php index 588933a437..98a5b5ca67 100644 --- a/lib/l10n/sk_SK.php +++ b/lib/l10n/sk_SK.php @@ -18,13 +18,17 @@ "seconds ago" => "pred sekundami", "1 minute ago" => "pred 1 minútou", "%d minutes ago" => "pred %d minútami", +"1 hour ago" => "Pred 1 hodinou", +"%d hours ago" => "Pred %d hodinami.", "today" => "dnes", "yesterday" => "včera", "%d days ago" => "pred %d dňami", "last month" => "minulý mesiac", +"%d months ago" => "Pred %d mesiacmi.", "last year" => "minulý rok", "years ago" => "pred rokmi", "%s is available. Get more information" => "%s je dostupné. Získať viac informácií", "up to date" => "aktuálny", -"updates check is disabled" => "sledovanie aktualizácií je vypnuté" +"updates check is disabled" => "sledovanie aktualizácií je vypnuté", +"Could not find category \"%s\"" => "Nemožno nájsť danú kategóriu \"%s\"" ); diff --git a/lib/l10n/sr.php b/lib/l10n/sr.php index 8c15082e37..2ae7400ba7 100644 --- a/lib/l10n/sr.php +++ b/lib/l10n/sr.php @@ -5,26 +5,30 @@ "Users" => "Корисници", "Apps" => "Апликације", "Admin" => "Администрација", -"ZIP download is turned off." => "Преузимање ЗИПа је искључено.", -"Files need to be downloaded one by one." => "Преузимање морате радити једану по једану.", +"ZIP download is turned off." => "Преузимање ZIP-а је искључено.", +"Files need to be downloaded one by one." => "Датотеке морате преузимати једну по једну.", "Back to Files" => "Назад на датотеке", -"Selected files too large to generate zip file." => "Изабране датотеке су превелике да бисте правили зип датотеку.", -"Application is not enabled" => "Апликација није укључена", -"Authentication error" => "Грешка при аутентификацији", -"Token expired. Please reload page." => "Токен је истекао. Поново учитајте страну.", +"Selected files too large to generate zip file." => "Изабране датотеке су превелике да бисте направили ZIP датотеку.", +"Application is not enabled" => "Апликација није омогућена", +"Authentication error" => "Грешка при провери идентитета", +"Token expired. Please reload page." => "Жетон је истекао. Поново учитајте страницу.", "Files" => "Датотеке", "Text" => "Текст", "Images" => "Слике", "seconds ago" => "пре неколико секунди", -"1 minute ago" => "пре 1 минута", -"%d minutes ago" => "%d минута раније", +"1 minute ago" => "пре 1 минут", +"%d minutes ago" => "пре %d минута", +"1 hour ago" => "пре 1 сат", +"%d hours ago" => "пре %d сата/и", "today" => "данас", "yesterday" => "јуче", -"%d days ago" => "%d дана раније", +"%d days ago" => "пре %d дана", "last month" => "прошлог месеца", +"%d months ago" => "пре %d месеца/и", "last year" => "прошле године", "years ago" => "година раније", -"%s is available. Get more information" => "%s је доступна. Погледајте више информација", -"up to date" => "је ажурна", -"updates check is disabled" => "провера ажурирања је искључена" +"%s is available. Get more information" => "%s је доступна. Погледајте више информација.", +"up to date" => "је ажурна.", +"updates check is disabled" => "провера ажурирања је онемогућена.", +"Could not find category \"%s\"" => "Не могу да пронађем категорију „%s“." ); diff --git a/settings/l10n/ca.php b/settings/l10n/ca.php index cd3701ed7c..eff84e12de 100644 --- a/settings/l10n/ca.php +++ b/settings/l10n/ca.php @@ -11,6 +11,7 @@ "Authentication error" => "Error d'autenticació", "Unable to delete user" => "No es pot eliminar l'usuari", "Language changed" => "S'ha canviat l'idioma", +"Admins can't remove themself from the admin group" => "Els administradors no es poden eliminar del grup admin", "Unable to add user to group %s" => "No es pot afegir l'usuari al grup %s", "Unable to remove user from group %s" => "No es pot eliminar l'usuari del grup %s", "Disable" => "Desactiva", diff --git a/settings/l10n/es.php b/settings/l10n/es.php index 13acbe9f24..39f88ac4ea 100644 --- a/settings/l10n/es.php +++ b/settings/l10n/es.php @@ -11,6 +11,7 @@ "Authentication error" => "Error de autenticación", "Unable to delete user" => "No se pudo eliminar el usuario", "Language changed" => "Idioma cambiado", +"Admins can't remove themself from the admin group" => "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" => "Imposible añadir el usuario al grupo %s", "Unable to remove user from group %s" => "Imposible eliminar al usuario del grupo %s", "Disable" => "Desactivar", diff --git a/settings/l10n/he.php b/settings/l10n/he.php index 818e5a8a37..f82cc83d9f 100644 --- a/settings/l10n/he.php +++ b/settings/l10n/he.php @@ -1,25 +1,38 @@ "לא ניתן לטעון רשימה מה־App Store", +"Group already exists" => "הקבוצה כבר קיימת", +"Unable to add group" => "לא ניתן להוסיף קבוצה", +"Could not enable app. " => "לא ניתן להפעיל את היישום", "Email saved" => "הדוא״ל נשמר", "Invalid email" => "דוא״ל לא חוקי", "OpenID Changed" => "OpenID השתנה", "Invalid request" => "בקשה לא חוקית", +"Unable to delete group" => "לא ניתן למחוק את הקבוצה", "Authentication error" => "שגיאת הזדהות", +"Unable to delete user" => "לא ניתן למחוק את המשתמש", "Language changed" => "שפה השתנתה", +"Admins can't remove themself from the admin group" => "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", +"Unable to add user to group %s" => "לא ניתן להוסיף משתמש לקבוצה %s", +"Unable to remove user from group %s" => "לא ניתן להסיר משתמש מהקבוצה %s", "Disable" => "בטל", "Enable" => "הפעל", "Saving..." => "שומר..", "__language_name__" => "עברית", "Add your App" => "הוספת היישום שלך", +"More Apps" => "יישומים נוספים", "Select an App" => "בחירת יישום", "See application page at apps.owncloud.com" => "צפה בעמוד הישום ב apps.owncloud.com", +"-licensed by " => "ברישיון לטובת ", "Documentation" => "תיעוד", "Managing Big Files" => "ניהול קבצים גדולים", "Ask a question" => "שאל שאלה", "Problems connecting to help database." => "בעיות בהתחברות לבסיס נתוני העזרה", "Go there manually." => "גש לשם באופן ידני", "Answer" => "מענה", +"You have used %s of the available %s" => "השתמשת ב־%s מתוך %s הזמינים לך", "Desktop and Mobile Syncing Clients" => "לקוחות סנכרון למחשב שולחני ולנייד", "Download" => "הורדה", +"Your password was changed" => "הססמה שלך הוחלפה", "Unable to change your password" => "לא ניתן לשנות את הססמה שלך", "Current password" => "ססמה נוכחית", "New password" => "ססמה חדשה", @@ -31,12 +44,14 @@ "Language" => "פה", "Help translate" => "עזרה בתרגום", "use this address to connect to your ownCloud in your file manager" => "השתמש בכתובת זו כדי להתחבר ל־ownCloude שלך ממנהל הקבצים", +"Developed by the ownCloud community, the source code is licensed under the AGPL." => "פותח על די קהילתownCloud, קוד המקור מוגן ברישיון AGPL.", "Name" => "שם", "Password" => "ססמה", "Groups" => "קבוצות", "Create" => "יצירה", "Default Quota" => "מכסת בררת המחדל", "Other" => "אחר", +"Group Admin" => "מנהל הקבוצה", "Quota" => "מכסה", "Delete" => "מחיקה" ); diff --git a/settings/l10n/sk_SK.php b/settings/l10n/sk_SK.php index 31200c3744..179cbe250b 100644 --- a/settings/l10n/sk_SK.php +++ b/settings/l10n/sk_SK.php @@ -11,6 +11,7 @@ "Authentication error" => "Chyba pri autentifikácii", "Unable to delete user" => "Nie je možné odstrániť používateľa", "Language changed" => "Jazyk zmenený", +"Admins can't remove themself from the admin group" => "Administrátori nesmú odstrániť sami seba zo skupiny admin", "Unable to add user to group %s" => "Nie je možné pridať užívateľa do skupiny %s", "Unable to remove user from group %s" => "Nie je možné odstrániť používateľa zo skupiny %s", "Disable" => "Zakázať", @@ -28,6 +29,7 @@ "Problems connecting to help database." => "Problémy s pripojením na databázu pomocníka.", "Go there manually." => "Prejsť tam ručne.", "Answer" => "Odpoveď", +"You have used %s of the available %s" => "Použili ste %s z %s dostupných ", "Desktop and Mobile Syncing Clients" => "Klienti pre synchronizáciu", "Download" => "Stiahnúť", "Your password was changed" => "Heslo bolo zmenené", From d3ea7feb6bd3a8b9e1af11d39c79aa0762ad6f9b Mon Sep 17 00:00:00 2001 From: Isaac Rosenberg Date: Sat, 1 Dec 2012 21:13:08 -0500 Subject: [PATCH 401/481] Update lib/image.php Corrected simple typo --- lib/image.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/image.php b/lib/image.php index e93df02f24..2043a45254 100644 --- a/lib/image.php +++ b/lib/image.php @@ -753,7 +753,7 @@ class OC_Image { * @param $x Horizontal position * @param $y Vertical position * @param $w Width - * @param $h Hight + * @param $h Height * @returns bool for success or failure */ public function crop($x, $y, $w, $h) { From 35e55214e24116a4501260ff4ce94c171404737b Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Sun, 2 Dec 2012 11:54:30 +0100 Subject: [PATCH 402/481] [Contacts API] example for searching added --- lib/public/contacts.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/public/contacts.php b/lib/public/contacts.php index 412600dd7f..6842f40f1b 100644 --- a/lib/public/contacts.php +++ b/lib/public/contacts.php @@ -102,6 +102,38 @@ namespace OCP { * 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) { + * // The API is not active -> nothing to do + * if (!\OCP\Contacts::isEnabled()) { + * return array(); + * } + * + * $result = \OCP\Contacts::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! From bafb78ac94f2f2c7afd6a50e425944b7fd633086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Fri, 30 Nov 2012 13:04:15 +0100 Subject: [PATCH 403/481] fix regression in file versioning for shared files --- apps/files_versions/lib/versions.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index dc83ab12af..78f4181ebd 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -58,8 +58,8 @@ class Storage { public function store($filename) { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $files_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/files'); - $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + $files_view = new \OC_FilesystemView('/'.$uid .'/files'); + $users_view = new \OC_FilesystemView('/'.$uid); //check if source file already exist as version to avoid recursions. // todo does this check work? @@ -94,7 +94,7 @@ class Storage { // check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval) if ($uid == \OCP\User::getUser()) { - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.uid.'/files_versions'); $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); $matches=glob($versionsName.'.v*'); @@ -128,7 +128,7 @@ class Storage { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + $users_view = new \OC_FilesystemView('/'.$uid); // rollback if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) { @@ -151,7 +151,7 @@ class Storage { public static function isversioned($filename) { if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); @@ -178,7 +178,7 @@ class Storage { public static function getVersions( $filename, $count = 0 ) { if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); $versionsName = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); $versions = array(); From f66ebea5ca019a05753820b84d36ae99c13bd972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Sun, 2 Dec 2012 12:50:07 +0100 Subject: [PATCH 404/481] fix typo in variable name --- apps/files_versions/lib/versions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 78f4181ebd..0ccaaf1095 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -94,7 +94,7 @@ class Storage { // check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval) if ($uid == \OCP\User::getUser()) { - $versions_fileview = new \OC_FilesystemView('/'.uid.'/files_versions'); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); $matches=glob($versionsName.'.v*'); From 3d5ffebb52e81e4e1f711c17b2b6b3009ea3ab67 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Sat, 24 Nov 2012 20:28:19 +0300 Subject: [PATCH 405/481] Clean KB entries processing code --- lib/ocsclient.php | 59 ++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/lib/ocsclient.php b/lib/ocsclient.php index e730b159af..12e5026a87 100644 --- a/lib/ocsclient.php +++ b/lib/ocsclient.php @@ -214,39 +214,34 @@ class OC_OCSClient{ * This function returns a list of all the knowledgebase entries from the OCS server */ public static function getKnownledgebaseEntries($page, $pagesize, $search='') { - if(OC_Config::getValue('knowledgebaseenabled', true)==false) { - $kbe=array(); - $kbe['totalitems']=0; - return $kbe; + $kbe = array('totalitems' => 0); + if(OC_Config::getValue('knowledgebaseenabled', true)) { + $p = (int) $page; + $s = (int) $pagesize; + $searchcmd = ''; + if ($search) { + $searchcmd = '&search='.urlencode($search); + } + $url = OC_OCSClient::getKBURL().'/knowledgebase/data?type=150&page='. $p .'&pagesize='. $s . $searchcmd; + $xml = OC_OCSClient::getOCSresponse($url); + $data = @simplexml_load_string($xml); + if($data===false) { + OC_Log::write('core', 'Unable to parse knowledgebase content', OC_Log::FATAL); + return null; + } + $tmp = $data->data->content; + for($i = 0; $i < count($tmp); $i++) { + $kbe[] = array( + 'id' => $tmp[$i]->id, + 'name' => $tmp[$i]->name, + 'description' => $tmp[$i]->description, + 'answer' => $tmp[$i]->answer, + 'preview1' => $tmp[$i]->smallpreviewpic1, + 'detailpage' => $tmp[$i]->detailpage + ); + } + $kbe['totalitems'] = $data->meta->totalitems; } - - $p= (int) $page; - $s= (int) $pagesize; - if($search<>'') $searchcmd='&search='.urlencode($search); else $searchcmd=''; - $url=OC_OCSClient::getKBURL().'/knowledgebase/data?type=150&page='.$p.'&pagesize='.$s.$searchcmd; - - $kbe=array(); - $xml=OC_OCSClient::getOCSresponse($url); - - if($xml==false) { - OC_Log::write('core', 'Unable to parse knowledgebase content', OC_Log::FATAL); - return null; - } - $data=simplexml_load_string($xml); - - $tmp=$data->data->content; - for($i = 0; $i < count($tmp); $i++) { - $kb=array(); - $kb['id']=$tmp[$i]->id; - $kb['name']=$tmp[$i]->name; - $kb['description']=$tmp[$i]->description; - $kb['answer']=$tmp[$i]->answer; - $kb['preview1']=$tmp[$i]->smallpreviewpic1; - $kb['detailpage']=$tmp[$i]->detailpage; - $kbe[]=$kb; - } - $total=$data->meta->totalitems; - $kbe['totalitems']=$total; return $kbe; } From 6a211f3fa15e371a6b0981cae1e230ec613734a8 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Sun, 2 Dec 2012 22:24:14 +0300 Subject: [PATCH 406/481] Check if we have an array with data. Fix #487 --- settings/templates/help.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/templates/help.php b/settings/templates/help.php index 9bb46740f5..75201a86a9 100644 --- a/settings/templates/help.php +++ b/settings/templates/help.php @@ -17,7 +17,7 @@ } ?> - +

    t('Problems connecting to help database.');?>

    t('Go there manually.');?>

    From f4d7955fe6f6531fda3b8d7e51a117d548a44002 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Mon, 3 Dec 2012 00:05:40 +0100 Subject: [PATCH 407/481] [tx-robot] updated from transifex --- apps/files/l10n/el.php | 1 + apps/files/l10n/eo.php | 4 +++- apps/files/l10n/gl.php | 3 +++ apps/files/l10n/pt_BR.php | 3 +++ core/l10n/eo.php | 3 +++ core/l10n/pt_BR.php | 8 ++++++++ l10n/ar/settings.po | 8 ++++---- l10n/bg_BG/settings.po | 4 ++-- l10n/ca/settings.po | 4 ++-- l10n/cs_CZ/settings.po | 4 ++-- l10n/da/settings.po | 4 ++-- l10n/de/settings.po | 4 ++-- l10n/de_DE/settings.po | 4 ++-- l10n/el/files.po | 8 ++++---- l10n/el/settings.po | 8 ++++---- l10n/eo/core.po | 20 ++++++++++---------- l10n/eo/files.po | 12 ++++++------ l10n/eo/lib.po | 24 ++++++++++++------------ l10n/eo/settings.po | 12 ++++++------ l10n/es/settings.po | 4 ++-- l10n/es_AR/settings.po | 4 ++-- l10n/et_EE/settings.po | 4 ++-- l10n/eu/settings.po | 4 ++-- l10n/fa/settings.po | 4 ++-- l10n/fi_FI/settings.po | 4 ++-- l10n/fr/settings.po | 4 ++-- l10n/gl/files.po | 12 ++++++------ l10n/gl/settings.po | 8 ++++---- l10n/he/settings.po | 4 ++-- l10n/hi/settings.po | 6 +++--- l10n/hr/settings.po | 4 ++-- l10n/hu_HU/settings.po | 4 ++-- l10n/ia/settings.po | 4 ++-- l10n/id/settings.po | 4 ++-- l10n/it/settings.po | 4 ++-- l10n/ja_JP/settings.po | 4 ++-- l10n/ka_GE/settings.po | 4 ++-- l10n/ko/settings.po | 4 ++-- l10n/ku_IQ/settings.po | 4 ++-- l10n/lb/settings.po | 4 ++-- l10n/lt_LT/settings.po | 4 ++-- l10n/lv/settings.po | 4 ++-- l10n/mk/settings.po | 4 ++-- l10n/ms_MY/settings.po | 4 ++-- l10n/nb_NO/settings.po | 4 ++-- l10n/nl/settings.po | 4 ++-- l10n/nn_NO/settings.po | 4 ++-- l10n/oc/settings.po | 4 ++-- l10n/pl/settings.po | 4 ++-- l10n/pl_PL/settings.po | 4 ++-- l10n/pt_BR/core.po | 23 ++++++++++++----------- l10n/pt_BR/files.po | 13 +++++++------ l10n/pt_BR/settings.po | 9 +++++---- l10n/pt_PT/settings.po | 4 ++-- l10n/ro/settings.po | 4 ++-- l10n/ru/settings.po | 4 ++-- l10n/ru_RU/settings.po | 4 ++-- l10n/si_LK/settings.po | 4 ++-- l10n/sk_SK/settings.po | 4 ++-- l10n/sl/settings.po | 4 ++-- l10n/sq/settings.po | 4 ++-- l10n/sr/settings.po | 6 +++--- l10n/sr@latin/settings.po | 4 ++-- l10n/sv/settings.po | 4 ++-- l10n/ta_LK/settings.po | 4 ++-- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 4 ++-- l10n/templates/files_external.pot | 25 +++++++++++++------------ l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/settings.po | 4 ++-- l10n/tr/settings.po | 4 ++-- l10n/uk/settings.po | 4 ++-- l10n/vi/settings.po | 4 ++-- l10n/zh_CN.GB2312/settings.po | 4 ++-- l10n/zh_CN/settings.po | 4 ++-- l10n/zh_HK/settings.po | 4 ++-- l10n/zh_TW/settings.po | 4 ++-- l10n/zu_ZA/settings.po | 4 ++-- lib/l10n/eo.php | 7 ++++++- settings/l10n/ar.php | 2 ++ settings/l10n/el.php | 1 + settings/l10n/eo.php | 3 +++ settings/l10n/gl.php | 1 + settings/l10n/hi.php | 1 + settings/l10n/pt_BR.php | 1 + settings/l10n/sr.php | 1 + 92 files changed, 254 insertions(+), 215 deletions(-) diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index f9c1d6d47b..ddbea42124 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -1,5 +1,6 @@ "Δεν υπάρχει σφάλμα, το αρχείο εστάλει επιτυχώς", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Το απεσταλμένο αρχείο ξεπερνά την οδηγία upload_max_filesize στο php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το αρχείο υπερβαίνει την οδηγία μέγιστου επιτρεπτού μεγέθους \"MAX_FILE_SIZE\" που έχει οριστεί στην HTML φόρμα", "The uploaded file was only partially uploaded" => "Το αρχείο εστάλει μόνο εν μέρει", "No file was uploaded" => "Κανένα αρχείο δεν στάλθηκε", diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 3d918b196c..bdde6d0fec 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -1,6 +1,7 @@ "Ne estas eraro, la dosiero alŝutiĝis sukcese", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La dosiero alŝutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "La dosiero alŝutita superas la regulon upload_max_filesize el php.ini: ", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La dosiero alŝutita superas la regulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo", "The uploaded file was only partially uploaded" => "La alŝutita dosiero nur parte alŝutiĝis", "No file was uploaded" => "Neniu dosiero estas alŝutita", "Missing a temporary folder" => "Mankas tempa dosierujo", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "anstataŭiĝis {new_name} per {old_name}", "unshared {files}" => "malkunhaviĝis {files}", "deleted {files}" => "foriĝis {files}", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nevalida nomo: “\\”, “/”, “<”, “>”, “:”, “\"”, “|”, “?” kaj “*” ne permesatas.", "generating ZIP-file, it may take some time." => "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo", "Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn", "Upload Error" => "Alŝuta eraro", diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index 868f99ec52..5c50e3764c 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -1,5 +1,6 @@ "Non hai erros. O ficheiro enviouse correctamente", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O ficheiro subido excede a directiva indicada polo tamaño_máximo_de_subida de php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado supera a directiva MAX_FILE_SIZE que foi indicada no formulario HTML", "The uploaded file was only partially uploaded" => "O ficheiro enviado foi só parcialmente enviado", "No file was uploaded" => "Non se enviou ningún ficheiro", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "substituír {new_name} polo {old_name}", "unshared {files}" => "{files} sen compartir", "deleted {files}" => "{files} eliminados", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non válido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non se permiten.", "generating ZIP-file, it may take some time." => "xerando un ficheiro ZIP, o que pode levar un anaco.", "Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes", "Upload Error" => "Erro na subida", @@ -27,6 +29,7 @@ "{count} files uploading" => "{count} ficheiros subíndose", "Upload cancelled." => "Subida cancelada.", "File upload is in progress. Leaving the page now will cancel the upload." => "A subida do ficheiro está en curso. Saír agora da páxina cancelará a subida.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nome de cartafol non válido. O uso de \"compartido\" está reservado exclusivamente para ownCloud", "{count} files scanned" => "{count} ficheiros escaneados", "error while scanning" => "erro mentres analizaba", "Name" => "Nome", diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index 5b7dfaaf61..97e5c94fb3 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -1,5 +1,6 @@ "Não houve nenhum erro, o arquivo foi transferido com sucesso", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O arquivo enviado excede a diretiva upload_max_filesize no php.ini: ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O arquivo carregado excede o MAX_FILE_SIZE que foi especificado no formulário HTML", "The uploaded file was only partially uploaded" => "O arquivo foi transferido parcialmente", "No file was uploaded" => "Nenhum arquivo foi transferido", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "Substituído {old_name} por {new_name} ", "unshared {files}" => "{files} não compartilhados", "deleted {files}" => "{files} apagados", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.", "generating ZIP-file, it may take some time." => "gerando arquivo ZIP, isso pode levar um tempo.", "Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes.", "Upload Error" => "Erro de envio", @@ -27,6 +29,7 @@ "{count} files uploading" => "Enviando {count} arquivos", "Upload cancelled." => "Envio cancelado.", "File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "Nome de pasta inválido. O nome \"Shared\" é reservado pelo Owncloud", "{count} files scanned" => "{count} arquivos scaneados", "error while scanning" => "erro durante verificação", "Name" => "Nome", diff --git a/core/l10n/eo.php b/core/l10n/eo.php index b61dbf1427..4674c8c357 100644 --- a/core/l10n/eo.php +++ b/core/l10n/eo.php @@ -4,7 +4,9 @@ "This category already exists: " => "Ĉi tiu kategorio jam ekzistas: ", "Object type not provided." => "Ne proviziĝis tipon de objekto.", "%s ID not provided." => "Ne proviziĝis ID-on de %s.", +"Error adding %s to favorites." => "Eraro dum aldono de %s al favoratoj.", "No categories selected for deletion." => "Neniu kategorio elektiĝis por forigo.", +"Error removing %s from favorites." => "Eraro dum forigo de %s el favoratoj.", "Settings" => "Agordo", "seconds ago" => "sekundoj antaŭe", "1 minute ago" => "antaŭ 1 minuto", @@ -73,6 +75,7 @@ "Edit categories" => "Redakti kategoriojn", "Add" => "Aldoni", "Security Warning" => "Sekureca averto", +"No secure random number generator is available, please enable the PHP OpenSSL extension." => "Ne disponeblas sekura generilo de hazardaj numeroj; bonvolu kapabligi la OpenSSL-kromaĵon por PHP.", "Create an admin account" => "Krei administran konton", "Advanced" => "Progresinta", "Data folder" => "Datuma dosierujo", diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php index 6782cc1ebf..f28b003599 100644 --- a/core/l10n/pt_BR.php +++ b/core/l10n/pt_BR.php @@ -1,7 +1,12 @@ "Tipo de categoria não fornecido.", "No category to add?" => "Nenhuma categoria adicionada?", "This category already exists: " => "Essa categoria já existe", +"Object type not provided." => "tipo de objeto não fornecido.", +"%s ID not provided." => "%s ID não fornecido(s).", +"Error adding %s to favorites." => "Erro ao adicionar %s aos favoritos.", "No categories selected for deletion." => "Nenhuma categoria selecionada para deletar.", +"Error removing %s from favorites." => "Erro ao remover %s dos favoritos.", "Settings" => "Configurações", "seconds ago" => "segundos atrás", "1 minute ago" => "1 minuto atrás", @@ -21,7 +26,10 @@ "No" => "Não", "Yes" => "Sim", "Ok" => "Ok", +"The object type is not specified." => "O tipo de objeto não foi especificado.", "Error" => "Erro", +"The app name is not specified." => "O nome do app não foi especificado.", +"The required file {file} is not installed!" => "O arquivo {file} necessário não está instalado!", "Error while sharing" => "Erro ao compartilhar", "Error while unsharing" => "Erro ao descompartilhar", "Error while changing permissions" => "Erro ao mudar permissões", diff --git a/l10n/ar/settings.po b/l10n/ar/settings.po index 6310ebe7cf..e84963aded 100644 --- a/l10n/ar/settings.po +++ b/l10n/ar/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -91,7 +91,7 @@ msgstr "" #: js/personal.js:69 msgid "Saving..." -msgstr "" +msgstr "حفظ" #: personal.php:42 personal.php:43 msgid "__language_name__" @@ -119,7 +119,7 @@ msgstr "" #: templates/help.php:9 msgid "Documentation" -msgstr "" +msgstr "التوثيق" #: templates/help.php:10 msgid "Managing Big Files" diff --git a/l10n/bg_BG/settings.po b/l10n/bg_BG/settings.po index a4ec810db8..3b8329c58b 100644 --- a/l10n/bg_BG/settings.po +++ b/l10n/bg_BG/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po index d87a9e5a34..b17a5d30e3 100644 --- a/l10n/ca/settings.po +++ b/l10n/ca/settings.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 16:58+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Josep Tomàs \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po index 0dbbf69983..e2e213e5fc 100644 --- a/l10n/cs_CZ/settings.po +++ b/l10n/cs_CZ/settings.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 06:45+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/da/settings.po b/l10n/da/settings.po index 4545d6306f..948c398c07 100644 --- a/l10n/da/settings.po +++ b/l10n/da/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/de/settings.po b/l10n/de/settings.po index 5f9c142115..d282615810 100644 --- a/l10n/de/settings.po +++ b/l10n/de/settings.po @@ -23,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/de_DE/settings.po b/l10n/de_DE/settings.po index 6bade1820b..cc633c1c24 100644 --- a/l10n/de_DE/settings.po +++ b/l10n/de_DE/settings.po @@ -22,8 +22,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/el/files.po b/l10n/el/files.po index eea5102149..85209f363a 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 11:20+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,7 +30,7 @@ msgstr "Δεν υπάρχει σφάλμα, το αρχείο εστάλει ε #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Το απεσταλμένο αρχείο ξεπερνά την οδηγία upload_max_filesize στο php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/el/settings.po b/l10n/el/settings.po index e6ff75bf80..62961834e0 100644 --- a/l10n/el/settings.po +++ b/l10n/el/settings.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 11:21+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -78,7 +78,7 @@ msgstr "Η γλώσσα άλλαξε" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/eo/core.po b/l10n/eo/core.po index b6504a6e24..759c54ff16 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-24 00:01+0100\n" -"PO-Revision-Date: 2012-11-23 20:03+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 23:00+0000\n" "Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -47,7 +47,7 @@ msgstr "Ne proviziĝis ID-on de %s." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Eraro dum aldono de %s al favoratoj." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -56,7 +56,7 @@ msgstr "Neniu kategorio elektiĝis por forigo." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Eraro dum forigo de %s el favoratoj." #: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" @@ -140,8 +140,8 @@ msgid "The object type is not specified." msgstr "Ne indikiĝis tipo de la objekto." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Eraro" @@ -242,15 +242,15 @@ msgstr "forigi" msgid "share" msgstr "kunhavigi" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "Protektita per pasvorto" -#: js/share.js:527 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "Eraro dum malagordado de limdato" -#: js/share.js:539 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "Eraro dum agordado de limdato" @@ -343,7 +343,7 @@ msgstr "Sekureca averto" msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." -msgstr "" +msgstr "Ne disponeblas sekura generilo de hazardaj numeroj; bonvolu kapabligi la OpenSSL-kromaĵon por PHP." #: templates/installation.php:26 msgid "" diff --git a/l10n/eo/files.po b/l10n/eo/files.po index c4c42339ac..98d1dba639 100644 --- a/l10n/eo/files.po +++ b/l10n/eo/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 22:06+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,13 +26,13 @@ msgstr "Ne estas eraro, la dosiero alŝutiĝis sukcese" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "La dosiero alŝutita superas la regulon upload_max_filesize el php.ini: " #: ajax/upload.php:23 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" -msgstr "La dosiero alŝutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo" +msgstr "La dosiero alŝutita superas la regulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo" #: ajax/upload.php:25 msgid "The uploaded file was only partially uploaded" @@ -106,7 +106,7 @@ msgstr "foriĝis {files}" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nevalida nomo: “\\”, “/”, “<”, “>”, “:”, “\"”, “|”, “?” kaj “*” ne permesatas." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." diff --git a/l10n/eo/lib.po b/l10n/eo/lib.po index f733202ac6..b4a219e21a 100644 --- a/l10n/eo/lib.po +++ b/l10n/eo/lib.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 21:42+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,19 +42,19 @@ msgstr "Aplikaĵoj" msgid "Admin" msgstr "Administranto" -#: files.php:332 +#: files.php:361 msgid "ZIP download is turned off." msgstr "ZIP-elŝuto estas malkapabligita." -#: files.php:333 +#: files.php:362 msgid "Files need to be downloaded one by one." msgstr "Dosieroj devas elŝutiĝi unuope." -#: files.php:333 files.php:358 +#: files.php:362 files.php:387 msgid "Back to Files" msgstr "Reen al la dosieroj" -#: files.php:357 +#: files.php:386 msgid "Selected files too large to generate zip file." msgstr "La elektitaj dosieroj tro grandas por genero de ZIP-dosiero." @@ -80,7 +80,7 @@ msgstr "Teksto" #: search/provider/file.php:29 msgid "Images" -msgstr "" +msgstr "Bildoj" #: template.php:103 msgid "seconds ago" @@ -97,12 +97,12 @@ msgstr "antaŭ %d minutoj" #: template.php:106 msgid "1 hour ago" -msgstr "" +msgstr "antaŭ 1 horo" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "" +msgstr "antaŭ %d horoj" #: template.php:108 msgid "today" @@ -124,7 +124,7 @@ msgstr "lasta monato" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "" +msgstr "antaŭ %d monatoj" #: template.php:113 msgid "last year" @@ -150,4 +150,4 @@ msgstr "ĝisdateckontrolo estas malkapabligita" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "" +msgstr "Ne troviĝis kategorio “%s”" diff --git a/l10n/eo/settings.po b/l10n/eo/settings.po index 6f14e83e5f..49a5a9135e 100644 --- a/l10n/eo/settings.po +++ b/l10n/eo/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 22:14+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -69,7 +69,7 @@ msgstr "La lingvo estas ŝanĝita" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administrantoj ne povas forigi sin mem el la administra grupo." #: ajax/togglegroups.php:28 #, php-format @@ -144,7 +144,7 @@ msgstr "Respondi" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "" +msgstr "Vi uzas %s el la haveblaj %s" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" @@ -210,7 +210,7 @@ msgid "" "licensed under the AGPL." -msgstr "" +msgstr "Ellaborita de la komunumo de ownCloud, la fontokodo publikas laŭ la permesilo AGPL." #: templates/users.php:21 templates/users.php:76 msgid "Name" diff --git a/l10n/es/settings.po b/l10n/es/settings.po index cddf430646..8e8c25c4e2 100644 --- a/l10n/es/settings.po +++ b/l10n/es/settings.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 20:49+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: xsergiolpx \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/es_AR/settings.po b/l10n/es_AR/settings.po index debe69a626..b52e9fbc91 100644 --- a/l10n/es_AR/settings.po +++ b/l10n/es_AR/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/et_EE/settings.po b/l10n/et_EE/settings.po index 3caa027b5a..d758c91271 100644 --- a/l10n/et_EE/settings.po +++ b/l10n/et_EE/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po index 775a959f73..58ef06e8a6 100644 --- a/l10n/eu/settings.po +++ b/l10n/eu/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fa/settings.po b/l10n/fa/settings.po index 3c7b819608..e0c3b853c8 100644 --- a/l10n/fa/settings.po +++ b/l10n/fa/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 14:39+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: ho2o2oo \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fi_FI/settings.po b/l10n/fi_FI/settings.po index f2b6937d17..d7f6f888d4 100644 --- a/l10n/fi_FI/settings.po +++ b/l10n/fi_FI/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po index 32ef15c211..a443aba93f 100644 --- a/l10n/fr/settings.po +++ b/l10n/fr/settings.po @@ -20,8 +20,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/gl/files.po b/l10n/gl/files.po index 93132eddc5..d44302b22d 100644 --- a/l10n/gl/files.po +++ b/l10n/gl/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 21:51+0000\n" +"Last-Translator: Miguel Branco \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +26,7 @@ msgstr "Non hai erros. O ficheiro enviouse correctamente" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "O ficheiro subido excede a directiva indicada polo tamaño_máximo_de_subida de php.ini" #: ajax/upload.php:23 msgid "" @@ -106,7 +106,7 @@ msgstr "{files} eliminados" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nome non válido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non se permiten." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -147,7 +147,7 @@ msgstr "A subida do ficheiro está en curso. Saír agora da páxina cancelará a #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nome de cartafol non válido. O uso de \"compartido\" está reservado exclusivamente para ownCloud" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/gl/settings.po b/l10n/gl/settings.po index 414d7edb14..335d35593b 100644 --- a/l10n/gl/settings.po +++ b/l10n/gl/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 21:49+0000\n" +"Last-Translator: Miguel Branco \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -69,7 +69,7 @@ msgstr "O idioma mudou" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Os administradores non se pode eliminar a si mesmos do grupo admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/he/settings.po b/l10n/he/settings.po index 245b0b50b4..50e610dd37 100644 --- a/l10n/he/settings.po +++ b/l10n/he/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 06:31+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/hi/settings.po b/l10n/hi/settings.po index 54da734ea4..4f0ccd1433 100644 --- a/l10n/hi/settings.po +++ b/l10n/hi/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -166,7 +166,7 @@ msgstr "" #: templates/personal.php:22 msgid "New password" -msgstr "" +msgstr "नया पासवर्ड" #: templates/personal.php:23 msgid "show" diff --git a/l10n/hr/settings.po b/l10n/hr/settings.po index 13434df980..5410216db2 100644 --- a/l10n/hr/settings.po +++ b/l10n/hr/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po index 187f0bc7cd..f83e6251d1 100644 --- a/l10n/hu_HU/settings.po +++ b/l10n/hu_HU/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ia/settings.po b/l10n/ia/settings.po index e1670a1604..45647784ae 100644 --- a/l10n/ia/settings.po +++ b/l10n/ia/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/id/settings.po b/l10n/id/settings.po index be1beb4d29..478557f09e 100644 --- a/l10n/id/settings.po +++ b/l10n/id/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/it/settings.po b/l10n/it/settings.po index e79980dca1..2313377614 100644 --- a/l10n/it/settings.po +++ b/l10n/it/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-29 23:38+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po index c8c111d5d6..8d92134dba 100644 --- a/l10n/ja_JP/settings.po +++ b/l10n/ja_JP/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 01:02+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ka_GE/settings.po b/l10n/ka_GE/settings.po index 10893b5fb9..b957617cec 100644 --- a/l10n/ka_GE/settings.po +++ b/l10n/ka_GE/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po index a35f2371bb..1b4bacb26b 100644 --- a/l10n/ko/settings.po +++ b/l10n/ko/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ku_IQ/settings.po b/l10n/ku_IQ/settings.po index a735dc6ebc..c64763c9cf 100644 --- a/l10n/ku_IQ/settings.po +++ b/l10n/ku_IQ/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/lb/settings.po b/l10n/lb/settings.po index 8cecd15f02..2b969101b5 100644 --- a/l10n/lb/settings.po +++ b/l10n/lb/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/lt_LT/settings.po b/l10n/lt_LT/settings.po index 06d3e49173..10dd1bb7eb 100644 --- a/l10n/lt_LT/settings.po +++ b/l10n/lt_LT/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/lv/settings.po b/l10n/lv/settings.po index 42ea6eea5d..bb71a36d28 100644 --- a/l10n/lv/settings.po +++ b/l10n/lv/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/mk/settings.po b/l10n/mk/settings.po index 4382dd3cbd..b295cb7b66 100644 --- a/l10n/mk/settings.po +++ b/l10n/mk/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ms_MY/settings.po b/l10n/ms_MY/settings.po index 5c0bb24bc6..1de42e3e9c 100644 --- a/l10n/ms_MY/settings.po +++ b/l10n/ms_MY/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/nb_NO/settings.po b/l10n/nb_NO/settings.po index 711137497d..ab234540e2 100644 --- a/l10n/nb_NO/settings.po +++ b/l10n/nb_NO/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index e8fee6c901..1b28da61ba 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 10:57+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Len \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/nn_NO/settings.po b/l10n/nn_NO/settings.po index 7bb941c457..b38152f949 100644 --- a/l10n/nn_NO/settings.po +++ b/l10n/nn_NO/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/oc/settings.po b/l10n/oc/settings.po index 37e364fb5d..a4f159a9c5 100644 --- a/l10n/oc/settings.po +++ b/l10n/oc/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po index bcd1383d41..17eb403e70 100644 --- a/l10n/pl/settings.po +++ b/l10n/pl/settings.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/pl_PL/settings.po b/l10n/pl_PL/settings.po index 1a2dfb5a22..9b60235560 100644 --- a/l10n/pl_PL/settings.po +++ b/l10n/pl_PL/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po index c40ffb6fb0..58cb66c321 100644 --- a/l10n/pt_BR/core.po +++ b/l10n/pt_BR/core.po @@ -5,6 +5,7 @@ # Translators: # , 2012. # , 2011. +# , 2012. # , 2012. # Guilherme Maluf Balzana , 2012. # , 2012. @@ -16,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 18:48+0000\n" -"Last-Translator: Schopfer \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-01 23:28+0000\n" +"Last-Translator: FredMaranhao \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +29,7 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Tipo de categoria não fornecido." #: ajax/vcategories/add.php:30 msgid "No category to add?" @@ -42,18 +43,18 @@ msgstr "Essa categoria já existe" #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "tipo de objeto não fornecido." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "%s ID não fornecido(s)." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Erro ao adicionar %s aos favoritos." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -62,7 +63,7 @@ msgstr "Nenhuma categoria selecionada para deletar." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Erro ao remover %s dos favoritos." #: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" @@ -143,7 +144,7 @@ msgstr "Ok" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "O tipo de objeto não foi especificado." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 #: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 @@ -153,11 +154,11 @@ msgstr "Erro" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "O nome do app não foi especificado." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "O arquivo {file} necessário não está instalado!" #: js/share.js:124 msgid "Error while sharing" diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po index 81bc23bfb9..91ecfae55f 100644 --- a/l10n/pt_BR/files.po +++ b/l10n/pt_BR/files.po @@ -4,6 +4,7 @@ # # Translators: # , 2012. +# , 2012. # Guilherme Maluf Balzana , 2012. # , 2012. # , 2012. @@ -14,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-01 23:23+0000\n" +"Last-Translator: FredMaranhao \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +32,7 @@ msgstr "Não houve nenhum erro, o arquivo foi transferido com sucesso" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "O arquivo enviado excede a diretiva upload_max_filesize no php.ini: " #: ajax/upload.php:23 msgid "" @@ -111,7 +112,7 @@ msgstr "{files} apagados" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos." #: js/files.js:183 msgid "generating ZIP-file, it may take some time." @@ -152,7 +153,7 @@ msgstr "Upload em andamento. Sair da página agora resultará no cancelamento do #: js/files.js:523 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "Nome de pasta inválido. O nome \"Shared\" é reservado pelo Owncloud" #: js/files.js:704 msgid "{count} files scanned" diff --git a/l10n/pt_BR/settings.po b/l10n/pt_BR/settings.po index fc029c1373..a8b2a98a55 100644 --- a/l10n/pt_BR/settings.po +++ b/l10n/pt_BR/settings.po @@ -4,6 +4,7 @@ # # Translators: # , 2011. +# , 2012. # Guilherme Maluf Balzana , 2012. # , 2012. # Sandro Venezuela , 2012. @@ -15,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" +"Last-Translator: FredMaranhao \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -75,7 +76,7 @@ msgstr "Mudou Idioma" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Admins não podem se remover do grupo admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/pt_PT/settings.po b/l10n/pt_PT/settings.po index 71e00dc5a0..38b4491aa6 100644 --- a/l10n/pt_PT/settings.po +++ b/l10n/pt_PT/settings.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 01:44+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: Mouxy \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ro/settings.po b/l10n/ro/settings.po index 7a1c740b15..f963f93caf 100644 --- a/l10n/ro/settings.po +++ b/l10n/ro/settings.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ru/settings.po b/l10n/ru/settings.po index a90c2ca9df..8c3270fb08 100644 --- a/l10n/ru/settings.po +++ b/l10n/ru/settings.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ru_RU/settings.po b/l10n/ru_RU/settings.po index 753a9ef16d..fabcb82716 100644 --- a/l10n/ru_RU/settings.po +++ b/l10n/ru_RU/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/si_LK/settings.po b/l10n/si_LK/settings.po index c77635cd34..1bc5f94e9a 100644 --- a/l10n/si_LK/settings.po +++ b/l10n/si_LK/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po index b0b41c5f01..111c6ee3ec 100644 --- a/l10n/sk_SK/settings.po +++ b/l10n/sk_SK/settings.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 16:16+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: martin \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po index 80b325a36e..d8b32993d4 100644 --- a/l10n/sl/settings.po +++ b/l10n/sl/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sq/settings.po b/l10n/sq/settings.po index fbf5a7e21d..8857016c26 100644 --- a/l10n/sq/settings.po +++ b/l10n/sq/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sr/settings.po b/l10n/sr/settings.po index 1e34b5be24..1ee35e9cf0 100644 --- a/l10n/sr/settings.po +++ b/l10n/sr/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -118,7 +118,7 @@ msgstr "" #: templates/help.php:9 msgid "Documentation" -msgstr "" +msgstr "Документација" #: templates/help.php:10 msgid "Managing Big Files" diff --git a/l10n/sr@latin/settings.po b/l10n/sr@latin/settings.po index dc0210d88c..d871fb7eb2 100644 --- a/l10n/sr@latin/settings.po +++ b/l10n/sr@latin/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po index e37e4ecb36..4a9703d905 100644 --- a/l10n/sv/settings.po +++ b/l10n/sv/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ta_LK/settings.po b/l10n/ta_LK/settings.po index d3e7e2c193..4732ffd51c 100644 --- a/l10n/ta_LK/settings.po +++ b/l10n/ta_LK/settings.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 41f4f890ba..d66c9699d0 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 5f70311e55..317fa90ac6 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 2fb3ee3606..c44886a1db 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,6 +29,6 @@ msgstr "" msgid "None" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:12 msgid "Enable Encryption" msgstr "" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 2bab82e112..f89ffb9a85 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -45,7 +45,7 @@ msgstr "" msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:7 templates/settings.php:21 msgid "Mount point" msgstr "" @@ -65,42 +65,43 @@ msgstr "" msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:26 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:84 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:85 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:86 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:94 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:107 templates/settings.php:108 +#: templates/settings.php:148 templates/settings.php:149 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:123 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:124 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:138 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:157 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index a049f5cf2a..236ac473a8 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 457c6ed09e..55a2609887 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 82efa45aa6..f7bd22d456 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 49db7f9c9a..793ca34b3a 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index a8733cf81a..193d34358d 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 191fb7704f..847227c856 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/settings.po b/l10n/th_TH/settings.po index 9faf18df70..d15a654e58 100644 --- a/l10n/th_TH/settings.po +++ b/l10n/th_TH/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po index 721196eed8..df5e72846b 100644 --- a/l10n/tr/settings.po +++ b/l10n/tr/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po index 85fd27ccf8..a169a56596 100644 --- a/l10n/uk/settings.po +++ b/l10n/uk/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 09:53+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: volodya327 \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/vi/settings.po b/l10n/vi/settings.po index 7fb46b1f6a..63bd843d70 100644 --- a/l10n/vi/settings.po +++ b/l10n/vi/settings.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-29 23:17+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: mattheu_9x \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_CN.GB2312/settings.po b/l10n/zh_CN.GB2312/settings.po index 0f0d5333d5..8dee70c1dd 100644 --- a/l10n/zh_CN.GB2312/settings.po +++ b/l10n/zh_CN.GB2312/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_CN/settings.po b/l10n/zh_CN/settings.po index b79b28d744..073572833a 100644 --- a/l10n/zh_CN/settings.po +++ b/l10n/zh_CN/settings.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_HK/settings.po b/l10n/zh_HK/settings.po index fd4f4f1086..df89b1aac2 100644 --- a/l10n/zh_HK/settings.po +++ b/l10n/zh_HK/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_TW/settings.po b/l10n/zh_TW/settings.po index 5727548920..cc8fc8f62b 100644 --- a/l10n/zh_TW/settings.po +++ b/l10n/zh_TW/settings.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 01:19+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: dw4dev \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zu_ZA/settings.po b/l10n/zu_ZA/settings.po index 51a07c2359..34b89c8903 100644 --- a/l10n/zu_ZA/settings.po +++ b/l10n/zu_ZA/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:04+0100\n" -"PO-Revision-Date: 2012-11-29 23:04+0000\n" +"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"PO-Revision-Date: 2012-12-02 03:18+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" diff --git a/lib/l10n/eo.php b/lib/l10n/eo.php index f660c5743b..dac11ffe7e 100644 --- a/lib/l10n/eo.php +++ b/lib/l10n/eo.php @@ -14,16 +14,21 @@ "Token expired. Please reload page." => "Ĵetono eksvalidiĝis. Bonvolu reŝargi la paĝon.", "Files" => "Dosieroj", "Text" => "Teksto", +"Images" => "Bildoj", "seconds ago" => "sekundojn antaŭe", "1 minute ago" => "antaŭ 1 minuto", "%d minutes ago" => "antaŭ %d minutoj", +"1 hour ago" => "antaŭ 1 horo", +"%d hours ago" => "antaŭ %d horoj", "today" => "hodiaŭ", "yesterday" => "hieraŭ", "%d days ago" => "antaŭ %d tagoj", "last month" => "lasta monato", +"%d months ago" => "antaŭ %d monatoj", "last year" => "lasta jaro", "years ago" => "jarojn antaŭe", "%s is available. Get more information" => "%s haveblas. Ekhavu pli da informo", "up to date" => "ĝisdata", -"updates check is disabled" => "ĝisdateckontrolo estas malkapabligita" +"updates check is disabled" => "ĝisdateckontrolo estas malkapabligita", +"Could not find category \"%s\"" => "Ne troviĝis kategorio “%s”" ); diff --git a/settings/l10n/ar.php b/settings/l10n/ar.php index b095836c9e..662e69bbfc 100644 --- a/settings/l10n/ar.php +++ b/settings/l10n/ar.php @@ -3,8 +3,10 @@ "Invalid request" => "طلبك غير مفهوم", "Authentication error" => "لم يتم التأكد من الشخصية بنجاح", "Language changed" => "تم تغيير اللغة", +"Saving..." => "حفظ", "__language_name__" => "__language_name__", "Select an App" => "إختر تطبيقاً", +"Documentation" => "التوثيق", "Ask a question" => "إسأل سؤال", "Problems connecting to help database." => "الاتصال بقاعدة بيانات المساعدة لم يتم بنجاح", "Go there manually." => "إذهب هنالك بنفسك", diff --git a/settings/l10n/el.php b/settings/l10n/el.php index af3fd446ac..ac62453886 100644 --- a/settings/l10n/el.php +++ b/settings/l10n/el.php @@ -11,6 +11,7 @@ "Authentication error" => "Σφάλμα πιστοποίησης", "Unable to delete user" => "Αδυναμία διαγραφής χρήστη", "Language changed" => "Η γλώσσα άλλαξε", +"Admins can't remove themself from the admin group" => "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", "Unable to add user to group %s" => "Αδυναμία προσθήκη χρήστη στην ομάδα %s", "Unable to remove user from group %s" => "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", "Disable" => "Απενεργοποίηση", diff --git a/settings/l10n/eo.php b/settings/l10n/eo.php index 6d299d93ad..e686868e67 100644 --- a/settings/l10n/eo.php +++ b/settings/l10n/eo.php @@ -11,6 +11,7 @@ "Authentication error" => "Aŭtentiga eraro", "Unable to delete user" => "Ne eblis forigi la uzanton", "Language changed" => "La lingvo estas ŝanĝita", +"Admins can't remove themself from the admin group" => "Administrantoj ne povas forigi sin mem el la administra grupo.", "Unable to add user to group %s" => "Ne eblis aldoni la uzanton al la grupo %s", "Unable to remove user from group %s" => "Ne eblis forigi la uzantan el la grupo %s", "Disable" => "Malkapabligi", @@ -28,6 +29,7 @@ "Problems connecting to help database." => "Problemoj okazis dum konektado al la helpa datumbazo.", "Go there manually." => "Iri tien mane.", "Answer" => "Respondi", +"You have used %s of the available %s" => "Vi uzas %s el la haveblaj %s", "Desktop and Mobile Syncing Clients" => "Labortablaj kaj porteblaj sinkronigoklientoj", "Download" => "Elŝuti", "Your password was changed" => "Via pasvorto ŝanĝiĝis", @@ -42,6 +44,7 @@ "Language" => "Lingvo", "Help translate" => "Helpu traduki", "use this address to connect to your ownCloud in your file manager" => "uzu ĉi tiun adreson por konektiĝi al via ownCloud per via dosieradministrilo", +"Developed by the ownCloud community, the source code is licensed under the AGPL." => "Ellaborita de la komunumo de ownCloud, la fontokodo publikas laŭ la permesilo AGPL.", "Name" => "Nomo", "Password" => "Pasvorto", "Groups" => "Grupoj", diff --git a/settings/l10n/gl.php b/settings/l10n/gl.php index a719ac8eb9..1cde895d0d 100644 --- a/settings/l10n/gl.php +++ b/settings/l10n/gl.php @@ -11,6 +11,7 @@ "Authentication error" => "Erro na autenticación", "Unable to delete user" => "Non se pode eliminar o usuario", "Language changed" => "O idioma mudou", +"Admins can't remove themself from the admin group" => "Os administradores non se pode eliminar a si mesmos do grupo admin", "Unable to add user to group %s" => "Non se puido engadir o usuario ao grupo %s", "Unable to remove user from group %s" => "Non se puido eliminar o usuario do grupo %s", "Disable" => "Desactivar", diff --git a/settings/l10n/hi.php b/settings/l10n/hi.php index 560df54fc9..645b991a91 100644 --- a/settings/l10n/hi.php +++ b/settings/l10n/hi.php @@ -1,3 +1,4 @@ "नया पासवर्ड", "Password" => "पासवर्ड" ); diff --git a/settings/l10n/pt_BR.php b/settings/l10n/pt_BR.php index 399b0a1712..d09e867f7f 100644 --- a/settings/l10n/pt_BR.php +++ b/settings/l10n/pt_BR.php @@ -11,6 +11,7 @@ "Authentication error" => "erro de autenticação", "Unable to delete user" => "Não foi possivel remover usuário", "Language changed" => "Mudou Idioma", +"Admins can't remove themself from the admin group" => "Admins não podem se remover do grupo admin", "Unable to add user to group %s" => "Não foi possivel adicionar usuário ao grupo %s", "Unable to remove user from group %s" => "Não foi possivel remover usuário ao grupo %s", "Disable" => "Desabilitado", diff --git a/settings/l10n/sr.php b/settings/l10n/sr.php index 31cd4c491d..9250dd1397 100644 --- a/settings/l10n/sr.php +++ b/settings/l10n/sr.php @@ -5,6 +5,7 @@ "Language changed" => "Језик је измењен", "__language_name__" => "__language_name__", "Select an App" => "Изаберите програм", +"Documentation" => "Документација", "Ask a question" => "Поставите питање", "Problems connecting to help database." => "Проблем у повезивању са базом помоћи", "Go there manually." => "Отиђите тамо ручно.", From 4cb760a92402ab3eb8550fb05b05eae800030680 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Sat, 1 Dec 2012 00:27:48 +0100 Subject: [PATCH 408/481] LDAP: ldap_explode_dn escaped too much, fix it by manual replacement. Fixes different problems, esp. with non-ascii characters in the dn (#631) --- apps/user_ldap/lib/access.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 53d4edbe69..042076fe62 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -123,10 +123,17 @@ abstract class Access { //escape DN values according to RFC 2253 – this is already done by ldap_explode_dn //to use the DN in search filters, \ needs to be escaped to \5c additionally //to use them in bases, we convert them back to simple backslashes in readAttribute() - $aDN = ldap_explode_dn($dn, false); - unset($aDN['count']); - $dn = implode(',', $aDN); - $dn = str_replace('\\', '\\5c', $dn); + $replacements = array( + '\,' => '\5c2C', + '\=' => '\5c3D', + '\+' => '\5c2B', + '\<' => '\5c3C', + '\>' => '\5c3E', + '\;' => '\5c3B', + '\"' => '\5c22', + '\#' => '\5c23', + ); + $dn = str_replace(array_keys($replacements),array_values($replacements), $dn); return $dn; } From 4327ed83820f045395bbf1431cdddbdedfa19555 Mon Sep 17 00:00:00 2001 From: Brice Maron Date: Mon, 3 Dec 2012 20:20:17 +0000 Subject: [PATCH 409/481] Revoke DB rights on install only if the db is newly created --- lib/setup.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index 264cd55795..fdd10be682 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -319,9 +319,11 @@ class OC_Setup { $entry.='Offending command was: '.$query.'
    '; echo($entry); } + else { + $query = "REVOKE ALL PRIVILEGES ON DATABASE \"$e_name\" FROM PUBLIC"; + $result = pg_query($connection, $query); + } } - $query = "REVOKE ALL PRIVILEGES ON DATABASE \"$e_name\" FROM PUBLIC"; - $result = pg_query($connection, $query); } private static function pg_createDBUser($name, $password, $connection) { From a310dcb0ff4e787ea0a060db6960ba191f04a33f Mon Sep 17 00:00:00 2001 From: Brice Maron Date: Mon, 3 Dec 2012 22:53:06 +0000 Subject: [PATCH 410/481] Fix a dirty function preventing showing errors --- lib/template.php | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/lib/template.php b/lib/template.php index 868d5f2ba2..04667d73a2 100644 --- a/lib/template.php +++ b/lib/template.php @@ -497,18 +497,14 @@ class OC_Template{ return $content->printPage(); } - /** - * @brief Print a fatal error page and terminates the script - * @param string $error The error message to show - * @param string $hint An option hint message - */ - public static function printErrorPage( $error, $hint = '' ) { - $error['error']=$error; - $error['hint']=$hint; - $errors[]=$error; - OC_Template::printGuestPage("", "error", array("errors" => $errors)); - die(); - } - - + /** + * @brief Print a fatal error page and terminates the script + * @param string $error The error message to show + * @param string $hint An option hint message + */ + public static function printErrorPage( $error_msg, $hint = '' ) { + $errors = array(array('error' => $error_msg, 'hint' => $hint)); + OC_Template::printGuestPage("", "error", array("errors" => $errors)); + die(); + } } From a53a946c20031e891e781b38cfd0fcb849db3cb1 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 4 Dec 2012 00:07:11 +0100 Subject: [PATCH 411/481] [tx-robot] updated from transifex --- apps/files/l10n/ja_JP.php | 1 + apps/files/l10n/nl.php | 1 + apps/files/l10n/pl.php | 1 + apps/files/l10n/sv.php | 1 + apps/files/l10n/uk.php | 3 ++- apps/files/l10n/zh_CN.php | 1 + core/l10n/eo.php | 1 + l10n/de_DE/settings.po | 9 +++++---- l10n/eo/core.po | 6 +++--- l10n/ja_JP/files.po | 9 +++++---- l10n/nl/files.po | 9 +++++---- l10n/pl/files.po | 8 ++++---- l10n/pl/settings.po | 9 +++++---- l10n/sv/files.po | 8 ++++---- l10n/sv/settings.po | 8 ++++---- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/uk/files.po | 10 +++++----- l10n/zh_CN/files.po | 8 ++++---- l10n/zh_CN/settings.po | 8 ++++---- settings/l10n/de_DE.php | 1 + settings/l10n/pl.php | 1 + settings/l10n/sv.php | 1 + settings/l10n/zh_CN.php | 1 + 32 files changed, 70 insertions(+), 55 deletions(-) diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index 27974160ff..7b8c3ca477 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -1,5 +1,6 @@ "エラーはありません。ファイルのアップロードは成功しました", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "アップロードされたファイルはphp.ini の upload_max_filesize に設定されたサイズを超えています:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードされたファイルはHTMLのフォームに設定されたMAX_FILE_SIZEに設定されたサイズを超えています", "The uploaded file was only partially uploaded" => "ファイルは一部分しかアップロードされませんでした", "No file was uploaded" => "ファイルはアップロードされませんでした", diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index 74a8ff3bfb..093a5430d5 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -1,5 +1,6 @@ "Geen fout opgetreden, bestand successvol geupload.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Het geüploade bestand overscheidt de upload_max_filesize optie in php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het geüploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is opgegeven in de HTML-formulier", "The uploaded file was only partially uploaded" => "Het bestand is slechts gedeeltelijk geupload", "No file was uploaded" => "Geen bestand geüpload", diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index 6667cb66df..8051eae8c4 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -1,5 +1,6 @@ "Przesłano plik", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Wgrany plik przekracza wartość upload_max_filesize zdefiniowaną w php.ini: ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Rozmiar przesłanego pliku przekracza maksymalną wartość dyrektywy upload_max_filesize, zawartą formularzu HTML", "The uploaded file was only partially uploaded" => "Plik przesłano tylko częściowo", "No file was uploaded" => "Nie przesłano żadnego pliku", diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index 3503c6c1a1..bcc849242a 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -1,5 +1,6 @@ "Inga fel uppstod. Filen laddades upp utan problem", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Den uppladdade filen överskrider upload_max_filesize direktivet php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-formulär", "The uploaded file was only partially uploaded" => "Den uppladdade filen var endast delvis uppladdad", "No file was uploaded" => "Ingen fil blev uppladdad", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index 4823bdbd27..00491bcc2d 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -1,5 +1,6 @@ "Файл успішно відвантажено без помилок.", +"There is no error, the file uploaded with success" => "Файл успішно вивантажено без помилок.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Розмір відвантаженого файлу перевищує директиву MAX_FILE_SIZE вказану в HTML формі", "The uploaded file was only partially uploaded" => "Файл відвантажено лише частково", "No file was uploaded" => "Не відвантажено жодного файлу", diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index ab8e980c33..8db652f003 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -1,5 +1,6 @@ "没有发生错误,文件上传成功。", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "上传文件大小已超过php.ini中upload_max_filesize所规定的值", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件超过了在HTML 表单中指定的MAX_FILE_SIZE", "The uploaded file was only partially uploaded" => "只上传了文件的一部分", "No file was uploaded" => "文件没有上传", diff --git a/core/l10n/eo.php b/core/l10n/eo.php index 4674c8c357..7b65652d67 100644 --- a/core/l10n/eo.php +++ b/core/l10n/eo.php @@ -108,6 +108,7 @@ "December" => "Decembro", "web services under your control" => "TTT-servoj sub via kontrolo", "Log out" => "Elsaluti", +"If you did not change your password recently, your account may be compromised!" => "Se vi ne ŝanĝis vian pasvorton lastatempe, via konto eble kompromitas!", "Please change your password to secure your account again." => "Bonvolu ŝanĝi vian pasvorton por sekurigi vian konton ree.", "Lost your password?" => "Ĉu vi perdis vian pasvorton?", "remember" => "memori", diff --git a/l10n/de_DE/settings.po b/l10n/de_DE/settings.po index cc633c1c24..064c038d57 100644 --- a/l10n/de_DE/settings.po +++ b/l10n/de_DE/settings.po @@ -16,15 +16,16 @@ # , 2012. # , 2012. # Phi Lieb <>, 2012. +# , 2012. # , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 21:41+0000\n" +"Last-Translator: seeed \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -82,7 +83,7 @@ msgstr "Sprache geändert" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administratoren können sich nicht selbst aus der admin-Gruppe löschen" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/eo/core.po b/l10n/eo/core.po index 759c54ff16..517787299a 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 23:00+0000\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-02 23:10+0000\n" "Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" @@ -497,7 +497,7 @@ msgstr "" msgid "" "If you did not change your password recently, your account may be " "compromised!" -msgstr "" +msgstr "Se vi ne ŝanĝis vian pasvorton lastatempe, via konto eble kompromitas!" #: templates/login.php:10 msgid "Please change your password to secure your account again." diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po index 05c448fe95..3f253361a8 100644 --- a/l10n/ja_JP/files.po +++ b/l10n/ja_JP/files.po @@ -4,15 +4,16 @@ # # Translators: # Daisuke Deguchi , 2012. +# Daisuke Deguchi , 2012. # , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 01:53+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +28,7 @@ msgstr "エラーはありません。ファイルのアップロードは成功 #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "アップロードされたファイルはphp.ini の upload_max_filesize に設定されたサイズを超えています:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/nl/files.po b/l10n/nl/files.po index dc5709b30f..bb78a69078 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -11,15 +11,16 @@ # , 2011. # , 2012. # , 2011. +# , 2012. # , 2012. # Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 09:15+0000\n" +"Last-Translator: Len \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,7 +35,7 @@ msgstr "Geen fout opgetreden, bestand successvol geupload." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Het geüploade bestand overscheidt de upload_max_filesize optie in php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/pl/files.po b/l10n/pl/files.po index 1922ea7974..8c9563a58e 100644 --- a/l10n/pl/files.po +++ b/l10n/pl/files.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 10:15+0000\n" +"Last-Translator: Thomasso \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +31,7 @@ msgstr "Przesłano plik" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Wgrany plik przekracza wartość upload_max_filesize zdefiniowaną w php.ini: " #: ajax/upload.php:23 msgid "" diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po index 17eb403e70..beb685551e 100644 --- a/l10n/pl/settings.po +++ b/l10n/pl/settings.po @@ -12,13 +12,14 @@ # , 2011. # , 2012. # Piotr Sokół , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 10:16+0000\n" +"Last-Translator: Thomasso \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -76,7 +77,7 @@ msgstr "Język zmieniony" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administratorzy nie mogą usunąć się sami z grupy administratorów." #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/sv/files.po b/l10n/sv/files.po index ed4860b71c..7c197ea605 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 19:45+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,7 +30,7 @@ msgstr "Inga fel uppstod. Filen laddades upp utan problem" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Den uppladdade filen överskrider upload_max_filesize direktivet php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po index 4a9703d905..1f1645f74e 100644 --- a/l10n/sv/settings.po +++ b/l10n/sv/settings.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 19:44+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -74,7 +74,7 @@ msgstr "Språk ändrades" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administratörer kan inte ta bort sig själva från admingruppen" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index d66c9699d0..a62ab6f358 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 317fa90ac6..e7085af495 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index c44886a1db..121ae60054 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index f89ffb9a85..00f1ac97c2 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 236ac473a8..f3afb117e3 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 55a2609887..d7d960434d 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index f7bd22d456..50787532aa 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 793ca34b3a..a7211cf78e 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 193d34358d..a38c808fe0 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 847227c856..5dd7d99d92 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/uk/files.po b/l10n/uk/files.po index 04e2e33d5e..c37f23560d 100644 --- a/l10n/uk/files.po +++ b/l10n/uk/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 10:32+0000\n" +"Last-Translator: volodya327 \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,12 +22,12 @@ msgstr "" #: ajax/upload.php:20 msgid "There is no error, the file uploaded with success" -msgstr "Файл успішно відвантажено без помилок." +msgstr "Файл успішно вивантажено без помилок." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: " #: ajax/upload.php:23 msgid "" diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index d92d087c66..0493f0631c 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 00:57+0000\n" +"Last-Translator: hanfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,7 +29,7 @@ msgstr "没有发生错误,文件上传成功。" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "上传文件大小已超过php.ini中upload_max_filesize所规定的值" #: ajax/upload.php:23 msgid "" diff --git a/l10n/zh_CN/settings.po b/l10n/zh_CN/settings.po index 073572833a..bd122830a2 100644 --- a/l10n/zh_CN/settings.po +++ b/l10n/zh_CN/settings.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"PO-Revision-Date: 2012-12-03 00:58+0000\n" +"Last-Translator: hanfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -72,7 +72,7 @@ msgstr "语言已修改" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "管理员不能将自己移出管理组。" #: ajax/togglegroups.php:28 #, php-format diff --git a/settings/l10n/de_DE.php b/settings/l10n/de_DE.php index 72d27aedf0..9db7cb93c3 100644 --- a/settings/l10n/de_DE.php +++ b/settings/l10n/de_DE.php @@ -11,6 +11,7 @@ "Authentication error" => "Fehler bei der Anmeldung", "Unable to delete user" => "Der Benutzer konnte nicht gelöscht werden", "Language changed" => "Sprache geändert", +"Admins can't remove themself from the admin group" => "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", "Unable to add user to group %s" => "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", "Unable to remove user from group %s" => "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Disable" => "Deaktivieren", diff --git a/settings/l10n/pl.php b/settings/l10n/pl.php index 3946ee1973..e17e3c00e5 100644 --- a/settings/l10n/pl.php +++ b/settings/l10n/pl.php @@ -11,6 +11,7 @@ "Authentication error" => "Błąd uwierzytelniania", "Unable to delete user" => "Nie można usunąć użytkownika", "Language changed" => "Język zmieniony", +"Admins can't remove themself from the admin group" => "Administratorzy nie mogą usunąć się sami z grupy administratorów.", "Unable to add user to group %s" => "Nie można dodać użytkownika do grupy %s", "Unable to remove user from group %s" => "Nie można usunąć użytkownika z grupy %s", "Disable" => "Wyłącz", diff --git a/settings/l10n/sv.php b/settings/l10n/sv.php index b921046d6c..c829e0376b 100644 --- a/settings/l10n/sv.php +++ b/settings/l10n/sv.php @@ -11,6 +11,7 @@ "Authentication error" => "Autentiseringsfel", "Unable to delete user" => "Kan inte radera användare", "Language changed" => "Språk ändrades", +"Admins can't remove themself from the admin group" => "Administratörer kan inte ta bort sig själva från admingruppen", "Unable to add user to group %s" => "Kan inte lägga till användare i gruppen %s", "Unable to remove user from group %s" => "Kan inte radera användare från gruppen %s", "Disable" => "Deaktivera", diff --git a/settings/l10n/zh_CN.php b/settings/l10n/zh_CN.php index ad8140e6cc..87c8172d6f 100644 --- a/settings/l10n/zh_CN.php +++ b/settings/l10n/zh_CN.php @@ -11,6 +11,7 @@ "Authentication error" => "认证错误", "Unable to delete user" => "无法删除用户", "Language changed" => "语言已修改", +"Admins can't remove themself from the admin group" => "管理员不能将自己移出管理组。", "Unable to add user to group %s" => "无法把用户添加到组 %s", "Unable to remove user from group %s" => "无法从组%s中移除用户", "Disable" => "禁用", From 3e519945c3d3ceeafb6ca302f8cf720943d397a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 4 Dec 2012 13:30:13 +0100 Subject: [PATCH 412/481] replace minified infieldlabel with dcneiners version --- core/js/jquery.infieldlabel.js | 153 +++++++++++++++++++++++++++++ core/js/jquery.infieldlabel.min.js | 12 --- 2 files changed, 153 insertions(+), 12 deletions(-) create mode 100644 core/js/jquery.infieldlabel.js delete mode 100644 core/js/jquery.infieldlabel.min.js diff --git a/core/js/jquery.infieldlabel.js b/core/js/jquery.infieldlabel.js new file mode 100644 index 0000000000..67608493f8 --- /dev/null +++ b/core/js/jquery.infieldlabel.js @@ -0,0 +1,153 @@ +/** + * @license In-Field Label jQuery Plugin + * http://fuelyourcoding.com/scripts/infield.html + * + * Copyright (c) 2009-2010 Doug Neiner + * Dual licensed under the MIT and GPL licenses. + * Uses the same license as jQuery, see: + * http://docs.jquery.com/License + * + * @version 0.1.2 + */ +(function ($) { + + $.InFieldLabels = function (label, field, options) { + // To avoid scope issues, use 'base' instead of 'this' + // to reference this class from internal events and functions. + var base = this; + + // Access to jQuery and DOM versions of each element + base.$label = $(label); + base.label = label; + + base.$field = $(field); + base.field = field; + + base.$label.data("InFieldLabels", base); + base.showing = true; + + base.init = function () { + // Merge supplied options with default options + base.options = $.extend({}, $.InFieldLabels.defaultOptions, options); + + // Check if the field is already filled in + if (base.$field.val() !== "") { + base.$label.hide(); + base.showing = false; + } + + base.$field.focus(function () { + base.fadeOnFocus(); + }).blur(function () { + base.checkForEmpty(true); + }).bind('keydown.infieldlabel', function (e) { + // Use of a namespace (.infieldlabel) allows us to + // unbind just this method later + base.hideOnChange(e); + }).bind('paste', function (e) { + // Since you can not paste an empty string we can assume + // that the fieldis not empty and the label can be cleared. + base.setOpacity(0.0); + }).change(function (e) { + base.checkForEmpty(); + }).bind('onPropertyChange', function () { + base.checkForEmpty(); + }); + }; + + // If the label is currently showing + // then fade it down to the amount + // specified in the settings + base.fadeOnFocus = function () { + if (base.showing) { + base.setOpacity(base.options.fadeOpacity); + } + }; + + base.setOpacity = function (opacity) { + base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration); + base.showing = (opacity > 0.0); + }; + + // Checks for empty as a fail safe + // set blur to true when passing from + // the blur event + base.checkForEmpty = function (blur) { + if (base.$field.val() === "") { + base.prepForShow(); + base.setOpacity(blur ? 1.0 : base.options.fadeOpacity); + } else { + base.setOpacity(0.0); + } + }; + + base.prepForShow = function (e) { + if (!base.showing) { + // Prepare for a animate in... + base.$label.css({opacity: 0.0}).show(); + + // Reattach the keydown event + base.$field.bind('keydown.infieldlabel', function (e) { + base.hideOnChange(e); + }); + } + }; + + base.hideOnChange = function (e) { + if ( + (e.keyCode === 16) || // Skip Shift + (e.keyCode === 9) // Skip Tab + ) { + return; + } + + if (base.showing) { + base.$label.hide(); + base.showing = false; + } + + // Remove keydown event to save on CPU processing + base.$field.unbind('keydown.infieldlabel'); + }; + + // Run the initialization method + base.init(); + }; + + $.InFieldLabels.defaultOptions = { + fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be + fadeDuration: 300 // How long should it take to animate from 1.0 opacity to the fadeOpacity + }; + + + $.fn.inFieldLabels = function (options) { + return this.each(function () { + // Find input or textarea based on for= attribute + // The for attribute on the label must contain the ID + // of the input or textarea element + var for_attr = $(this).attr('for'), $field; + if (!for_attr) { + return; // Nothing to attach, since the for field wasn't used + } + + // Find the referenced input or textarea element + $field = $( + "input#" + for_attr + "[type='text']," + + "input#" + for_attr + "[type='search']," + + "input#" + for_attr + "[type='tel']," + + "input#" + for_attr + "[type='url']," + + "input#" + for_attr + "[type='email']," + + "input#" + for_attr + "[type='password']," + + "textarea#" + for_attr + ); + + if ($field.length === 0) { + return; // Again, nothing to attach + } + + // Only create object for input[text], input[password], or textarea + (new $.InFieldLabels(this, $field[0], options)); + }); + }; + +}(jQuery)); \ No newline at end of file diff --git a/core/js/jquery.infieldlabel.min.js b/core/js/jquery.infieldlabel.min.js deleted file mode 100644 index 36f6b8f127..0000000000 --- a/core/js/jquery.infieldlabel.min.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - In-Field Label jQuery Plugin - http://fuelyourcoding.com/scripts/infield.html - - Copyright (c) 2009-2010 Doug Neiner - Dual licensed under the MIT and GPL licenses. - Uses the same license as jQuery, see: - http://docs.jquery.com/License - - @version 0.1.5 -*/ -(function($){$.InFieldLabels=function(label,field,options){var base=this;base.$label=$(label);base.label=label;base.$field=$(field);base.field=field;base.$label.data("InFieldLabels",base);base.showing=true;base.init=function(){base.options=$.extend({},$.InFieldLabels.defaultOptions,options);setTimeout(function(){if(base.$field.val()!==""){base.$label.hide();base.showing=false}},200);base.$field.focus(function(){base.fadeOnFocus()}).blur(function(){base.checkForEmpty(true)}).bind('keydown.infieldlabel',function(e){base.hideOnChange(e)}).bind('paste',function(e){base.setOpacity(0.0)}).change(function(e){base.checkForEmpty()}).bind('onPropertyChange',function(){base.checkForEmpty()}).bind('keyup.infieldlabel',function(){base.checkForEmpty()})};base.fadeOnFocus=function(){if(base.showing){base.setOpacity(base.options.fadeOpacity)}};base.setOpacity=function(opacity){base.$label.stop().animate({opacity:opacity},base.options.fadeDuration);base.showing=(opacity>0.0)};base.checkForEmpty=function(blur){if(base.$field.val()===""){base.prepForShow();base.setOpacity(blur?1.0:base.options.fadeOpacity)}else{base.setOpacity(0.0)}};base.prepForShow=function(e){if(!base.showing){base.$label.css({opacity:0.0}).show();base.$field.bind('keydown.infieldlabel',function(e){base.hideOnChange(e)})}};base.hideOnChange=function(e){if((e.keyCode===16)||(e.keyCode===9)){return}if(base.showing){base.$label.hide();base.showing=false}base.$field.unbind('keydown.infieldlabel')};base.init()};$.InFieldLabels.defaultOptions={fadeOpacity:0.5,fadeDuration:300};$.fn.inFieldLabels=function(options){return this.each(function(){var for_attr=$(this).attr('for'),$field;if(!for_attr){return}$field=$("input#"+for_attr+"[type='text'],"+"input#"+for_attr+"[type='search'],"+"input#"+for_attr+"[type='tel'],"+"input#"+for_attr+"[type='url'],"+"input#"+for_attr+"[type='email'],"+"input#"+for_attr+"[type='password'],"+"textarea#"+for_attr);if($field.length===0){return}(new $.InFieldLabels(this,$field[0],options))})}}(jQuery)); From e72f95f643e5d9bdb9a9293eb14bf58170fae102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 4 Dec 2012 13:32:55 +0100 Subject: [PATCH 413/481] merge changes discussed in dcneiner pull number 4 'fix for autocomplete issue' including firefox password overlay --- core/js/jquery.infieldlabel.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/js/jquery.infieldlabel.js b/core/js/jquery.infieldlabel.js index 67608493f8..c7daf61edd 100644 --- a/core/js/jquery.infieldlabel.js +++ b/core/js/jquery.infieldlabel.js @@ -7,7 +7,7 @@ * Uses the same license as jQuery, see: * http://docs.jquery.com/License * - * @version 0.1.2 + * @version 0.1.6 */ (function ($) { @@ -31,10 +31,13 @@ base.options = $.extend({}, $.InFieldLabels.defaultOptions, options); // Check if the field is already filled in - if (base.$field.val() !== "") { - base.$label.hide(); - base.showing = false; - } + // add a short delay to handle autocomplete + setTimeout(function() { + if (base.$field.val() !== "") { + base.$label.hide(); + base.showing = false; + } + }, 200); base.$field.focus(function () { base.fadeOnFocus(); @@ -52,7 +55,15 @@ base.checkForEmpty(); }).bind('onPropertyChange', function () { base.checkForEmpty(); + }).bind('keyup.infieldlabel', function () { + base.checkForEmpty() }); + setInterval(function(){ + if(base.$field.val() != ""){ + base.$label.hide(); + base.showing = false; + }; + },100); }; // If the label is currently showing From e65abb8054e17eb850969b659259385b83e85639 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Tue, 4 Dec 2012 14:49:19 +0100 Subject: [PATCH 414/481] minified version no longer available --- lib/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index dff73ef1ae..8c508c4876 100644 --- a/lib/base.php +++ b/lib/base.php @@ -260,7 +260,7 @@ class OC{ OC_Util::addScript( "jquery-1.7.2.min" ); OC_Util::addScript( "jquery-ui-1.8.16.custom.min" ); OC_Util::addScript( "jquery-showpassword" ); - OC_Util::addScript( "jquery.infieldlabel.min" ); + OC_Util::addScript( "jquery.infieldlabel" ); OC_Util::addScript( "jquery-tipsy" ); OC_Util::addScript( "oc-dialogs" ); OC_Util::addScript( "js" ); From 855a011697c018d5e30dd380227cbf992c967fd1 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 4 Dec 2012 16:58:42 +0100 Subject: [PATCH 415/481] group related input fields visually --- core/css/styles.css | 18 ++++++++++++++++++ core/templates/installation.php | 14 +++++++------- core/templates/login.php | 4 ++-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 646a760f98..4de9cbd8fe 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -79,7 +79,25 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- #login form { width:22em; margin:2em auto 2em; padding:0; } #login form fieldset { background:0; border:0; margin-bottom:2em; padding:0; } #login form fieldset legend { font-weight:bold; } + +/* Nicely grouping input field sets */ +.grouptop input { + margin-bottom:0; + border-bottom:0; border-bottom-left-radius:0; border-bottom-right-radius:0; +} +.groupmiddle input { + margin-top:0; margin-bottom:0; + border-top:0; border-radius:0; + box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; +} +.groupbottom input { + margin-top:0; + border-top:0; border-top-right-radius:0; border-top-left-radius:0; + box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; +} + #login form label { margin:.95em 0 0 .85em; color:#666; } +#login .groupmiddle label, #login .groupbottom label { margin-top:13px; } /* NEEDED FOR INFIELD LABELS */ p.infield { position: relative; } label.infield { cursor: text !important; } diff --git a/core/templates/installation.php b/core/templates/installation.php index 1e7983eae5..79d30eff53 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -34,11 +34,11 @@
    t( 'Create an admin account' ); ?> -

    +

    -

    +

    @@ -101,15 +101,15 @@
    -

    +

    -

    +

    -

    +

    @@ -117,13 +117,13 @@
    -

    +

    -

    +

    diff --git a/core/templates/login.php b/core/templates/login.php index d6b09c83d3..cb4b6717b6 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -16,11 +16,11 @@ -

    +

    autocomplete="on" required />

    -

    +

    />

    From 93208d0fe922c64dd2bacc8bf102dbf4be4562b7 Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Tue, 4 Dec 2012 09:40:17 -0700 Subject: [PATCH 416/481] Remove rename --- apps/files/js/keyboardshortcuts.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index 35a94eeacd..69656b9364 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -142,7 +142,7 @@ Files.bindKeyboardShortcuts = function (document, $) { ){ preventDefault = true;//new file/folder prevent browser from responding } - if( + /*if( !$("#new").hasClass("active") && $.inArray(keyCodes.r, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 @@ -158,7 +158,7 @@ Files.bindKeyboardShortcuts = function (document, $) { preventDefault = true; } }); - } + }*/ if(preventDefault){ event.preventDefault(); //Prevent web browser from responding event.stopPropagation(); @@ -201,7 +201,7 @@ Files.bindKeyboardShortcuts = function (document, $) { else if(!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) {//delete file del(); } - else if( + /*else if( !$("#new").hasClass("active") && $.inArray(keyCodes.r, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 @@ -213,7 +213,7 @@ Files.bindKeyboardShortcuts = function (document, $) { && $.inArray(keyCodes.shift, keys) !== -1 ){//rename file rename(); - } + }*/ removeA(keys, event.keyCode); }); From e6ec0e8a5e35b94dee83bdd53302d76a6f4e92fa Mon Sep 17 00:00:00 2001 From: Brice Maron Date: Tue, 4 Dec 2012 17:36:23 +0000 Subject: [PATCH 417/481] Remove support of sqlite2 at installation --- core/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/setup.php b/core/setup.php index 7a5c6d5f3e..9e15f205c0 100644 --- a/core/setup.php +++ b/core/setup.php @@ -12,7 +12,7 @@ if( file_exists( $autosetup_file )) { OC_Util::addScript('setup'); -$hasSQLite = (is_callable('sqlite_open') or class_exists('SQLite3')); +$hasSQLite = (is_callable('sqlite_open') and class_exists('SQLite3')); $hasMySQL = is_callable('mysql_connect'); $hasPostgreSQL = is_callable('pg_connect'); $hasOracle = is_callable('oci_connect'); From 39e37fa9c64b61fa4d01a8894cd0a7ef577e61f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 4 Dec 2012 19:28:46 +0100 Subject: [PATCH 418/481] Enabling unit testing for apptemplate_advanced --- tests/enable_all.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/enable_all.php b/tests/enable_all.php index 23a1e8ab68..16838398f1 100644 --- a/tests/enable_all.php +++ b/tests/enable_all.php @@ -10,6 +10,7 @@ require_once __DIR__.'/../lib/base.php'; OC_App::enable('calendar'); OC_App::enable('contacts'); +OC_App::enable('apptemplate_advanced'); #OC_App::enable('files_archive'); #OC_App::enable('mozilla_sync'); #OC_App::enable('news'); From 4df61c3e45b6dabb83e90f71d876ed020a0d9be6 Mon Sep 17 00:00:00 2001 From: Brice Maron Date: Tue, 4 Dec 2012 19:34:24 +0000 Subject: [PATCH 419/481] Simplify has sqlite test --- core/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/setup.php b/core/setup.php index 9e15f205c0..66b8cf378b 100644 --- a/core/setup.php +++ b/core/setup.php @@ -12,7 +12,7 @@ if( file_exists( $autosetup_file )) { OC_Util::addScript('setup'); -$hasSQLite = (is_callable('sqlite_open') and class_exists('SQLite3')); +$hasSQLite = class_exists('SQLite3'); $hasMySQL = is_callable('mysql_connect'); $hasPostgreSQL = is_callable('pg_connect'); $hasOracle = is_callable('oci_connect'); From 5ccea4cc2f4c89a0232670a9f0b87c641e5df9ad Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 4 Dec 2012 23:09:30 +0100 Subject: [PATCH 420/481] small fixes: toggle color adjustment, remove colon, prevent label wrapping --- core/css/styles.css | 5 ++--- core/templates/installation.php | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 4de9cbd8fe..30fc899746 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -101,7 +101,7 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- /* NEEDED FOR INFIELD LABELS */ p.infield { position: relative; } label.infield { cursor: text !important; } -#login form label.infield { position:absolute; font-size:1.5em; color:#AAA; } +#login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } #login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } @@ -109,8 +109,7 @@ label.infield { cursor: text !important; } #login form #selectDbType { text-align:center; } #login form #selectDbType label { position:static; font-size:1em; margin:0 -.3em 1em; cursor:pointer; padding:.4em; border:1px solid #ddd; font-weight:bold; background:#f8f8f8; color:#555; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } #login form #selectDbType label span { cursor:pointer; font-size:0.9em; } -#login form #selectDbType label.ui-state-hover span, #login form #selectDbType label.ui-state-active span { color:#000; } -#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color: #333; background-color: #ccc; } +#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#000; background-color:#e8e8e8; } /* NAVIGATION ------------------------------------------------------------- */ diff --git a/core/templates/installation.php b/core/templates/installation.php index 79d30eff53..889d8bf377 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -47,7 +47,7 @@
    t( 'Advanced' ); ?> ▾
    -
    +
    From 13e0287b74a96fc3577fb2444cd7457af417ed2d Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 4 Dec 2012 23:55:31 +0100 Subject: [PATCH 421/481] better layout for installation page elements, centered and subdued legend text --- core/css/styles.css | 18 ++++++++++++++---- core/templates/installation.php | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 30fc899746..11c2037710 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -77,8 +77,14 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- #login { min-height:30em; margin:2em auto 0; border-bottom:1px solid #f8f8f8; background:#eee; } #login form { width:22em; margin:2em auto 2em; padding:0; } -#login form fieldset { background:0; border:0; margin-bottom:2em; padding:0; } -#login form fieldset legend { font-weight:bold; } +#login form fieldset { background:0; border:0; margin-bottom:20px; padding:0; } +#login form #adminaccount { margin-bottom:5px; } +#login form fieldset legend { + width:100%; text-align:center; + font-weight:bold; color:#999; text-shadow:0 1px 0 white; +} +#login form fieldset legend a { color:#999; } +#login form #datadirField legend { margin-bottom:15px; } /* Nicely grouping input field sets */ .grouptop input { @@ -107,8 +113,12 @@ label.infield { cursor: text !important; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } #login form #selectDbType { text-align:center; } -#login form #selectDbType label { position:static; font-size:1em; margin:0 -.3em 1em; cursor:pointer; padding:.4em; border:1px solid #ddd; font-weight:bold; background:#f8f8f8; color:#555; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } -#login form #selectDbType label span { cursor:pointer; font-size:0.9em; } +#login form #selectDbType label { + position:static; margin:0 -3px 5px; padding:.4em; + font-size:12px; font-weight:bold; background:#f8f8f8; color:#555; cursor:pointer; + border:1px solid #ddd; text-shadow:#eee 0 1px 0; + -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; +} #login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#000; background-color:#e8e8e8; } diff --git a/core/templates/installation.php b/core/templates/installation.php index 889d8bf377..7590c37c77 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -32,7 +32,7 @@ t('Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root.');?>
    -
    +
    t( 'Create an admin account' ); ?>

    From 524f3c3c0bf2545ba82f9e98da6708335db15027 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 5 Dec 2012 00:04:55 +0100 Subject: [PATCH 422/481] [tx-robot] updated from transifex --- apps/files/l10n/fr.php | 1 + apps/files/l10n/tr.php | 7 ++ apps/files_encryption/l10n/sr.php | 1 + apps/files_sharing/l10n/tr.php | 9 +++ apps/user_webdavauth/l10n/tr.php | 3 + core/l10n/sr.php | 16 ++++ core/l10n/tr.php | 6 ++ l10n/de/settings.po | 9 ++- l10n/fr/files.po | 9 ++- l10n/fr/settings.po | 8 +- l10n/sr/core.po | 119 ++++++++++++++-------------- l10n/sr/files_encryption.po | 11 +-- l10n/sr/settings.po | 61 +++++++------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/tr/core.po | 99 +++++++++++------------ l10n/tr/files.po | 21 ++--- l10n/tr/files_sharing.po | 33 ++++---- l10n/tr/settings.po | 29 +++---- l10n/tr/user_webdavauth.po | 9 ++- settings/l10n/de.php | 1 + settings/l10n/fr.php | 1 + settings/l10n/sr.php | 28 ++++++- settings/l10n/tr.php | 11 +++ 32 files changed, 302 insertions(+), 210 deletions(-) create mode 100644 apps/files_sharing/l10n/tr.php create mode 100644 apps/user_webdavauth/l10n/tr.php diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index 30d96eb2c6..86d476873d 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -1,5 +1,6 @@ "Aucune erreur, le fichier a été téléversé avec succès", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Le fichier envoyé dépasse la valeur upload_max_filesize située dans le fichier php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier téléversé excède la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML", "The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement téléversé", "No file was uploaded" => "Aucun fichier n'a été téléversé", diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index 8f7814088b..061ed1f3ae 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -9,16 +9,23 @@ "Unshare" => "Paylaşılmayan", "Delete" => "Sil", "Rename" => "İsim değiştir.", +"{new_name} already exists" => "{new_name} zaten mevcut", "replace" => "değiştir", +"suggest name" => "Öneri ad", "cancel" => "iptal", +"replaced {new_name}" => "değiştirilen {new_name}", "undo" => "geri al", +"unshared {files}" => "paylaşılmamış {files}", +"deleted {files}" => "silinen {files}", "generating ZIP-file, it may take some time." => "ZIP dosyası oluşturuluyor, biraz sürebilir.", "Unable to upload your file as it is a directory or has 0 bytes" => "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi", "Upload Error" => "Yükleme hatası", "Close" => "Kapat", "Pending" => "Bekliyor", +"1 file uploading" => "1 dosya yüklendi", "Upload cancelled." => "Yükleme iptal edildi.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.", +"error while scanning" => "tararamada hata oluşdu", "Name" => "Ad", "Size" => "Boyut", "Modified" => "Değiştirilme", diff --git a/apps/files_encryption/l10n/sr.php b/apps/files_encryption/l10n/sr.php index dbeda58af0..4718780ee5 100644 --- a/apps/files_encryption/l10n/sr.php +++ b/apps/files_encryption/l10n/sr.php @@ -1,5 +1,6 @@ "Шифровање", +"Exclude the following file types from encryption" => "Не шифруј следеће типове датотека", "None" => "Ништа", "Enable Encryption" => "Омогући шифровање" ); diff --git a/apps/files_sharing/l10n/tr.php b/apps/files_sharing/l10n/tr.php new file mode 100644 index 0000000000..f2e6e5697d --- /dev/null +++ b/apps/files_sharing/l10n/tr.php @@ -0,0 +1,9 @@ + "Şifre", +"Submit" => "Gönder", +"%s shared the folder %s with you" => "%s sizinle paylaşılan %s klasör", +"%s shared the file %s with you" => "%s sizinle paylaşılan %s klasör", +"Download" => "İndir", +"No preview available for" => "Kullanılabilir önizleme yok", +"web services under your control" => "Bilgileriniz güvenli ve şifreli" +); diff --git a/apps/user_webdavauth/l10n/tr.php b/apps/user_webdavauth/l10n/tr.php new file mode 100644 index 0000000000..9bd32954b0 --- /dev/null +++ b/apps/user_webdavauth/l10n/tr.php @@ -0,0 +1,3 @@ + "WebDAV URL: http://" +); diff --git a/core/l10n/sr.php b/core/l10n/sr.php index 6355e3119f..406b92ff83 100644 --- a/core/l10n/sr.php +++ b/core/l10n/sr.php @@ -1,14 +1,23 @@ "Врста категорије није унет.", +"No category to add?" => "Додати још неку категорију?", "This category already exists: " => "Категорија већ постоји:", +"Object type not provided." => "Врста објекта није унета.", +"%s ID not provided." => "%s ИД нису унети.", +"Error adding %s to favorites." => "Грешка приликом додавања %s у омиљене.", "No categories selected for deletion." => "Ни једна категорија није означена за брисање.", +"Error removing %s from favorites." => "Грешка приликом уклањања %s из омиљених", "Settings" => "Подешавања", "seconds ago" => "пре неколико секунди", "1 minute ago" => "пре 1 минут", "{minutes} minutes ago" => "пре {minutes} минута", +"1 hour ago" => "Пре једног сата", +"{hours} hours ago" => "Пре {hours} сата (сати)", "today" => "данас", "yesterday" => "јуче", "{days} days ago" => "пре {days} дана", "last month" => "прошлог месеца", +"{months} months ago" => "Пре {months} месеца (месеци)", "months ago" => "месеци раније", "last year" => "прошле године", "years ago" => "година раније", @@ -17,10 +26,15 @@ "No" => "Не", "Yes" => "Да", "Ok" => "У реду", +"The object type is not specified." => "Врста објекта није подешена.", "Error" => "Грешка", +"The app name is not specified." => "Име програма није унето.", +"The required file {file} is not installed!" => "Потребна датотека {file} није инсталирана.", "Error while sharing" => "Грешка у дељењу", "Error while unsharing" => "Грешка код искључења дељења", "Error while changing permissions" => "Грешка код промене дозвола", +"Shared with you and the group {group} by {owner}" => "Дељено са вама и са групом {group}. Поделио {owner}.", +"Shared with you by {owner}" => "Поделио са вама {owner}", "Share with" => "Подели са", "Share with link" => "Подели линк", "Password protect" => "Заштићено лозинком", @@ -28,7 +42,9 @@ "Set expiration date" => "Постави датум истека", "Expiration date" => "Датум истека", "Share via email:" => "Подели поштом:", +"No people found" => "Особе нису пронађене.", "Resharing is not allowed" => "Поновно дељење није дозвољено", +"Shared in {item} with {user}" => "Подељено унутар {item} са {user}", "Unshare" => "Не дели", "can edit" => "може да мења", "access control" => "права приступа", diff --git a/core/l10n/tr.php b/core/l10n/tr.php index 01e3dd2838..cb0df02399 100644 --- a/core/l10n/tr.php +++ b/core/l10n/tr.php @@ -3,12 +3,18 @@ "This category already exists: " => "Bu kategori zaten mevcut: ", "No categories selected for deletion." => "Silmek için bir kategori seçilmedi", "Settings" => "Ayarlar", +"Choose" => "seç", "Cancel" => "İptal", "No" => "Hayır", "Yes" => "Evet", "Ok" => "Tamam", "Error" => "Hata", +"Error while sharing" => "Paylaşım sırasında hata ", +"Share with" => "ile Paylaş", +"Share with link" => "Bağlantı ile paylaş", +"Password protect" => "Şifre korunması", "Password" => "Parola", +"Set expiration date" => "Son kullanma tarihini ayarla", "Unshare" => "Paylaşılmayan", "create" => "oluştur", "ownCloud password reset" => "ownCloud parola sıfırlama", diff --git a/l10n/de/settings.po b/l10n/de/settings.po index d282615810..4d80da3751 100644 --- a/l10n/de/settings.po +++ b/l10n/de/settings.po @@ -14,6 +14,7 @@ # , 2012. # Marcel Kühlhorn , 2012. # , 2012. +# , 2012. # , 2012. # , 2012. # Phi Lieb <>, 2012. @@ -23,9 +24,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 13:54+0000\n" +"Last-Translator: AndryXY \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -83,7 +84,7 @@ msgstr "Sprache geändert" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen." #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/fr/files.po b/l10n/fr/files.po index ca8bbd350f..b0fb5e1a70 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -11,15 +11,16 @@ # Guillaume Paumier , 2012. # , 2012. # Nahir Mohamed , 2012. +# Robert Di Rosa <>, 2012. # , 2011. # Romain DEP. , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 10:24+0000\n" +"Last-Translator: Robert Di Rosa <>\n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,7 +35,7 @@ msgstr "Aucune erreur, le fichier a été téléversé avec succès" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Le fichier envoyé dépasse la valeur upload_max_filesize située dans le fichier php.ini:" #: ajax/upload.php:23 msgid "" diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po index a443aba93f..c3e8712f32 100644 --- a/l10n/fr/settings.po +++ b/l10n/fr/settings.po @@ -20,9 +20,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 10:26+0000\n" +"Last-Translator: Robert Di Rosa <>\n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -80,7 +80,7 @@ msgstr "Langue changée" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/sr/core.po b/l10n/sr/core.po index 4e7abfceb6..2aa7514268 100644 --- a/l10n/sr/core.po +++ b/l10n/sr/core.po @@ -4,14 +4,15 @@ # # Translators: # Ivan Petrović , 2012. +# , 2012. # Slobodan Terzić , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 15:04+0000\n" +"Last-Translator: Kostic \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,11 +22,11 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "" +msgstr "Врста категорије није унет." #: ajax/vcategories/add.php:30 msgid "No category to add?" -msgstr "" +msgstr "Додати још неку категорију?" #: ajax/vcategories/add.php:37 msgid "This category already exists: " @@ -35,18 +36,18 @@ msgstr "Категорија већ постоји:" #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "Врста објекта није унета." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "" +msgstr "%s ИД нису унети." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "" +msgstr "Грешка приликом додавања %s у омиљене." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." @@ -55,61 +56,61 @@ msgstr "Ни једна категорија није означена за бр #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "" +msgstr "Грешка приликом уклањања %s из омиљених" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Подешавања" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "пре неколико секунди" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "пре 1 минут" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "пре {minutes} минута" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" -msgstr "" +msgstr "Пре једног сата" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" -msgstr "" +msgstr "Пре {hours} сата (сати)" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "данас" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "јуче" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "пре {days} дана" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "прошлог месеца" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" -msgstr "" +msgstr "Пре {months} месеца (месеци)" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "месеци раније" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "прошле године" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "година раније" @@ -136,21 +137,21 @@ msgstr "У реду" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 msgid "The object type is not specified." -msgstr "" +msgstr "Врста објекта није подешена." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Грешка" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "Име програма није унето." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "" +msgstr "Потребна датотека {file} није инсталирана." #: js/share.js:124 msgid "Error while sharing" @@ -166,11 +167,11 @@ msgstr "Грешка код промене дозвола" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr "Дељено са вама и са групом {group}. Поделио {owner}." #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "Поделио са вама {owner}" #: js/share.js:158 msgid "Share with" @@ -203,7 +204,7 @@ msgstr "Подели поштом:" #: js/share.js:208 msgid "No people found" -msgstr "" +msgstr "Особе нису пронађене." #: js/share.js:235 msgid "Resharing is not allowed" @@ -211,7 +212,7 @@ msgstr "Поновно дељење није дозвољено" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "Подељено унутар {item} са {user}" #: js/share.js:292 msgid "Unshare" @@ -241,15 +242,15 @@ msgstr "обриши" msgid "share" msgstr "подели" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "Заштићено лозинком" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "Грешка код поништавања датума истека" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "Грешка код постављања датума истека" @@ -404,87 +405,87 @@ msgstr "Домаћин базе" msgid "Finish setup" msgstr "Заврши подешавање" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Недеља" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Понедељак" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Уторак" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвртак" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Петак" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Субота" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Јануар" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Фебруар" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Мај" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Јун" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Јул" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Септембар" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Октобар" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Новембар" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Децембар" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "веб сервиси под контролом" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Одјава" diff --git a/l10n/sr/files_encryption.po b/l10n/sr/files_encryption.po index 2d46f4f9b5..a0a21dd2c8 100644 --- a/l10n/sr/files_encryption.po +++ b/l10n/sr/files_encryption.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 20:46+0000\n" -"Last-Translator: Rancher \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 15:06+0000\n" +"Last-Translator: Kostic \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,12 +25,12 @@ msgstr "Шифровање" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Не шифруј следеће типове датотека" #: templates/settings.php:5 msgid "None" msgstr "Ништа" -#: templates/settings.php:10 +#: templates/settings.php:12 msgid "Enable Encryption" msgstr "Омогући шифровање" diff --git a/l10n/sr/settings.po b/l10n/sr/settings.po index 1ee35e9cf0..3d725b35b0 100644 --- a/l10n/sr/settings.po +++ b/l10n/sr/settings.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Slobodan Terzić , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 15:29+0000\n" +"Last-Translator: Kostic \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,27 +21,27 @@ msgstr "" #: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Грешка приликом учитавања списка из Складишта Програма" #: ajax/creategroup.php:10 msgid "Group already exists" -msgstr "" +msgstr "Група већ постоји" #: ajax/creategroup.php:19 msgid "Unable to add group" -msgstr "" +msgstr "Не могу да додам групу" #: ajax/enableapp.php:12 msgid "Could not enable app. " -msgstr "" +msgstr "Не могу да укључим програм" #: ajax/lostpassword.php:12 msgid "Email saved" -msgstr "" +msgstr "Е-порука сачувана" #: ajax/lostpassword.php:14 msgid "Invalid email" -msgstr "" +msgstr "Неисправна е-адреса" #: ajax/openid.php:13 msgid "OpenID Changed" @@ -52,7 +53,7 @@ msgstr "Неисправан захтев" #: ajax/removegroup.php:13 msgid "Unable to delete group" -msgstr "" +msgstr "Не могу да уклоним групу" #: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" @@ -60,37 +61,37 @@ msgstr "Грешка при аутентификацији" #: ajax/removeuser.php:24 msgid "Unable to delete user" -msgstr "" +msgstr "Не могу да уклоним корисника" #: ajax/setlanguage.php:15 msgid "Language changed" -msgstr "Језик је измењен" +msgstr "Језик је промењен" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Управници не могу себе уклонити из админ групе" #: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" -msgstr "" +msgstr "Не могу да додам корисника у групу %s" #: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" -msgstr "" +msgstr "Не могу да уклоним корисника из групе %s" #: js/apps.js:28 js/apps.js:67 msgid "Disable" -msgstr "" +msgstr "Искључи" #: js/apps.js:28 js/apps.js:55 msgid "Enable" -msgstr "" +msgstr "Укључи" #: js/personal.js:69 msgid "Saving..." -msgstr "" +msgstr "Чување у току..." #: personal.php:42 personal.php:43 msgid "__language_name__" @@ -98,11 +99,11 @@ msgstr "__language_name__" #: templates/apps.php:10 msgid "Add your App" -msgstr "" +msgstr "Додајте ваш програм" #: templates/apps.php:11 msgid "More Apps" -msgstr "" +msgstr "Више програма" #: templates/apps.php:27 msgid "Select an App" @@ -110,11 +111,11 @@ msgstr "Изаберите програм" #: templates/apps.php:31 msgid "See application page at apps.owncloud.com" -msgstr "" +msgstr "Погледајте страницу са програмима на apps.owncloud.com" #: templates/apps.php:32 msgid "-licensed by " -msgstr "" +msgstr "-лиценцирао " #: templates/help.php:9 msgid "Documentation" @@ -122,7 +123,7 @@ msgstr "Документација" #: templates/help.php:10 msgid "Managing Big Files" -msgstr "" +msgstr "Управљање великим датотекама" #: templates/help.php:11 msgid "Ask a question" @@ -143,11 +144,11 @@ msgstr "Одговор" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "" +msgstr "Искористили сте %s од дозвољених %s" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" -msgstr "" +msgstr "Стони и мобилни клијенти за усклађивање" #: templates/personal.php:13 msgid "Download" @@ -155,7 +156,7 @@ msgstr "Преузимање" #: templates/personal.php:19 msgid "Your password was changed" -msgstr "" +msgstr "Лозинка је промењена" #: templates/personal.php:20 msgid "Unable to change your password" @@ -209,7 +210,7 @@ msgid "" "licensed under the AGPL." -msgstr "" +msgstr "Развијају Оунклауд (ownCloud) заједница, изворни код је издат под АГПЛ лиценцом." #: templates/users.php:21 templates/users.php:76 msgid "Name" @@ -229,7 +230,7 @@ msgstr "Направи" #: templates/users.php:35 msgid "Default Quota" -msgstr "" +msgstr "Подразумевано ограничење" #: templates/users.php:55 templates/users.php:138 msgid "Other" @@ -237,11 +238,11 @@ msgstr "Друго" #: templates/users.php:80 templates/users.php:112 msgid "Group Admin" -msgstr "" +msgstr "Управник групе" #: templates/users.php:82 msgid "Quota" -msgstr "" +msgstr "Ограничење" #: templates/users.php:146 msgid "Delete" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index a62ab6f358..95457184e9 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index e7085af495..30ec5c19b4 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 121ae60054..10fb8e3c10 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 00f1ac97c2..3261eb2017 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index f3afb117e3..4dbf6eef95 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index d7d960434d..a82ea8a94e 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 50787532aa..cd78b93de0 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index a7211cf78e..2ead3e9d13 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index a38c808fe0..5868d1d1c4 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 5dd7d99d92..cebdd2e3ca 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/tr/core.po b/l10n/tr/core.po index 1556ecbff6..83b9a8bcbf 100644 --- a/l10n/tr/core.po +++ b/l10n/tr/core.po @@ -5,14 +5,15 @@ # Translators: # Aranel Surion , 2011, 2012. # Caner Başaran , 2012. +# , 2012. # Necdet Yücel , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 12:02+0000\n" +"Last-Translator: alpere \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,65 +59,65 @@ msgstr "Silmek için bir kategori seçilmedi" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Ayarlar" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" #: js/oc-dialogs.js:126 msgid "Choose" -msgstr "" +msgstr "seç" #: js/oc-dialogs.js:146 js/oc-dialogs.js:166 msgid "Cancel" @@ -140,8 +141,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "Hata" @@ -155,7 +156,7 @@ msgstr "" #: js/share.js:124 msgid "Error while sharing" -msgstr "" +msgstr "Paylaşım sırasında hata " #: js/share.js:135 msgid "Error while unsharing" @@ -175,15 +176,15 @@ msgstr "" #: js/share.js:158 msgid "Share with" -msgstr "" +msgstr "ile Paylaş" #: js/share.js:163 msgid "Share with link" -msgstr "" +msgstr "Bağlantı ile paylaş" #: js/share.js:164 msgid "Password protect" -msgstr "" +msgstr "Şifre korunması" #: js/share.js:168 templates/installation.php:42 templates/login.php:24 #: templates/verify.php:13 @@ -192,7 +193,7 @@ msgstr "Parola" #: js/share.js:173 msgid "Set expiration date" -msgstr "" +msgstr "Son kullanma tarihini ayarla" #: js/share.js:174 msgid "Expiration date" @@ -242,15 +243,15 @@ msgstr "" msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "" @@ -405,87 +406,87 @@ msgstr "Veritabanı sunucusu" msgid "Finish setup" msgstr "Kurulumu tamamla" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Pazar" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Pazartesi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Salı" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Çarşamba" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Perşembe" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Cuma" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Cumartesi" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Ocak" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Şubat" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mart" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Nisan" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mayıs" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Haziran" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Temmuz" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Ağustos" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Eylül" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Ekim" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Kasım" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Aralık" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "kontrolünüzdeki web servisleri" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Çıkış yap" diff --git a/l10n/tr/files.po b/l10n/tr/files.po index de74837363..fbd322633d 100644 --- a/l10n/tr/files.po +++ b/l10n/tr/files.po @@ -6,14 +6,15 @@ # Aranel Surion , 2011, 2012. # Caner Başaran , 2012. # Emre , 2012. +# , 2012. # Necdet Yücel , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 11:50+0000\n" +"Last-Translator: alpere \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +71,7 @@ msgstr "İsim değiştir." #: js/filelist.js:201 js/filelist.js:203 msgid "{new_name} already exists" -msgstr "" +msgstr "{new_name} zaten mevcut" #: js/filelist.js:201 js/filelist.js:203 msgid "replace" @@ -78,7 +79,7 @@ msgstr "değiştir" #: js/filelist.js:201 msgid "suggest name" -msgstr "" +msgstr "Öneri ad" #: js/filelist.js:201 js/filelist.js:203 msgid "cancel" @@ -86,7 +87,7 @@ msgstr "iptal" #: js/filelist.js:250 msgid "replaced {new_name}" -msgstr "" +msgstr "değiştirilen {new_name}" #: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 msgid "undo" @@ -98,11 +99,11 @@ msgstr "" #: js/filelist.js:284 msgid "unshared {files}" -msgstr "" +msgstr "paylaşılmamış {files}" #: js/filelist.js:286 msgid "deleted {files}" -msgstr "" +msgstr "silinen {files}" #: js/files.js:33 msgid "" @@ -132,7 +133,7 @@ msgstr "Bekliyor" #: js/files.js:274 msgid "1 file uploading" -msgstr "" +msgstr "1 dosya yüklendi" #: js/files.js:277 js/files.js:331 js/files.js:346 msgid "{count} files uploading" @@ -157,7 +158,7 @@ msgstr "" #: js/files.js:712 msgid "error while scanning" -msgstr "" +msgstr "tararamada hata oluşdu" #: js/files.js:785 templates/index.php:65 msgid "Name" diff --git a/l10n/tr/files_sharing.po b/l10n/tr/files_sharing.po index fbf76ec640..5cef16c926 100644 --- a/l10n/tr/files_sharing.po +++ b/l10n/tr/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-09-22 01:14+0200\n" -"PO-Revision-Date: 2012-09-21 23:15+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 11:33+0000\n" +"Last-Translator: alpere \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,30 +20,30 @@ msgstr "" #: templates/authenticate.php:4 msgid "Password" -msgstr "" +msgstr "Şifre" #: templates/authenticate.php:6 msgid "Submit" -msgstr "" +msgstr "Gönder" -#: templates/public.php:9 +#: templates/public.php:17 #, php-format msgid "%s shared the folder %s with you" -msgstr "" +msgstr "%s sizinle paylaşılan %s klasör" -#: templates/public.php:11 +#: templates/public.php:19 #, php-format msgid "%s shared the file %s with you" -msgstr "" +msgstr "%s sizinle paylaşılan %s klasör" -#: templates/public.php:14 templates/public.php:30 +#: templates/public.php:22 templates/public.php:38 msgid "Download" -msgstr "" - -#: templates/public.php:29 -msgid "No preview available for" -msgstr "" +msgstr "İndir" #: templates/public.php:37 +msgid "No preview available for" +msgstr "Kullanılabilir önizleme yok" + +#: templates/public.php:43 msgid "web services under your control" -msgstr "" +msgstr "Bilgileriniz güvenli ve şifreli" diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po index df5e72846b..2842d1b2d1 100644 --- a/l10n/tr/settings.po +++ b/l10n/tr/settings.po @@ -5,14 +5,15 @@ # Translators: # Aranel Surion , 2011, 2012. # Emre , 2012. +# , 2012. # Necdet Yücel , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 11:41+0000\n" +"Last-Translator: alpere \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,19 +23,19 @@ msgstr "" #: ajax/apps/ocs.php:20 msgid "Unable to load list from App Store" -msgstr "" +msgstr "App Store'dan liste yüklenemiyor" #: ajax/creategroup.php:10 msgid "Group already exists" -msgstr "" +msgstr "Grup zaten mevcut" #: ajax/creategroup.php:19 msgid "Unable to add group" -msgstr "" +msgstr "Gruba eklenemiyor" #: ajax/enableapp.php:12 msgid "Could not enable app. " -msgstr "" +msgstr "Uygulama devreye alınamadı" #: ajax/lostpassword.php:12 msgid "Email saved" @@ -54,7 +55,7 @@ msgstr "Geçersiz istek" #: ajax/removegroup.php:13 msgid "Unable to delete group" -msgstr "" +msgstr "Grup silinemiyor" #: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" @@ -62,7 +63,7 @@ msgstr "Eşleşme hata" #: ajax/removeuser.php:24 msgid "Unable to delete user" -msgstr "" +msgstr "Kullanıcı silinemiyor" #: ajax/setlanguage.php:15 msgid "Language changed" @@ -75,7 +76,7 @@ msgstr "" #: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" -msgstr "" +msgstr "Kullanıcı %s grubuna eklenemiyor" #: ajax/togglegroups.php:34 #, php-format @@ -104,7 +105,7 @@ msgstr "Uygulamanı Ekle" #: templates/apps.php:11 msgid "More Apps" -msgstr "" +msgstr "Daha fazla App" #: templates/apps.php:27 msgid "Select an App" @@ -157,7 +158,7 @@ msgstr "İndir" #: templates/personal.php:19 msgid "Your password was changed" -msgstr "" +msgstr "Şifreniz değiştirildi" #: templates/personal.php:20 msgid "Unable to change your password" @@ -211,7 +212,7 @@ msgid "" "licensed under the AGPL." -msgstr "" +msgstr "Geliştirilen TarafownCloud community, the source code is altında lisanslanmıştır AGPL." #: templates/users.php:21 templates/users.php:76 msgid "Name" @@ -239,7 +240,7 @@ msgstr "Diğer" #: templates/users.php:80 templates/users.php:112 msgid "Group Admin" -msgstr "" +msgstr "Yönetici Grubu " #: templates/users.php:82 msgid "Quota" diff --git a/l10n/tr/user_webdavauth.po b/l10n/tr/user_webdavauth.po index c047335fa4..55bcf674de 100644 --- a/l10n/tr/user_webdavauth.po +++ b/l10n/tr/user_webdavauth.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-09 10:06+0100\n" -"PO-Revision-Date: 2012-11-09 09:06+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"PO-Revision-Date: 2012-12-04 11:44+0000\n" +"Last-Translator: alpere \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,4 +20,4 @@ msgstr "" #: templates/settings.php:4 msgid "WebDAV URL: http://" -msgstr "" +msgstr "WebDAV URL: http://" diff --git a/settings/l10n/de.php b/settings/l10n/de.php index c80fdad764..33de45a922 100644 --- a/settings/l10n/de.php +++ b/settings/l10n/de.php @@ -11,6 +11,7 @@ "Authentication error" => "Fehler bei der Anmeldung", "Unable to delete user" => "Benutzer konnte nicht gelöscht werden", "Language changed" => "Sprache geändert", +"Admins can't remove themself from the admin group" => "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen.", "Unable to add user to group %s" => "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", "Unable to remove user from group %s" => "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Disable" => "Deaktivieren", diff --git a/settings/l10n/fr.php b/settings/l10n/fr.php index 405c8b0215..8e5169fe0f 100644 --- a/settings/l10n/fr.php +++ b/settings/l10n/fr.php @@ -11,6 +11,7 @@ "Authentication error" => "Erreur d'authentification", "Unable to delete user" => "Impossible de supprimer l'utilisateur", "Language changed" => "Langue changée", +"Admins can't remove themself from the admin group" => "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", "Unable to add user to group %s" => "Impossible d'ajouter l'utilisateur au groupe %s", "Unable to remove user from group %s" => "Impossible de supprimer l'utilisateur du groupe %s", "Disable" => "Désactiver", diff --git a/settings/l10n/sr.php b/settings/l10n/sr.php index 9250dd1397..924d6a07b3 100644 --- a/settings/l10n/sr.php +++ b/settings/l10n/sr.php @@ -1,16 +1,38 @@ "Грешка приликом учитавања списка из Складишта Програма", +"Group already exists" => "Група већ постоји", +"Unable to add group" => "Не могу да додам групу", +"Could not enable app. " => "Не могу да укључим програм", +"Email saved" => "Е-порука сачувана", +"Invalid email" => "Неисправна е-адреса", "OpenID Changed" => "OpenID је измењен", "Invalid request" => "Неисправан захтев", +"Unable to delete group" => "Не могу да уклоним групу", "Authentication error" => "Грешка при аутентификацији", -"Language changed" => "Језик је измењен", +"Unable to delete user" => "Не могу да уклоним корисника", +"Language changed" => "Језик је промењен", +"Admins can't remove themself from the admin group" => "Управници не могу себе уклонити из админ групе", +"Unable to add user to group %s" => "Не могу да додам корисника у групу %s", +"Unable to remove user from group %s" => "Не могу да уклоним корисника из групе %s", +"Disable" => "Искључи", +"Enable" => "Укључи", +"Saving..." => "Чување у току...", "__language_name__" => "__language_name__", +"Add your App" => "Додајте ваш програм", +"More Apps" => "Више програма", "Select an App" => "Изаберите програм", +"See application page at apps.owncloud.com" => "Погледајте страницу са програмима на apps.owncloud.com", +"-licensed by " => "-лиценцирао ", "Documentation" => "Документација", +"Managing Big Files" => "Управљање великим датотекама", "Ask a question" => "Поставите питање", "Problems connecting to help database." => "Проблем у повезивању са базом помоћи", "Go there manually." => "Отиђите тамо ручно.", "Answer" => "Одговор", +"You have used %s of the available %s" => "Искористили сте %s од дозвољених %s", +"Desktop and Mobile Syncing Clients" => "Стони и мобилни клијенти за усклађивање", "Download" => "Преузимање", +"Your password was changed" => "Лозинка је промењена", "Unable to change your password" => "Не могу да изменим вашу лозинку", "Current password" => "Тренутна лозинка", "New password" => "Нова лозинка", @@ -22,10 +44,14 @@ "Language" => "Језик", "Help translate" => " Помозите у превођењу", "use this address to connect to your ownCloud in your file manager" => "користите ову адресу да би се повезали на ownCloud путем менаџњера фајлова", +"Developed by the ownCloud community, the source code is licensed under the AGPL." => "Развијају Оунклауд (ownCloud) заједница, изворни код је издат под АГПЛ лиценцом.", "Name" => "Име", "Password" => "Лозинка", "Groups" => "Групе", "Create" => "Направи", +"Default Quota" => "Подразумевано ограничење", "Other" => "Друго", +"Group Admin" => "Управник групе", +"Quota" => "Ограничење", "Delete" => "Обриши" ); diff --git a/settings/l10n/tr.php b/settings/l10n/tr.php index 49e79256b8..1e301e8d32 100644 --- a/settings/l10n/tr.php +++ b/settings/l10n/tr.php @@ -1,15 +1,23 @@ "App Store'dan liste yüklenemiyor", +"Group already exists" => "Grup zaten mevcut", +"Unable to add group" => "Gruba eklenemiyor", +"Could not enable app. " => "Uygulama devreye alınamadı", "Email saved" => "Eposta kaydedildi", "Invalid email" => "Geçersiz eposta", "OpenID Changed" => "OpenID Değiştirildi", "Invalid request" => "Geçersiz istek", +"Unable to delete group" => "Grup silinemiyor", "Authentication error" => "Eşleşme hata", +"Unable to delete user" => "Kullanıcı silinemiyor", "Language changed" => "Dil değiştirildi", +"Unable to add user to group %s" => "Kullanıcı %s grubuna eklenemiyor", "Disable" => "Etkin değil", "Enable" => "Etkin", "Saving..." => "Kaydediliyor...", "__language_name__" => "__dil_adı__", "Add your App" => "Uygulamanı Ekle", +"More Apps" => "Daha fazla App", "Select an App" => "Bir uygulama seçin", "See application page at apps.owncloud.com" => "Uygulamanın sayfasına apps.owncloud.com adresinden bakın ", "Documentation" => "Dökümantasyon", @@ -20,6 +28,7 @@ "Answer" => "Cevap", "Desktop and Mobile Syncing Clients" => "Masaüstü ve Mobil Senkron İstemcileri", "Download" => "İndir", +"Your password was changed" => "Şifreniz değiştirildi", "Unable to change your password" => "Parolanız değiştirilemiyor", "Current password" => "Mevcut parola", "New password" => "Yeni parola", @@ -31,12 +40,14 @@ "Language" => "Dil", "Help translate" => "Çevirilere yardım edin", "use this address to connect to your ownCloud in your file manager" => "bu adresi kullanarak ownCloud unuza dosya yöneticinizle bağlanın", +"Developed by the ownCloud community, the source code is licensed under the AGPL." => "Geliştirilen TarafownCloud community, the source code is altında lisanslanmıştır AGPL.", "Name" => "Ad", "Password" => "Parola", "Groups" => "Gruplar", "Create" => "Oluştur", "Default Quota" => "Varsayılan Kota", "Other" => "Diğer", +"Group Admin" => "Yönetici Grubu ", "Quota" => "Kota", "Delete" => "Sil" ); From 56dae0652817ac6d583a80820a03ffd98c9cc4db Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 5 Dec 2012 00:25:58 +0100 Subject: [PATCH 423/481] move inline warning styles into CSS, clean up and fix #270 --- core/css/styles.css | 28 +++++++++++++++++++++++----- core/templates/installation.php | 6 +++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 11c2037710..deb4c9053b 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -34,7 +34,12 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', end /* INPUTS */ input[type="text"], input[type="password"] { cursor:text; } -input, textarea, select, button, .button, #quota, div.jp-progress, .pager li a { font-size:1em; font-family:Arial, Verdana, sans-serif; width:10em; margin:.3em; padding:.6em .5em .4em; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; } +input, textarea, select, button, .button, #quota, div.jp-progress, .pager li a { + font-size:1em; font-family:Arial, Verdana, sans-serif; width:10em; margin:.3em; padding:.6em .5em .4em; + background:#fff; color:#333; border:1px solid #ddd; outline:none; + -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; + -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; +} input[type="text"], input[type="password"], input[type="search"], textarea { background:#f8f8f8; color:#555; cursor:text; } input[type="text"], input[type="password"], input[type="search"] { -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; } input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active, @@ -42,7 +47,12 @@ input[type="password"]:hover, input[type="password"]:focus, input[type="password .searchbox input[type="search"]:hover, .searchbox input[type="search"]:focus, .searchbox input[type="search"]:active, textarea:hover, textarea:focus, textarea:active { background-color:#fff; color:#333; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } -input[type="submit"], input[type="button"], button, .button, #quota, div.jp-progress, select, .pager li a { width:auto; padding:.4em; border:1px solid #ddd; font-weight:bold; cursor:pointer; background:#f8f8f8; color:#555; text-shadow:#fff 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } +input[type="submit"], input[type="button"], button, .button, #quota, div.jp-progress, select, .pager li a { + width:auto; padding:.4em; + background:#f8f8f8; font-weight:bold; color:#555; text-shadow:#fff 0 1px 0; border:1px solid #ddd; cursor:pointer; + -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; + -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; +} input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, select:hover, select:focus, select:active, input[type="button"]:focus, .button:hover { background:#fff; color:#333; } input[type="submit"] img, input[type="button"] img, button img, .button img { cursor:pointer; } input[type="checkbox"] { width:auto; } @@ -77,13 +87,14 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- #login { min-height:30em; margin:2em auto 0; border-bottom:1px solid #f8f8f8; background:#eee; } #login form { width:22em; margin:2em auto 2em; padding:0; } -#login form fieldset { background:0; border:0; margin-bottom:20px; padding:0; } +#login form fieldset { margin-bottom:20px; } #login form #adminaccount { margin-bottom:5px; } -#login form fieldset legend { +#login form fieldset legend, #datadirContent label { width:100%; text-align:center; font-weight:bold; color:#999; text-shadow:0 1px 0 white; } #login form fieldset legend a { color:#999; } +#login #datadirContent label { color:#999; display:block; } #login form #datadirField legend { margin-bottom:15px; } /* Nicely grouping input field sets */ @@ -115,12 +126,19 @@ label.infield { cursor: text !important; } #login form #selectDbType { text-align:center; } #login form #selectDbType label { position:static; margin:0 -3px 5px; padding:.4em; - font-size:12px; font-weight:bold; background:#f8f8f8; color:#555; cursor:pointer; + font-size:12px; font-weight:bold; background:#f8f8f8; color:#888; cursor:pointer; border:1px solid #ddd; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } #login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#000; background-color:#e8e8e8; } +fieldset.warning { + padding:8px; + color:#b94a48; background-color:#f2dede; border:1px solid #eed3d7; + border-radius:5px; +} +fieldset.warning legend { color:#b94a48 !important; } + /* NAVIGATION ------------------------------------------------------------- */ #navigation { position:fixed; top:3.5em; float:left; width:12.5em; padding:0; z-index:75; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; overflow:hidden;} diff --git a/core/templates/installation.php b/core/templates/installation.php index 7590c37c77..7d101e90c5 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -19,7 +19,7 @@ -

    +
    t('Security Warning');?> t('No secure random number generator is available, please enable the PHP OpenSSL extension.');?>
    @@ -27,7 +27,7 @@
    -
    +
    t('Security Warning');?> t('Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root.');?>
    @@ -47,7 +47,7 @@
    t( 'Advanced' ); ?> ▾
    -
    +
    From b6fca70ee4ae1eff414172523e4ea2d74ff64606 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 5 Dec 2012 00:37:00 +0100 Subject: [PATCH 424/481] add primary action button in fitting subtle dark blue --- core/css/styles.css | 20 ++++++++++++++++++++ core/templates/installation.php | 2 +- core/templates/login.php | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index deb4c9053b..fbe5f29c9b 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -58,6 +58,26 @@ input[type="submit"] img, input[type="button"] img, button img, .button img { cu input[type="checkbox"] { width:auto; } #quota { cursor:default; } + +/* PRIMARY ACTION BUTTON, use sparingly */ +.primary, input[type="submit"].primary, input[type="button"].primary, button.primary, .button.primary { + border:1px solid #1d2d44; + background:#35537a; color:#ddd; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; +} + .primary:hover, input[type="submit"].primary:hover, input[type="button"].primary:hover, button.primary:hover, .button.primary:hover, + .primary:focus, input[type="submit"].primary:focus, input[type="button"].primary:focus, button.primary:focus, .button.primary:focus { + border:1px solid #1d2d44; + background:#2d3d54; color:#fff; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; + } + .primary:active, input[type="submit"].primary:active, input[type="button"].primary:active, button.primary:active, .button.primary:active { + border:1px solid #1d2d44; + background:#1d2d42; color:#bbb; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; -webkit-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; + } + + #body-login input { font-size:1.5em; } #body-login input[type="text"], #body-login input[type="password"] { width: 13em; } #body-login input.login { width: auto; float: right; } diff --git a/core/templates/installation.php b/core/templates/installation.php index 7d101e90c5..5132192e83 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -129,5 +129,5 @@

    -
    +
    diff --git a/core/templates/login.php b/core/templates/login.php index cb4b6717b6..15b2278b2f 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -25,6 +25,6 @@ />

    - +
    From f0213735fcd1e5bb3d2323e9df3824878072e37d Mon Sep 17 00:00:00 2001 From: Erik Sargent Date: Wed, 5 Dec 2012 08:23:28 -0700 Subject: [PATCH 425/481] Code clean up --- apps/files/js/keyboardshortcuts.js | 364 ++++++++++++----------------- 1 file changed, 154 insertions(+), 210 deletions(-) diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index 69656b9364..562755f55b 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -1,221 +1,165 @@ /** -* Copyright (c) 2012 Erik Sargent -* This file is licensed under the Affero General Public License version 3 or -* later. -*/ - + * Copyright (c) 2012 Erik Sargent + * This file is licensed under the Affero General Public License version 3 or + * later. + */ /***************************** -* Keyboard shortcuts for Files app -* ctrl/cmd+n: new folder -* ctrl/cmd+shift+n: new file -* esc (while new file context menu is open): close menu -* up/down: select file/folder -* enter: open file/folder -* delete/backspace: delete file/folder -* ctrl/cmd+shift+r: rename file/folder -*****************************/ + * Keyboard shortcuts for Files app + * ctrl/cmd+n: new folder + * ctrl/cmd+shift+n: new file + * esc (while new file context menu is open): close menu + * up/down: select file/folder + * enter: open file/folder + * delete/backspace: delete file/folder + *****************************/ var Files = Files || {}; +(function(Files) { + var keys = []; + var keyCodes = { + shift: 16, + n: 78, + cmdFirefox: 224, + cmdOpera: 17, + leftCmdWebKit: 91, + rightCmdWebKit: 93, + ctrl: 17, + esc: 27, + downArrow: 40, + upArrow: 38, + enter: 13, + del: 46 + }; -(function(Files){ -var keys = []; -var keyCodes = { - shift: 16, - n: 78, - r: 82, - cmdFirefox: 224, - cmdOpera: 17, - leftCmdWebKit: 91, - rightCmdWebKit: 93, - ctrl: 17, - esc: 27, - downArrow: 40, - upArrow: 38, - enter: 13, - del: 46 -}; - -function removeA(arr) { - var what, a = arguments, L = a.length, ax; - while (L > 1 && arr.length) { - what = a[--L]; - while ((ax = arr.indexOf(what)) !== -1) { - arr.splice(ax, 1); - } - } - return arr; -} - -function newFile(){ - $("#new").addClass("active"); - $(".popup.popupTop").toggle(true); - $('#new li[data-type="file"]').trigger('click'); - removeA(keys, keyCodes.n); -} -function newFolder(){ - $("#new").addClass("active"); - $(".popup.popupTop").toggle(true); - $('#new li[data-type="folder"]').trigger('click'); - removeA(keys, keyCodes.n); -} -function esc(){ - $("#controls").trigger('click'); -} -function down(){ - var select = -1; - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - select = index + 1; - $(this).removeClass("mouseOver"); - } - }); - - if(select === -1){ - $("#fileList tr:first").addClass("mouseOver"); - } - else{ - $("#fileList tr").each(function(index){ - if(index === select){ - $(this).addClass("mouseOver"); + function removeA(arr) { + var what, a = arguments, + L = a.length, + ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax = arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); } - }); - } -} -function up(){ - var select = -1; - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - select = index - 1; - $(this).removeClass("mouseOver"); - } - }); - - if(select === -1){ - $("#fileList tr:last").addClass("mouseOver"); - } - else{ - $("#fileList tr").each(function(index){ - if(index === select){ - $(this).addClass("mouseOver"); - } - }); - } -} -function enter(){ - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - $(this).removeClass("mouseOver"); - $(this).find("span.nametext").trigger('click'); - } - }); -} -function del(){ - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - $(this).removeClass("mouseOver"); - $(this).find("a.action.delete").trigger('click'); - } - }); -} -function rename(){ - $("#fileList tr").each(function(index){ - if($(this).hasClass("mouseOver")){ - $(this).removeClass("mouseOver"); - $(this).find("a[data-action='Rename']").trigger('click'); - } - }); -} - -Files.bindKeyboardShortcuts = function (document, $) { - $(document).keydown(function(event){//check for modifier keys - var preventDefault = false; - if($.inArray(event.keyCode, keys) === -1) - keys.push(event.keyCode); - - if( - $.inArray(keyCodes.n, keys) !== -1 - && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 - || $.inArray(keyCodes.cmdOpera, keys) !== -1 - || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1 - || event.ctrlKey) - ){ - preventDefault = true;//new file/folder prevent browser from responding } - /*if( - !$("#new").hasClass("active") - && $.inArray(keyCodes.r, keys) !== -1 - && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 - || $.inArray(keyCodes.cmdOpera, keys) !== -1 - || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1 - || event.ctrlKey) - && $.inArray(keyCodes.shift, keys) !== -1 - ){ - $("#fileList tr").each(function(index){//prevent default when renaming file/folder - if($(this).hasClass("mouseOver")){ - preventDefault = true; - } + return arr; + } + + function newFile() { + $("#new").addClass("active"); + $(".popup.popupTop").toggle(true); + $('#new li[data-type="file"]').trigger('click'); + removeA(keys, keyCodes.n); + } + + function newFolder() { + $("#new").addClass("active"); + $(".popup.popupTop").toggle(true); + $('#new li[data-type="folder"]').trigger('click'); + removeA(keys, keyCodes.n); + } + + function esc() { + $("#controls").trigger('click'); + } + + function down() { + var select = -1; + $("#fileList tr").each(function(index) { + if ($(this).hasClass("mouseOver")) { + select = index + 1; + $(this).removeClass("mouseOver"); + } + }); + if (select === -1) { + $("#fileList tr:first").addClass("mouseOver"); + } else { + $("#fileList tr").each(function(index) { + if (index === select) { + $(this).addClass("mouseOver"); + } }); - }*/ - if(preventDefault){ - event.preventDefault(); //Prevent web browser from responding - event.stopPropagation(); - return false; } - }); - - $(document).keyup(function(event){ - // do your event.keyCode checks in here - if( - $.inArray(keyCodes.n, keys) !== -1 - && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 - || $.inArray(keyCodes.cmdOpera, keys) !== -1 - || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1 - || event.ctrlKey - )){ - if($.inArray(keyCodes.shift, keys) !== -1 - ){ //16=shift, New File - newFile(); + } + + function up() { + var select = -1; + $("#fileList tr").each(function(index) { + if ($(this).hasClass("mouseOver")) { + select = index - 1; + $(this).removeClass("mouseOver"); } - else{ //New Folder - newFolder(); + }); + if (select === -1) { + $("#fileList tr:last").addClass("mouseOver"); + } else { + $("#fileList tr").each(function(index) { + if (index === select) { + $(this).addClass("mouseOver"); + } + }); + } + } + + function enter() { + $("#fileList tr").each(function(index) { + if ($(this).hasClass("mouseOver")) { + $(this).removeClass("mouseOver"); + $(this).find("span.nametext").trigger('click'); } - } - - else if($("#new").hasClass("active") && $.inArray(keyCodes.esc, keys) !== -1){ //close new window - esc(); - } - else if($.inArray(keyCodes.downArrow, keys) !== -1){ //select file - down(); - } - else if($.inArray(keyCodes.upArrow, keys) !== -1){ //select file - up(); - } - else if(!$("#new").hasClass("active") && $.inArray(keyCodes.enter, keys) !== -1){//open file - enter(); - } - else if(!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) {//delete file - del(); - } - /*else if( - !$("#new").hasClass("active") - && $.inArray(keyCodes.r, keys) !== -1 - && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 - || $.inArray(keyCodes.cmdOpera, keys) !== -1 - || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 - || $.inArray(keyCodes.ctrl, keys) !== -1 - || event.ctrlKey) - && $.inArray(keyCodes.shift, keys) !== -1 - ){//rename file - rename(); - }*/ - - removeA(keys, event.keyCode); - }); -}; + }); + } + + function del() { + $("#fileList tr").each(function(index) { + if ($(this).hasClass("mouseOver")) { + $(this).removeClass("mouseOver"); + $(this).find("a.action.delete").trigger('click'); + } + }); + } + + function rename() { + $("#fileList tr").each(function(index) { + if ($(this).hasClass("mouseOver")) { + $(this).removeClass("mouseOver"); + $(this).find("a[data-action='Rename']").trigger('click'); + } + }); + } + Files.bindKeyboardShortcuts = function(document, $) { + $(document).keydown(function(event) { //check for modifier keys + var preventDefault = false; + if ($.inArray(event.keyCode, keys) === -1) keys.push(event.keyCode); + if ( + $.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) { + preventDefault = true; //new file/folder prevent browser from responding + } + if (preventDefault) { + event.preventDefault(); //Prevent web browser from responding + event.stopPropagation(); + return false; + } + }); + $(document).keyup(function(event) { + // do your event.keyCode checks in here + if ( + $.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) { + if ($.inArray(keyCodes.shift, keys) !== -1) { //16=shift, New File + newFile(); + } else { //New Folder + newFolder(); + } + } else if ($("#new").hasClass("active") && $.inArray(keyCodes.esc, keys) !== -1) { //close new window + esc(); + } else if ($.inArray(keyCodes.downArrow, keys) !== -1) { //select file + down(); + } else if ($.inArray(keyCodes.upArrow, keys) !== -1) { //select file + up(); + } else if (!$("#new").hasClass("active") && $.inArray(keyCodes.enter, keys) !== -1) { //open file + enter(); + } else if (!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) { //delete file + del(); + } + removeA(keys, event.keyCode); + }); + }; })(Files); \ No newline at end of file From 69a9fe75a0643bad65189de36163fef2bf75bab4 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 6 Dec 2012 00:12:08 +0100 Subject: [PATCH 426/481] [tx-robot] updated from transifex --- core/l10n/is.php | 36 ++ l10n/fi_FI/settings.po | 8 +- l10n/is/core.po | 540 ++++++++++++++++++++++++++++ l10n/is/files.po | 266 ++++++++++++++ l10n/is/files_encryption.po | 34 ++ l10n/is/files_external.po | 107 ++++++ l10n/is/files_sharing.po | 48 +++ l10n/is/files_versions.po | 42 +++ l10n/is/lib.po | 152 ++++++++ l10n/is/settings.po | 247 +++++++++++++ l10n/is/user_ldap.po | 170 +++++++++ l10n/is/user_webdavauth.po | 22 ++ l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 14 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- settings/l10n/fi_FI.php | 1 + 23 files changed, 1685 insertions(+), 20 deletions(-) create mode 100644 core/l10n/is.php create mode 100644 l10n/is/core.po create mode 100644 l10n/is/files.po create mode 100644 l10n/is/files_encryption.po create mode 100644 l10n/is/files_external.po create mode 100644 l10n/is/files_sharing.po create mode 100644 l10n/is/files_versions.po create mode 100644 l10n/is/lib.po create mode 100644 l10n/is/settings.po create mode 100644 l10n/is/user_ldap.po create mode 100644 l10n/is/user_webdavauth.po diff --git a/core/l10n/is.php b/core/l10n/is.php new file mode 100644 index 0000000000..23117cddf8 --- /dev/null +++ b/core/l10n/is.php @@ -0,0 +1,36 @@ + "Flokkur ekki gefin", +"seconds ago" => "sek síðan", +"1 minute ago" => "1 min síðan", +"{minutes} minutes ago" => "{minutes} min síðan", +"today" => "í dag", +"yesterday" => "í gær", +"{days} days ago" => "{days} dagar síðan", +"last month" => "síðasta mánuði", +"months ago" => "mánuðir síðan", +"last year" => "síðasta ári", +"years ago" => "árum síðan", +"Password" => "Lykilorð", +"Username" => "Notendanafn", +"Personal" => "Persónustillingar", +"Admin" => "Vefstjórn", +"Help" => "Help", +"Cloud not found" => "Skýið finnst eigi", +"Edit categories" => "Breyta flokkum", +"Add" => "Bæta", +"Create an admin account" => "Útbúa vefstjóra aðgang", +"January" => "Janúar", +"February" => "Febrúar", +"March" => "Mars", +"April" => "Apríl", +"May" => "Maí", +"June" => "Júní", +"July" => "Júlí", +"August" => "Ágúst", +"September" => "September", +"October" => "Október", +"Log out" => "Útskrá", +"You are logged out." => "Þú ert útskráð(ur).", +"prev" => "fyrra", +"next" => "næsta" +); diff --git a/l10n/fi_FI/settings.po b/l10n/fi_FI/settings.po index d7f6f888d4..bfb17285b2 100644 --- a/l10n/fi_FI/settings.po +++ b/l10n/fi_FI/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-12-05 10:40+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +70,7 @@ msgstr "Kieli on vaihdettu" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/is/core.po b/l10n/is/core.po new file mode 100644 index 0000000000..cb50d8be88 --- /dev/null +++ b/l10n/is/core.po @@ -0,0 +1,540 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2012. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-12-05 14:23+0000\n" +"Last-Translator: kaztraz \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 +msgid "Category type not provided." +msgstr "Flokkur ekki gefin" + +#: ajax/vcategories/add.php:30 +msgid "No category to add?" +msgstr "" + +#: ajax/vcategories/add.php:37 +msgid "This category already exists: " +msgstr "" + +#: ajax/vcategories/addToFavorites.php:26 ajax/vcategories/delete.php:27 +#: ajax/vcategories/favorites.php:24 +#: ajax/vcategories/removeFromFavorites.php:26 +msgid "Object type not provided." +msgstr "" + +#: ajax/vcategories/addToFavorites.php:30 +#: ajax/vcategories/removeFromFavorites.php:30 +#, php-format +msgid "%s ID not provided." +msgstr "" + +#: ajax/vcategories/addToFavorites.php:35 +#, php-format +msgid "Error adding %s to favorites." +msgstr "" + +#: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 +msgid "No categories selected for deletion." +msgstr "" + +#: ajax/vcategories/removeFromFavorites.php:35 +#, php-format +msgid "Error removing %s from favorites." +msgstr "" + +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 +msgid "Settings" +msgstr "" + +#: js/js.js:704 +msgid "seconds ago" +msgstr "sek síðan" + +#: js/js.js:705 +msgid "1 minute ago" +msgstr "1 min síðan" + +#: js/js.js:706 +msgid "{minutes} minutes ago" +msgstr "{minutes} min síðan" + +#: js/js.js:707 +msgid "1 hour ago" +msgstr "" + +#: js/js.js:708 +msgid "{hours} hours ago" +msgstr "" + +#: js/js.js:709 +msgid "today" +msgstr "í dag" + +#: js/js.js:710 +msgid "yesterday" +msgstr "í gær" + +#: js/js.js:711 +msgid "{days} days ago" +msgstr "{days} dagar síðan" + +#: js/js.js:712 +msgid "last month" +msgstr "síðasta mánuði" + +#: js/js.js:713 +msgid "{months} months ago" +msgstr "" + +#: js/js.js:714 +msgid "months ago" +msgstr "mánuðir síðan" + +#: js/js.js:715 +msgid "last year" +msgstr "síðasta ári" + +#: js/js.js:716 +msgid "years ago" +msgstr "árum síðan" + +#: js/oc-dialogs.js:126 +msgid "Choose" +msgstr "" + +#: js/oc-dialogs.js:146 js/oc-dialogs.js:166 +msgid "Cancel" +msgstr "" + +#: js/oc-dialogs.js:162 +msgid "No" +msgstr "" + +#: js/oc-dialogs.js:163 +msgid "Yes" +msgstr "" + +#: js/oc-dialogs.js:180 +msgid "Ok" +msgstr "" + +#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 +#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 +msgid "The object type is not specified." +msgstr "" + +#: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 +msgid "Error" +msgstr "" + +#: js/oc-vcategories.js:179 +msgid "The app name is not specified." +msgstr "" + +#: js/oc-vcategories.js:194 +msgid "The required file {file} is not installed!" +msgstr "" + +#: js/share.js:124 +msgid "Error while sharing" +msgstr "" + +#: js/share.js:135 +msgid "Error while unsharing" +msgstr "" + +#: js/share.js:142 +msgid "Error while changing permissions" +msgstr "" + +#: js/share.js:151 +msgid "Shared with you and the group {group} by {owner}" +msgstr "" + +#: js/share.js:153 +msgid "Shared with you by {owner}" +msgstr "" + +#: js/share.js:158 +msgid "Share with" +msgstr "" + +#: js/share.js:163 +msgid "Share with link" +msgstr "" + +#: js/share.js:164 +msgid "Password protect" +msgstr "" + +#: js/share.js:168 templates/installation.php:42 templates/login.php:24 +#: templates/verify.php:13 +msgid "Password" +msgstr "Lykilorð" + +#: js/share.js:173 +msgid "Set expiration date" +msgstr "" + +#: js/share.js:174 +msgid "Expiration date" +msgstr "" + +#: js/share.js:206 +msgid "Share via email:" +msgstr "" + +#: js/share.js:208 +msgid "No people found" +msgstr "" + +#: js/share.js:235 +msgid "Resharing is not allowed" +msgstr "" + +#: js/share.js:271 +msgid "Shared in {item} with {user}" +msgstr "" + +#: js/share.js:292 +msgid "Unshare" +msgstr "" + +#: js/share.js:304 +msgid "can edit" +msgstr "" + +#: js/share.js:306 +msgid "access control" +msgstr "" + +#: js/share.js:309 +msgid "create" +msgstr "" + +#: js/share.js:312 +msgid "update" +msgstr "" + +#: js/share.js:315 +msgid "delete" +msgstr "" + +#: js/share.js:318 +msgid "share" +msgstr "" + +#: js/share.js:349 js/share.js:520 js/share.js:522 +msgid "Password protected" +msgstr "" + +#: js/share.js:533 +msgid "Error unsetting expiration date" +msgstr "" + +#: js/share.js:545 +msgid "Error setting expiration date" +msgstr "" + +#: lostpassword/controller.php:47 +msgid "ownCloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:2 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Reset email send." +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Request failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:38 +#: templates/login.php:20 +msgid "Username" +msgstr "Notendanafn" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + +#: strings.php:5 +msgid "Personal" +msgstr "Persónustillingar" + +#: strings.php:6 +msgid "Users" +msgstr "" + +#: strings.php:7 +msgid "Apps" +msgstr "" + +#: strings.php:8 +msgid "Admin" +msgstr "Vefstjórn" + +#: strings.php:9 +msgid "Help" +msgstr "Help" + +#: templates/403.php:12 +msgid "Access forbidden" +msgstr "" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Skýið finnst eigi" + +#: templates/edit_categories_dialog.php:4 +msgid "Edit categories" +msgstr "Breyta flokkum" + +#: templates/edit_categories_dialog.php:16 +msgid "Add" +msgstr "Bæta" + +#: templates/installation.php:23 templates/installation.php:31 +msgid "Security Warning" +msgstr "" + +#: templates/installation.php:24 +msgid "" +"No secure random number generator is available, please enable the PHP " +"OpenSSL extension." +msgstr "" + +#: templates/installation.php:26 +msgid "" +"Without a secure random number generator an attacker may be able to predict " +"password reset tokens and take over your account." +msgstr "" + +#: templates/installation.php:32 +msgid "" +"Your data directory and your files are probably accessible from the " +"internet. The .htaccess file that ownCloud provides is not working. We " +"strongly suggest that you configure your webserver in a way that the data " +"directory is no longer accessible or you move the data directory outside the" +" webserver document root." +msgstr "" + +#: templates/installation.php:36 +msgid "Create an admin account" +msgstr "Útbúa vefstjóra aðgang" + +#: templates/installation.php:48 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:50 +msgid "Data folder" +msgstr "" + +#: templates/installation.php:57 +msgid "Configure the database" +msgstr "" + +#: templates/installation.php:62 templates/installation.php:73 +#: templates/installation.php:83 templates/installation.php:93 +msgid "will be used" +msgstr "" + +#: templates/installation.php:105 +msgid "Database user" +msgstr "" + +#: templates/installation.php:109 +msgid "Database password" +msgstr "" + +#: templates/installation.php:113 +msgid "Database name" +msgstr "" + +#: templates/installation.php:121 +msgid "Database tablespace" +msgstr "" + +#: templates/installation.php:127 +msgid "Database host" +msgstr "" + +#: templates/installation.php:132 +msgid "Finish setup" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Sunday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Monday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Tuesday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Wednesday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Thursday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Friday" +msgstr "" + +#: templates/layout.guest.php:16 templates/layout.user.php:17 +msgid "Saturday" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "January" +msgstr "Janúar" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "February" +msgstr "Febrúar" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "March" +msgstr "Mars" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "April" +msgstr "Apríl" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "May" +msgstr "Maí" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "June" +msgstr "Júní" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "July" +msgstr "Júlí" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "August" +msgstr "Ágúst" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "September" +msgstr "September" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "October" +msgstr "Október" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "November" +msgstr "" + +#: templates/layout.guest.php:17 templates/layout.user.php:18 +msgid "December" +msgstr "" + +#: templates/layout.guest.php:42 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:45 +msgid "Log out" +msgstr "Útskrá" + +#: templates/login.php:8 +msgid "Automatic logon rejected!" +msgstr "" + +#: templates/login.php:9 +msgid "" +"If you did not change your password recently, your account may be " +"compromised!" +msgstr "" + +#: templates/login.php:10 +msgid "Please change your password to secure your account again." +msgstr "" + +#: templates/login.php:15 +msgid "Lost your password?" +msgstr "" + +#: templates/login.php:27 +msgid "remember" +msgstr "" + +#: templates/login.php:28 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Þú ert útskráð(ur)." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "fyrra" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "næsta" + +#: templates/verify.php:5 +msgid "Security Warning!" +msgstr "" + +#: templates/verify.php:6 +msgid "" +"Please verify your password.
    For security reasons you may be " +"occasionally asked to enter your password again." +msgstr "" + +#: templates/verify.php:16 +msgid "Verify" +msgstr "" diff --git a/l10n/is/files.po b/l10n/is/files.po new file mode 100644 index 0000000000..094b80b04e --- /dev/null +++ b/l10n/is/files.po @@ -0,0 +1,266 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2011-08-13 02:19+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/upload.php:20 +msgid "There is no error, the file uploaded with success" +msgstr "" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" + +#: ajax/upload.php:23 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" + +#: ajax/upload.php:25 +msgid "The uploaded file was only partially uploaded" +msgstr "" + +#: ajax/upload.php:26 +msgid "No file was uploaded" +msgstr "" + +#: ajax/upload.php:27 +msgid "Missing a temporary folder" +msgstr "" + +#: ajax/upload.php:28 +msgid "Failed to write to disk" +msgstr "" + +#: appinfo/app.php:10 +msgid "Files" +msgstr "" + +#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +msgid "Unshare" +msgstr "" + +#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +msgid "Delete" +msgstr "" + +#: js/fileactions.js:181 +msgid "Rename" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "{new_name} already exists" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "replace" +msgstr "" + +#: js/filelist.js:201 +msgid "suggest name" +msgstr "" + +#: js/filelist.js:201 js/filelist.js:203 +msgid "cancel" +msgstr "" + +#: js/filelist.js:250 +msgid "replaced {new_name}" +msgstr "" + +#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +msgid "undo" +msgstr "" + +#: js/filelist.js:252 +msgid "replaced {new_name} with {old_name}" +msgstr "" + +#: js/filelist.js:284 +msgid "unshared {files}" +msgstr "" + +#: js/filelist.js:286 +msgid "deleted {files}" +msgstr "" + +#: js/files.js:33 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:183 +msgid "generating ZIP-file, it may take some time." +msgstr "" + +#: js/files.js:218 +msgid "Unable to upload your file as it is a directory or has 0 bytes" +msgstr "" + +#: js/files.js:218 +msgid "Upload Error" +msgstr "" + +#: js/files.js:235 +msgid "Close" +msgstr "" + +#: js/files.js:254 js/files.js:368 js/files.js:398 +msgid "Pending" +msgstr "" + +#: js/files.js:274 +msgid "1 file uploading" +msgstr "" + +#: js/files.js:277 js/files.js:331 js/files.js:346 +msgid "{count} files uploading" +msgstr "" + +#: js/files.js:349 js/files.js:382 +msgid "Upload cancelled." +msgstr "" + +#: js/files.js:451 +msgid "" +"File upload is in progress. Leaving the page now will cancel the upload." +msgstr "" + +#: js/files.js:523 +msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" +msgstr "" + +#: js/files.js:704 +msgid "{count} files scanned" +msgstr "" + +#: js/files.js:712 +msgid "error while scanning" +msgstr "" + +#: js/files.js:785 templates/index.php:65 +msgid "Name" +msgstr "" + +#: js/files.js:786 templates/index.php:76 +msgid "Size" +msgstr "" + +#: js/files.js:787 templates/index.php:78 +msgid "Modified" +msgstr "" + +#: js/files.js:814 +msgid "1 folder" +msgstr "" + +#: js/files.js:816 +msgid "{count} folders" +msgstr "" + +#: js/files.js:824 +msgid "1 file" +msgstr "" + +#: js/files.js:826 +msgid "{count} files" +msgstr "" + +#: templates/admin.php:5 +msgid "File handling" +msgstr "" + +#: templates/admin.php:7 +msgid "Maximum upload size" +msgstr "" + +#: templates/admin.php:9 +msgid "max. possible: " +msgstr "" + +#: templates/admin.php:12 +msgid "Needed for multi-file and folder downloads." +msgstr "" + +#: templates/admin.php:14 +msgid "Enable ZIP-download" +msgstr "" + +#: templates/admin.php:17 +msgid "0 is unlimited" +msgstr "" + +#: templates/admin.php:19 +msgid "Maximum input size for ZIP files" +msgstr "" + +#: templates/admin.php:23 +msgid "Save" +msgstr "" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:12 +msgid "Folder" +msgstr "" + +#: templates/index.php:14 +msgid "From link" +msgstr "" + +#: templates/index.php:35 +msgid "Upload" +msgstr "" + +#: templates/index.php:43 +msgid "Cancel upload" +msgstr "" + +#: templates/index.php:57 +msgid "Nothing in here. Upload something!" +msgstr "" + +#: templates/index.php:71 +msgid "Download" +msgstr "" + +#: templates/index.php:103 +msgid "Upload too large" +msgstr "" + +#: templates/index.php:105 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" + +#: templates/index.php:110 +msgid "Files are being scanned, please wait." +msgstr "" + +#: templates/index.php:113 +msgid "Current scanning" +msgstr "" diff --git a/l10n/is/files_encryption.po b/l10n/is/files_encryption.po new file mode 100644 index 0000000000..aba8a60b74 --- /dev/null +++ b/l10n/is/files_encryption.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-08-12 22:33+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:3 +msgid "Encryption" +msgstr "" + +#: templates/settings.php:4 +msgid "Exclude the following file types from encryption" +msgstr "" + +#: templates/settings.php:5 +msgid "None" +msgstr "" + +#: templates/settings.php:12 +msgid "Enable Encryption" +msgstr "" diff --git a/l10n/is/files_external.po b/l10n/is/files_external.po new file mode 100644 index 0000000000..3789d361a1 --- /dev/null +++ b/l10n/is/files_external.po @@ -0,0 +1,107 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-08-12 22:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: js/dropbox.js:7 js/dropbox.js:25 js/google.js:7 js/google.js:23 +msgid "Access granted" +msgstr "" + +#: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 +msgid "Error configuring Dropbox storage" +msgstr "" + +#: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 +msgid "Grant access" +msgstr "" + +#: js/dropbox.js:73 js/google.js:72 +msgid "Fill out all required fields" +msgstr "" + +#: js/dropbox.js:85 +msgid "Please provide a valid Dropbox app key and secret." +msgstr "" + +#: js/google.js:26 js/google.js:73 js/google.js:78 +msgid "Error configuring Google Drive storage" +msgstr "" + +#: templates/settings.php:3 +msgid "External Storage" +msgstr "" + +#: templates/settings.php:7 templates/settings.php:21 +msgid "Mount point" +msgstr "" + +#: templates/settings.php:8 +msgid "Backend" +msgstr "" + +#: templates/settings.php:9 +msgid "Configuration" +msgstr "" + +#: templates/settings.php:10 +msgid "Options" +msgstr "" + +#: templates/settings.php:11 +msgid "Applicable" +msgstr "" + +#: templates/settings.php:26 +msgid "Add mount point" +msgstr "" + +#: templates/settings.php:84 +msgid "None set" +msgstr "" + +#: templates/settings.php:85 +msgid "All Users" +msgstr "" + +#: templates/settings.php:86 +msgid "Groups" +msgstr "" + +#: templates/settings.php:94 +msgid "Users" +msgstr "" + +#: templates/settings.php:107 templates/settings.php:108 +#: templates/settings.php:148 templates/settings.php:149 +msgid "Delete" +msgstr "" + +#: templates/settings.php:123 +msgid "Enable User External Storage" +msgstr "" + +#: templates/settings.php:124 +msgid "Allow users to mount their own external storage" +msgstr "" + +#: templates/settings.php:138 +msgid "SSL root certificates" +msgstr "" + +#: templates/settings.php:157 +msgid "Import Root Certificate" +msgstr "" diff --git a/l10n/is/files_sharing.po b/l10n/is/files_sharing.po new file mode 100644 index 0000000000..1d9102f084 --- /dev/null +++ b/l10n/is/files_sharing.po @@ -0,0 +1,48 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-08-12 22:35+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/authenticate.php:4 +msgid "Password" +msgstr "" + +#: templates/authenticate.php:6 +msgid "Submit" +msgstr "" + +#: templates/public.php:17 +#, php-format +msgid "%s shared the folder %s with you" +msgstr "" + +#: templates/public.php:19 +#, php-format +msgid "%s shared the file %s with you" +msgstr "" + +#: templates/public.php:22 templates/public.php:38 +msgid "Download" +msgstr "" + +#: templates/public.php:37 +msgid "No preview available for" +msgstr "" + +#: templates/public.php:43 +msgid "web services under your control" +msgstr "" diff --git a/l10n/is/files_versions.po b/l10n/is/files_versions.po new file mode 100644 index 0000000000..82fb035847 --- /dev/null +++ b/l10n/is/files_versions.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-08-12 22:37+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: js/settings-personal.js:31 templates/settings-personal.php:10 +msgid "Expire all versions" +msgstr "" + +#: js/versions.js:16 +msgid "History" +msgstr "" + +#: templates/settings-personal.php:4 +msgid "Versions" +msgstr "" + +#: templates/settings-personal.php:7 +msgid "This will delete all existing backup versions of your files" +msgstr "" + +#: templates/settings.php:3 +msgid "Files Versioning" +msgstr "" + +#: templates/settings.php:4 +msgid "Enable" +msgstr "" diff --git a/l10n/is/lib.po b/l10n/is/lib.po new file mode 100644 index 0000000000..8531c69aa2 --- /dev/null +++ b/l10n/is/lib.po @@ -0,0 +1,152 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-07-27 22:23+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: app.php:287 +msgid "Help" +msgstr "" + +#: app.php:294 +msgid "Personal" +msgstr "" + +#: app.php:299 +msgid "Settings" +msgstr "" + +#: app.php:304 +msgid "Users" +msgstr "" + +#: app.php:311 +msgid "Apps" +msgstr "" + +#: app.php:313 +msgid "Admin" +msgstr "" + +#: files.php:361 +msgid "ZIP download is turned off." +msgstr "" + +#: files.php:362 +msgid "Files need to be downloaded one by one." +msgstr "" + +#: files.php:362 files.php:387 +msgid "Back to Files" +msgstr "" + +#: files.php:386 +msgid "Selected files too large to generate zip file." +msgstr "" + +#: json.php:28 +msgid "Application is not enabled" +msgstr "" + +#: json.php:39 json.php:64 json.php:77 json.php:89 +msgid "Authentication error" +msgstr "" + +#: json.php:51 +msgid "Token expired. Please reload page." +msgstr "" + +#: search/provider/file.php:17 search/provider/file.php:35 +msgid "Files" +msgstr "" + +#: search/provider/file.php:26 search/provider/file.php:33 +msgid "Text" +msgstr "" + +#: search/provider/file.php:29 +msgid "Images" +msgstr "" + +#: template.php:103 +msgid "seconds ago" +msgstr "" + +#: template.php:104 +msgid "1 minute ago" +msgstr "" + +#: template.php:105 +#, php-format +msgid "%d minutes ago" +msgstr "" + +#: template.php:106 +msgid "1 hour ago" +msgstr "" + +#: template.php:107 +#, php-format +msgid "%d hours ago" +msgstr "" + +#: template.php:108 +msgid "today" +msgstr "" + +#: template.php:109 +msgid "yesterday" +msgstr "" + +#: template.php:110 +#, php-format +msgid "%d days ago" +msgstr "" + +#: template.php:111 +msgid "last month" +msgstr "" + +#: template.php:112 +#, php-format +msgid "%d months ago" +msgstr "" + +#: template.php:113 +msgid "last year" +msgstr "" + +#: template.php:114 +msgid "years ago" +msgstr "" + +#: updater.php:75 +#, php-format +msgid "%s is available. Get more information" +msgstr "" + +#: updater.php:77 +msgid "up to date" +msgstr "" + +#: updater.php:80 +msgid "updates check is disabled" +msgstr "" + +#: vcategories.php:188 vcategories.php:249 +#, php-format +msgid "Could not find category \"%s\"" +msgstr "" diff --git a/l10n/is/settings.po b/l10n/is/settings.po new file mode 100644 index 0000000000..fadc3690e0 --- /dev/null +++ b/l10n/is/settings.po @@ -0,0 +1,247 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2011-07-25 16:05+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/apps/ocs.php:20 +msgid "Unable to load list from App Store" +msgstr "" + +#: ajax/creategroup.php:10 +msgid "Group already exists" +msgstr "" + +#: ajax/creategroup.php:19 +msgid "Unable to add group" +msgstr "" + +#: ajax/enableapp.php:12 +msgid "Could not enable app. " +msgstr "" + +#: ajax/lostpassword.php:12 +msgid "Email saved" +msgstr "" + +#: ajax/lostpassword.php:14 +msgid "Invalid email" +msgstr "" + +#: ajax/openid.php:13 +msgid "OpenID Changed" +msgstr "" + +#: ajax/openid.php:15 ajax/setlanguage.php:17 ajax/setlanguage.php:20 +msgid "Invalid request" +msgstr "" + +#: ajax/removegroup.php:13 +msgid "Unable to delete group" +msgstr "" + +#: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 +msgid "Authentication error" +msgstr "" + +#: ajax/removeuser.php:24 +msgid "Unable to delete user" +msgstr "" + +#: ajax/setlanguage.php:15 +msgid "Language changed" +msgstr "" + +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:28 +#, php-format +msgid "Unable to add user to group %s" +msgstr "" + +#: ajax/togglegroups.php:34 +#, php-format +msgid "Unable to remove user from group %s" +msgstr "" + +#: js/apps.js:28 js/apps.js:67 +msgid "Disable" +msgstr "" + +#: js/apps.js:28 js/apps.js:55 +msgid "Enable" +msgstr "" + +#: js/personal.js:69 +msgid "Saving..." +msgstr "" + +#: personal.php:42 personal.php:43 +msgid "__language_name__" +msgstr "" + +#: templates/apps.php:10 +msgid "Add your App" +msgstr "" + +#: templates/apps.php:11 +msgid "More Apps" +msgstr "" + +#: templates/apps.php:27 +msgid "Select an App" +msgstr "" + +#: templates/apps.php:31 +msgid "See application page at apps.owncloud.com" +msgstr "" + +#: templates/apps.php:32 +msgid "-licensed by " +msgstr "" + +#: templates/help.php:9 +msgid "Documentation" +msgstr "" + +#: templates/help.php:10 +msgid "Managing Big Files" +msgstr "" + +#: templates/help.php:11 +msgid "Ask a question" +msgstr "" + +#: templates/help.php:22 +msgid "Problems connecting to help database." +msgstr "" + +#: templates/help.php:23 +msgid "Go there manually." +msgstr "" + +#: templates/help.php:31 +msgid "Answer" +msgstr "" + +#: templates/personal.php:8 +#, php-format +msgid "You have used %s of the available %s" +msgstr "" + +#: templates/personal.php:12 +msgid "Desktop and Mobile Syncing Clients" +msgstr "" + +#: templates/personal.php:13 +msgid "Download" +msgstr "" + +#: templates/personal.php:19 +msgid "Your password was changed" +msgstr "" + +#: templates/personal.php:20 +msgid "Unable to change your password" +msgstr "" + +#: templates/personal.php:21 +msgid "Current password" +msgstr "" + +#: templates/personal.php:22 +msgid "New password" +msgstr "" + +#: templates/personal.php:23 +msgid "show" +msgstr "" + +#: templates/personal.php:24 +msgid "Change password" +msgstr "" + +#: templates/personal.php:30 +msgid "Email" +msgstr "" + +#: templates/personal.php:31 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:32 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:38 templates/personal.php:39 +msgid "Language" +msgstr "" + +#: templates/personal.php:44 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:51 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" + +#: templates/personal.php:61 +msgid "" +"Developed by the ownCloud community, the source code is " +"licensed under the AGPL." +msgstr "" + +#: templates/users.php:21 templates/users.php:76 +msgid "Name" +msgstr "" + +#: templates/users.php:23 templates/users.php:77 +msgid "Password" +msgstr "" + +#: templates/users.php:26 templates/users.php:78 templates/users.php:98 +msgid "Groups" +msgstr "" + +#: templates/users.php:32 +msgid "Create" +msgstr "" + +#: templates/users.php:35 +msgid "Default Quota" +msgstr "" + +#: templates/users.php:55 templates/users.php:138 +msgid "Other" +msgstr "" + +#: templates/users.php:80 templates/users.php:112 +msgid "Group Admin" +msgstr "" + +#: templates/users.php:82 +msgid "Quota" +msgstr "" + +#: templates/users.php:146 +msgid "Delete" +msgstr "" diff --git a/l10n/is/user_ldap.po b/l10n/is/user_ldap.po new file mode 100644 index 0000000000..469ae8a332 --- /dev/null +++ b/l10n/is/user_ldap.po @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-08-12 22:45+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:8 +msgid "Host" +msgstr "" + +#: templates/settings.php:8 +msgid "" +"You can omit the protocol, except you require SSL. Then start with ldaps://" +msgstr "" + +#: templates/settings.php:9 +msgid "Base DN" +msgstr "" + +#: templates/settings.php:9 +msgid "You can specify Base DN for users and groups in the Advanced tab" +msgstr "" + +#: templates/settings.php:10 +msgid "User DN" +msgstr "" + +#: templates/settings.php:10 +msgid "" +"The DN of the client user with which the bind shall be done, e.g. " +"uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " +"empty." +msgstr "" + +#: templates/settings.php:11 +msgid "Password" +msgstr "" + +#: templates/settings.php:11 +msgid "For anonymous access, leave DN and Password empty." +msgstr "" + +#: templates/settings.php:12 +msgid "User Login Filter" +msgstr "" + +#: templates/settings.php:12 +#, php-format +msgid "" +"Defines the filter to apply, when login is attempted. %%uid replaces the " +"username in the login action." +msgstr "" + +#: templates/settings.php:12 +#, php-format +msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" +msgstr "" + +#: templates/settings.php:13 +msgid "User List Filter" +msgstr "" + +#: templates/settings.php:13 +msgid "Defines the filter to apply, when retrieving users." +msgstr "" + +#: templates/settings.php:13 +msgid "without any placeholder, e.g. \"objectClass=person\"." +msgstr "" + +#: templates/settings.php:14 +msgid "Group Filter" +msgstr "" + +#: templates/settings.php:14 +msgid "Defines the filter to apply, when retrieving groups." +msgstr "" + +#: templates/settings.php:14 +msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." +msgstr "" + +#: templates/settings.php:17 +msgid "Port" +msgstr "" + +#: templates/settings.php:18 +msgid "Base User Tree" +msgstr "" + +#: templates/settings.php:19 +msgid "Base Group Tree" +msgstr "" + +#: templates/settings.php:20 +msgid "Group-Member association" +msgstr "" + +#: templates/settings.php:21 +msgid "Use TLS" +msgstr "" + +#: templates/settings.php:21 +msgid "Do not use it for SSL connections, it will fail." +msgstr "" + +#: templates/settings.php:22 +msgid "Case insensitve LDAP server (Windows)" +msgstr "" + +#: templates/settings.php:23 +msgid "Turn off SSL certificate validation." +msgstr "" + +#: templates/settings.php:23 +msgid "" +"If connection only works with this option, import the LDAP server's SSL " +"certificate in your ownCloud server." +msgstr "" + +#: templates/settings.php:23 +msgid "Not recommended, use for testing only." +msgstr "" + +#: templates/settings.php:24 +msgid "User Display Name Field" +msgstr "" + +#: templates/settings.php:24 +msgid "The LDAP attribute to use to generate the user`s ownCloud name." +msgstr "" + +#: templates/settings.php:25 +msgid "Group Display Name Field" +msgstr "" + +#: templates/settings.php:25 +msgid "The LDAP attribute to use to generate the groups`s ownCloud name." +msgstr "" + +#: templates/settings.php:27 +msgid "in bytes" +msgstr "" + +#: templates/settings.php:29 +msgid "in seconds. A change empties the cache." +msgstr "" + +#: templates/settings.php:30 +msgid "" +"Leave empty for user name (default). Otherwise, specify an LDAP/AD " +"attribute." +msgstr "" + +#: templates/settings.php:32 +msgid "Help" +msgstr "" diff --git a/l10n/is/user_webdavauth.po b/l10n/is/user_webdavauth.po new file mode 100644 index 0000000000..94c92bbb7d --- /dev/null +++ b/l10n/is/user_webdavauth.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"PO-Revision-Date: 2012-11-09 09:06+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:4 +msgid "WebDAV URL: http://" +msgstr "" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 95457184e9..e18065eecf 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 30ec5c19b4..e271f0f67f 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 10fb8e3c10..c43daf64c0 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 3261eb2017..95e15fe86c 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 4dbf6eef95..06108b09eb 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index a82ea8a94e..2e877107c5 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index cd78b93de0..b5d4fadfec 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,27 +17,27 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: app.php:285 +#: app.php:287 msgid "Help" msgstr "" -#: app.php:292 +#: app.php:294 msgid "Personal" msgstr "" -#: app.php:297 +#: app.php:299 msgid "Settings" msgstr "" -#: app.php:302 +#: app.php:304 msgid "Users" msgstr "" -#: app.php:309 +#: app.php:311 msgid "Apps" msgstr "" -#: app.php:311 +#: app.php:313 msgid "Admin" msgstr "" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 2ead3e9d13..f9d81288a9 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 5868d1d1c4..1d78876b39 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index cebdd2e3ca..466a1e2302 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" +"POT-Creation-Date: 2012-12-06 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/settings/l10n/fi_FI.php b/settings/l10n/fi_FI.php index a9e4ad6929..d68ed8ebaa 100644 --- a/settings/l10n/fi_FI.php +++ b/settings/l10n/fi_FI.php @@ -11,6 +11,7 @@ "Authentication error" => "Todennusvirhe", "Unable to delete user" => "Käyttäjän poisto epäonnistui", "Language changed" => "Kieli on vaihdettu", +"Admins can't remove themself from the admin group" => "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", "Unable to add user to group %s" => "Käyttäjän tai ryhmän %s lisääminen ei onnistu", "Unable to remove user from group %s" => "Käyttäjän poistaminen ryhmästä %s ei onnistu", "Disable" => "Poista käytöstä", From bf0f39f5b4d1b4cc3e91015b4fcaa0231ff0e2a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Tue, 4 Dec 2012 14:52:59 +0100 Subject: [PATCH 427/481] make sure that all expected array keys are available --- apps/files_sharing/public.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index ac24736873..71c18380a3 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -233,7 +233,7 @@ if ($linkItem) { $breadcrumb[] = array('dir' => '/', 'name' => basename($basePath)); //add subdir breadcrumbs - foreach (explode('/', urldecode($_GET['path'])) as $i) { + foreach (explode('/', urldecode($getPath)) as $i) { if ($i != '') { $pathtohere .= '/'.$i; $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i); @@ -251,6 +251,7 @@ if ($linkItem) { $folder = new OCP\Template('files', 'index', ''); $folder->assign('fileList', $list->fetchPage(), false); $folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false); + $folder->assign('dir', basename($dir)); $folder->assign('isCreatable', false); $folder->assign('permissions', 0); $folder->assign('files', $files); From e3ae0b7ba6c9e19eadfc57c70891e12538b9d77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Wed, 5 Dec 2012 12:58:32 +0100 Subject: [PATCH 428/481] fix more undefined indexes --- lib/filecache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/filecache.php b/lib/filecache.php index 7bf98f43a3..a02751b08d 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -362,10 +362,10 @@ class OC_FileCache{ while($id!=-1) {//walk up the filetree increasing the size of all parent folders $query=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `size`=`size`+? WHERE `id`=?'); $query->execute(array($sizeDiff, $id)); + $path=dirname($path); if($path == '' or $path =='/'){ return; } - $path=dirname($path); $parent = OC_FileCache_Cached::get($path); $id = $parent['id']; //stop walking up the filetree if we hit a non-folder From 5b04db9b225fd1ed4ad39bef3b77d5fe46b933df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Thu, 6 Dec 2012 14:02:55 +0100 Subject: [PATCH 429/481] one more undefined index error --- lib/filecache.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/filecache.php b/lib/filecache.php index a02751b08d..bbf55bc1f8 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -354,8 +354,8 @@ class OC_FileCache{ public static function increaseSize($path, $sizeDiff, $root=false) { if($sizeDiff==0) return; $item = OC_FileCache_Cached::get($path); - //stop walking up the filetree if we hit a non-folder - if($item['mimetype'] !== 'httpd/unix-directory'){ + //stop walking up the filetree if we hit a non-folder or reached to root folder + if($path == '/' || $path=='' || $item['mimetype'] !== 'httpd/unix-directory'){ return; } $id = $item['id']; From 2288b263059d87b4292a731d3992d1fc361e2c43 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 6 Dec 2012 16:28:02 +0100 Subject: [PATCH 430/481] fix missing feedback when tab-focusing on checkbox --- core/css/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/core/css/styles.css b/core/css/styles.css index fbe5f29c9b..d41045ad5f 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -56,6 +56,7 @@ input[type="submit"], input[type="button"], button, .button, #quota, div.jp-prog input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, select:hover, select:focus, select:active, input[type="button"]:focus, .button:hover { background:#fff; color:#333; } input[type="submit"] img, input[type="button"] img, button img, .button img { cursor:pointer; } input[type="checkbox"] { width:auto; } +input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } #quota { cursor:default; } From 0fa59f89373f935b497cea1b5f6953361f8e8581 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 6 Dec 2012 16:29:56 +0100 Subject: [PATCH 431/481] use vector logo also on log in page, d'oh (also now retina-ready) --- core/templates/layout.guest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index e83d9e1a68..8395426e4e 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -35,7 +35,7 @@
    From 4f513f279a32da7027ab628e7d619070c9732258 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 6 Dec 2012 16:41:06 +0100 Subject: [PATCH 432/481] fix dbhostlabel not disappearing, remove obsolete CSS --- core/css/styles.css | 1 - core/templates/installation.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index d41045ad5f..0f3f11fdf1 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -140,7 +140,6 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- p.infield { position: relative; } label.infield { cursor: text !important; } #login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } -#login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } diff --git a/core/templates/installation.php b/core/templates/installation.php index 5132192e83..f7a8a028c4 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -124,7 +124,7 @@

    - +

    From e989493eca3be957e0c69af89d255c10efb94ce5 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 6 Dec 2012 16:44:48 +0100 Subject: [PATCH 433/481] properly center data directory label --- core/css/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/css/styles.css b/core/css/styles.css index 0f3f11fdf1..552a17d8f4 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -115,7 +115,7 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- font-weight:bold; color:#999; text-shadow:0 1px 0 white; } #login form fieldset legend a { color:#999; } -#login #datadirContent label { color:#999; display:block; } +#login #datadirContent label { display:block; margin:0; color:#999; } #login form #datadirField legend { margin-bottom:15px; } /* Nicely grouping input field sets */ From 889e55fdac56ab3eecd6ce65db19e3dfeeff44ea Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Thu, 6 Dec 2012 23:51:35 +0100 Subject: [PATCH 434/481] [contacts_api] update documentation --- lib/public/contacts.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/public/contacts.php b/lib/public/contacts.php index 6842f40f1b..ca0b15b2c7 100644 --- a/lib/public/contacts.php +++ b/lib/public/contacts.php @@ -41,10 +41,10 @@ namespace OC { public function getDisplayName(); /** - * @param $pattern - * @param $searchProperties - * @param $options - * @return mixed + * @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, $options); // // dummy results @@ -54,8 +54,8 @@ namespace OC { // ); /** - * @param $properties - * @return mixed + * @param array $properties this array if key-value-pairs defines a contact + * @return array representing the contact just created or updated */ public function createOrUpdate($properties); // // dummy @@ -70,8 +70,8 @@ namespace OC { public function getPermissions(); /** - * @param $id - * @return mixed + * @param object $id the unique identifier to a contact + * @return bool successful or not */ public function delete($id); } From 271b8384e7adc36b7c1a3df813c6a6156c661a0d Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 7 Dec 2012 12:07:56 +0100 Subject: [PATCH 435/481] Fix warning about redirect_url not set --- lib/util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index 622a42982c..c4ed1f6ba7 100755 --- a/lib/util.php +++ b/lib/util.php @@ -340,8 +340,8 @@ class OC_Util { } if (isset($_REQUEST['redirect_url'])) { $redirect_url = OC_Util::sanitizeHTML($_REQUEST['redirect_url']); + $parameters['redirect_url'] = urlencode($redirect_url); } - $parameters['redirect_url'] = urlencode($redirect_url); OC_Template::printGuestPage("", "login", $parameters); } From 76395057d4bf696c0aa9326c85b2d9861bdfb672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 6 Nov 2012 12:20:57 +0100 Subject: [PATCH 436/481] fix_new_and_upload_button_html_css --- apps/files/css/files.css | 21 +++++++++++++++++---- apps/files/templates/index.php | 18 ++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 0b886fc3fa..3de2cd1933 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -13,7 +13,7 @@ .file_upload_wrapper { font-weight:bold; display:-moz-inline-box; /* fallback for older firefox versions*/ display:block; float:left; padding-left:0; overflow:hidden; position:relative; margin:0; margin-left:2px; } .file_upload_wrapper .file_upload_button_wrapper { position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer; z-index:1000; } #new { background-color:#5bb75b; float:left; margin:0 0 0 1em; border-right:none; z-index:1010; height:1.3em; } -#new:hover, a.file_upload_button_wrapper:hover + button.file_upload_filename { background-color:#4b964b; } +#new:hover, #upload:hover, a.file_upload_button_wrapper:hover + button.file_upload_filename { background-color:#4b964b; } #new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } #new>a { padding:.5em 1.2em .3em; color:#fff; text-shadow:0 1px 0 #51a351; } #new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; } @@ -22,6 +22,19 @@ #new>ul>li>input { padding:0.3em; margin:-0.3em; } #new, .file_upload_filename { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } #new .popup { border-top-left-radius:0; z-index:10; } +#upload { background-image: url('%webroot%/core/img/actions/upload-white.svg'); + background-repeat: no-repeat; + background-position: 1em 6px; + padding:.4em 1.2em .4em 2.5em; + color:#fff; + text-shadow:0 1px 0 #51a351; + border-color:#51a351 #419341 #387038; + -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; + -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; + box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; + background-color:#5bb75b; + margin-left:0.2em; + height:1.3em; } #file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } .file_upload_start, .file_upload_filename { font-size:1em; } @@ -31,10 +44,10 @@ .file_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1; position:absolute; left:0; top:0; width:100%; cursor:pointer;} .file_upload_filename { background-color:#5bb75b; z-index:100; cursor:pointer; background-image: url('%webroot%/core/img/actions/upload-white.svg'); background-repeat: no-repeat; background-position: center; height: 2.29em; width: 2.5em; } -#upload { position:absolute; right:13.5em; top:0em; } -#upload #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } +#uploadprogresswrappwer { position:absolute; right:13.5em; top:0em; } +#uploadprogresswrappwer #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } -.file_upload_form, .file_upload_wrapper, .file_upload_start, .file_upload_filename, #file_upload_submit { cursor:pointer; } +.file_upload_form, .file_upload_wrapper, .file_upload_start, .file_upload_filename, #file_upload_submit { cursor:pointer; overflow: visible; } /* FILE TABLE */ #emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; } diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index de440a6f79..82722cc47c 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -3,7 +3,7 @@
    -
    +
    t('New');?>
    -
    -
    - -
    +
    +
    + +
    From 6864b28e474ea2e7bc26b47aacc917268ead1822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Mon, 12 Nov 2012 11:03:20 +0100 Subject: [PATCH 437/481] rmeove vendor prefix for box-shadow --- apps/files/css/files.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 3de2cd1933..9293ecd1ba 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -29,8 +29,6 @@ color:#fff; text-shadow:0 1px 0 #51a351; border-color:#51a351 #419341 #387038; - -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; - -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; background-color:#5bb75b; margin-left:0.2em; From 810e02099ecd35446e5d6b458cb16a45227c8524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 4 Dec 2012 23:45:12 +0100 Subject: [PATCH 438/481] upload button HTML, CSS & JS cleanup --- apps/files/css/files.css | 29 ++++++++++++++--------------- apps/files/js/filelist.js | 2 -- apps/files/js/files.js | 6 ------ apps/files/templates/index.php | 9 +++++---- core/css/styles.css | 1 - 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 9293ecd1ba..b82ed6eb43 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -4,48 +4,47 @@ /* FILE MENU */ .actions { padding:.3em; float:left; height:2em; } -.actions input, .actions button, .actions .button { margin:0; } +.actions input, .actions button, .actions .button { margin:0; float:left; overflow:hidden; } #file_menu { right:0; position:absolute; top:0; } #file_menu a { display:block; float:left; background-image:none; text-decoration:none; } -.file_upload_form, #file_newfolder_form { display:inline; float: left; margin-left:0; } +.file_upload_form, #file_newfolder_form { display:inline; float: left; margin:0; padding:0; } #fileSelector, #file_upload_submit, #file_newfolder_submit { display:none; } .file_upload_wrapper, #file_newfolder_name { background-repeat:no-repeat; background-position:.5em .5em; padding-left:2em; } .file_upload_wrapper { font-weight:bold; display:-moz-inline-box; /* fallback for older firefox versions*/ display:block; float:left; padding-left:0; overflow:hidden; position:relative; margin:0; margin-left:2px; } -.file_upload_wrapper .file_upload_button_wrapper { position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer; z-index:1000; } -#new { background-color:#5bb75b; float:left; margin:0 0 0 1em; border-right:none; z-index:1010; height:1.3em; } -#new:hover, #upload:hover, a.file_upload_button_wrapper:hover + button.file_upload_filename { background-color:#4b964b; } +.file_upload_button_wrapper { position:relative; display:block; width:100%; height:27px; cursor:pointer; z-index:1000; } +#new { background-color:#5bb75b; float:left; margin:0 0 0 1em; z-index:1010; height:17px; } +#new:hover, #upload:hover { background-color:#4b964b; } #new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } #new>a { padding:.5em 1.2em .3em; color:#fff; text-shadow:0 1px 0 #51a351; } #new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; } #new>ul>li { margin:.3em; padding-left:2em; background-repeat:no-repeat; cursor:pointer; padding-bottom:0.1em } #new>ul>li>p { cursor:pointer; } #new>ul>li>input { padding:0.3em; margin:-0.3em; } -#new, .file_upload_filename { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } +#new { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } #new .popup { border-top-left-radius:0; z-index:10; } #upload { background-image: url('%webroot%/core/img/actions/upload-white.svg'); background-repeat: no-repeat; - background-position: 1em 6px; - padding:.4em 1.2em .4em 2.5em; + background-position: 7px 6px; + padding:0; color:#fff; text-shadow:0 1px 0 #51a351; border-color:#51a351 #419341 #387038; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; background-color:#5bb75b; margin-left:0.2em; - height:1.3em; } + height:27px; } #file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } -.file_upload_start, .file_upload_filename { font-size:1em; } +.file_upload_start { font-size:1em; } #file_newfolder_submit, #file_upload_submit { width:3em; } .file_upload_target { display:none; } -.file_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1; position:absolute; left:0; top:0; width:100%; cursor:pointer;} -.file_upload_filename { background-color:#5bb75b; z-index:100; cursor:pointer; background-image: url('%webroot%/core/img/actions/upload-white.svg'); background-repeat: no-repeat; background-position: center; height: 2.29em; width: 2.5em; } +.file_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:-1; position:relative; left:0; top:0; width:28px; height:27px; padding:0; cursor:pointer; overflow: hidden; } -#uploadprogresswrappwer { position:absolute; right:13.5em; top:0em; } -#uploadprogresswrappwer #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } +#uploadprogresswrapper { position:absolute; right:13.5em; top:0em; } +#uploadprogresswrapper #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } -.file_upload_form, .file_upload_wrapper, .file_upload_start, .file_upload_filename, #file_upload_submit { cursor:pointer; overflow: visible; } +.file_upload_form, .file_upload_wrapper, .file_upload_start, #file_upload_submit { cursor:pointer; overflow: visible; } /* FILE TABLE */ #emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 5674206632..9f0bafafbd 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -89,7 +89,6 @@ var FileList={ $('tr').filterAttr('data-file',name).remove(); if($('tr[data-file]').length==0){ $('#emptyfolder').show(); - $('.file_upload_filename').addClass('highlight'); } }, insertElement:function(name,type,element){ @@ -118,7 +117,6 @@ var FileList={ $('#fileList').append(element); } $('#emptyfolder').hide(); - $('.file_upload_filename').removeClass('highlight'); }, loadingDone:function(name, id){ var mime, tr=$('tr').filterAttr('data-file',name); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 886bbfbb18..a6216b0216 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -46,10 +46,6 @@ $(document).ready(function() { $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); - if($('tr[data-file]').length==0){ - $('.file_upload_filename').addClass('highlight'); - } - $('#file_action_panel').attr('activeAction', false); //drag/drop of files @@ -482,7 +478,6 @@ $(document).ready(function() { $(window).click(function(){ $('#new>ul').hide(); $('#new').removeClass('active'); - $('button.file_upload_filename').removeClass('active'); $('#new li').each(function(i,element){ if($(element).children('p').length==0){ $(element).children('input').remove(); @@ -496,7 +491,6 @@ $(document).ready(function() { $('#new>a').click(function(){ $('#new>ul').toggle(); $('#new').toggleClass('active'); - $('button.file_upload_filename').toggleClass('active'); }); $('#new li').click(function(){ if($(this).children('p').length==0){ diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 82722cc47c..a329726da4 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -14,7 +14,8 @@ data-type='web'>

    t('From link');?>

    -
    +
    +
    - + title="t('Upload') . ' max. '.$_['uploadMaxHumanFilesize'] ?>">
    +
    -
    +
    Date: Fri, 7 Dec 2012 16:09:29 +0100 Subject: [PATCH 439/481] dont handle database exception in OC_DB give the caller the option to handle the exception --- lib/db.php | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/db.php b/lib/db.php index e63a7a20c8..6524db7581 100644 --- a/lib/db.php +++ b/lib/db.php @@ -20,6 +20,19 @@ * */ +class DatabaseException extends Exception{ + private $query; + + public function __construct($message, $query){ + parent::__construct($message); + $this->query = $query; + } + + public function getQuery(){ + return $this->query; + } +} + /** * This class manages the access to the database. It basically is a wrapper for * MDB2 with some adaptions. @@ -320,21 +333,13 @@ class OC_DB { // Die if we have an error (error means: bad query, not 0 results!) if( PEAR::isError($result)) { - $entry = 'DB Error: "'.$result->getMessage().'"
    '; - $entry .= 'Offending command was: '.htmlentities($query).'
    '; - OC_Log::write('core', $entry, OC_Log::FATAL); - error_log('DB error: '.$entry); - OC_Template::printErrorPage( $entry ); + throw new DatabaseException($result->getMessage(), $query); } }else{ try{ $result=self::$connection->prepare($query); }catch(PDOException $e) { - $entry = 'DB Error: "'.$e->getMessage().'"
    '; - $entry .= 'Offending command was: '.htmlentities($query).'
    '; - OC_Log::write('core', $entry, OC_Log::FATAL); - error_log('DB error: '.$entry); - OC_Template::printErrorPage( $entry ); + throw new DatabaseException($e->getMessage(), $query); } $result=new PDOStatementWrapper($result); } From 15afbfd198f9f54cee8717776b4f45f73d9b1cbf Mon Sep 17 00:00:00 2001 From: "Lorenzo M. Catucci" Date: Thu, 6 Dec 2012 18:09:47 +0100 Subject: [PATCH 440/481] Add an $excludingBackend optional parameter to the userExists method both in OCP\User and in OC_User. --- lib/public/user.php | 6 +++--- lib/user.php | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/public/user.php b/lib/public/user.php index b320ce8ea0..9e50115ab7 100644 --- a/lib/public/user.php +++ b/lib/public/user.php @@ -65,12 +65,12 @@ class User { /** * @brief check if a user exists * @param string $uid the username + * @param string $excludingBackend (default none) * @return boolean */ - public static function userExists( $uid ) { - return \OC_USER::userExists( $uid ); + public static function userExists( $uid, $excludingBackend = null ) { + return \OC_USER::userExists( $uid, $excludingBackend ); } - /** * @brief Loggs the user out including all the session data * @returns true diff --git a/lib/user.php b/lib/user.php index 31c93740d7..d55c6165a0 100644 --- a/lib/user.php +++ b/lib/user.php @@ -407,10 +407,15 @@ class OC_User { /** * @brief check if a user exists * @param string $uid the username + * @param string $excludingBackend (default none) * @return boolean */ - public static function userExists($uid) { + public static function userExists($uid, $excludingBackend=null) { foreach(self::$_usedBackends as $backend) { + if (!is_null($excludingBackend) && !strcmp(get_class($backend),$excludingBackend)) { + OC_Log::write('OC_User', $excludingBackend . 'excluded from user existance check.', OC_Log::DEBUG); + continue; + } $result=$backend->userExists($uid); if($result===true) { return true; From de34f771c22b9a54fa22d9c00741e362f47c852d Mon Sep 17 00:00:00 2001 From: "Lorenzo M. Catucci" Date: Thu, 6 Dec 2012 18:11:14 +0100 Subject: [PATCH 441/481] Exclude LDAP backend from global user searches triggered by itself. --- apps/user_ldap/lib/access.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 53d4edbe69..f71f403592 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -281,8 +281,8 @@ abstract class Access { } $ldapname = $this->sanitizeUsername($ldapname); - //a new user/group! Then let's try to add it. We're shooting into the blue with the user/group name, assuming that in most cases there will not be a conflict. Otherwise an error will occur and we will continue with our second shot. - if(($isUser && !\OCP\User::userExists($ldapname)) || (!$isUser && !\OC_Group::groupExists($ldapname))) { + //a new user/group! Add it only if it doesn't conflict with other backend's users or existing groups + if(($isUser && !\OCP\User::userExists($ldapname, 'OCA\\user_ldap\\USER_LDAP')) || (!$isUser && !\OC_Group::groupExists($ldapname))) { if($this->mapComponent($dn, $ldapname, $isUser)) { return $ldapname; } @@ -874,4 +874,4 @@ abstract class Access { return $pagedSearchOK; } -} \ No newline at end of file +} From 8cf1e560bb4c04dba91adc069e0bb38dcc4efa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 5 Dec 2012 11:17:41 +0100 Subject: [PATCH 442/481] add IE9 CSS checkbox fixes --- apps/files/css/files.css | 17 +++++--- apps/files/js/files.js | 14 +++---- apps/files/templates/index.php | 2 +- core/css/styles.css | 73 ++++++---------------------------- 4 files changed, 32 insertions(+), 74 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index b82ed6eb43..8ce760db77 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -32,19 +32,24 @@ box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; background-color:#5bb75b; margin-left:0.2em; - height:27px; } + height:27px; +} #file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } -.file_upload_start { font-size:1em; } + #file_newfolder_submit, #file_upload_submit { width:3em; } .file_upload_target { display:none; } -.file_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:-1; position:relative; left:0; top:0; width:28px; height:27px; padding:0; cursor:pointer; overflow: hidden; } +#file_upload_start { + left:0; top:0; width:28px; height:27px; padding:0; + font-size:1em; + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; + z-index:-1; position:relative; cursor:pointer; overflow: hidden; } #uploadprogresswrapper { position:absolute; right:13.5em; top:0em; } #uploadprogresswrapper #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } -.file_upload_form, .file_upload_wrapper, .file_upload_start, #file_upload_submit { cursor:pointer; overflow: visible; } +.file_upload_form, .file_upload_wrapper, #file_upload_start, #file_upload_submit { cursor:pointer; overflow: visible; } /* FILE TABLE */ #emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; } @@ -70,13 +75,13 @@ table tr[data-type="dir"] td.filename a.name span.nametext {font-weight:bold; } table td.filename input.filename { width:100%; cursor:text; } table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; } table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0; } -// TODO fix usability bug (accidental file/folder selection) +/* TODO fix usability bug (accidental file/folder selection) */ table td.filename .nametext { width:40em; overflow:hidden; text-overflow:ellipsis; } table td.filename .uploadtext { font-weight:normal; margin-left:.5em; } table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } table thead.fixed tr{ position:fixed; top:6.5em; z-index:49; -moz-box-shadow:0 -3px 7px #ddd; -webkit-box-shadow:0 -3px 7px #ddd; box-shadow:0 -3px 7px #ddd; } table thead.fixed { height:2em; } -#fileList tr td.filename>input[type=checkbox]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; } +#fileList tr td.filename>input[type="checkbox"]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; } #fileList tr td.filename>input[type="checkbox"]:hover:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; } #fileList tr td.filename>input[type="checkbox"]:checked:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } #fileList tr td.filename { -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms; position:relative; } diff --git a/apps/files/js/files.js b/apps/files/js/files.js index a6216b0216..7e1a90f45b 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -67,7 +67,7 @@ $(document).ready(function() { // Triggers invisible file input $('.file_upload_button_wrapper').live('click', function() { - $(this).parent().children('.file_upload_start').trigger('click'); + $(this).parent().children('#file_upload_start').trigger('click'); return false; }); @@ -201,9 +201,9 @@ $(document).ready(function() { e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone }); - if ( document.getElementById("data-upload-form") ) { + if ( document.getElementById('data-upload-form') ) { $(function() { - $('.file_upload_start').fileupload({ + $('#file_upload_start').fileupload({ dropZone: $('#content'), // restrict dropZone to content div add: function(e, data) { var files = data.files; @@ -218,7 +218,7 @@ $(document).ready(function() { totalSize+=files[i].size; if(FileList.deleteFiles && FileList.deleteFiles.indexOf(files[i].name)!=-1){//finish delete if we are uploading a deleted file FileList.finishDelete(function(){ - $('.file_upload_start').change(); + $('#file_upload_start').change(); }); return; } @@ -292,7 +292,7 @@ $(document).ready(function() { var dropTarget = $(e.originalEvent.target).closest('tr'); if(dropTarget && dropTarget.attr('data-type') === 'dir') { // drag&drop upload to folder var dirName = dropTarget.attr('data-file') - var jqXHR = $('.file_upload_start').fileupload('send', {files: files[i], + var jqXHR = $('#file_upload_start').fileupload('send', {files: files[i], formData: function(form) { var formArray = form.serializeArray(); // array index 0 contains the max files size @@ -353,7 +353,7 @@ $(document).ready(function() { } uploadingFiles[dirName][fileName] = jqXHR; } else { - var jqXHR = $('.file_upload_start').fileupload('send', {files: files[i]}) + var jqXHR = $('#file_upload_start').fileupload('send', {files: files[i]}) .success(function(result, textStatus, jqXHR) { var response; response=jQuery.parseJSON(result); @@ -450,7 +450,7 @@ $(document).ready(function() { //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) if(navigator.userAgent.search(/konqueror/i)==-1){ - $('.file_upload_start').attr('multiple','multiple') + $('#file_upload_start').attr('multiple','multiple') } //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index a329726da4..82dc96d643 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -31,7 +31,7 @@ - + diff --git a/core/css/styles.css b/core/css/styles.css index 31b3dacb96..faf38bdb87 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -34,12 +34,15 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', end /* INPUTS */ input[type="text"], input[type="password"] { cursor:text; } -input, textarea, select, button, .button, #quota, div.jp-progress, .pager li a { - font-size:1em; font-family:Arial, Verdana, sans-serif; width:10em; margin:.3em; padding:.6em .5em .4em; +input:not([type="checkbox"]), textarea, select, button, .button, #quota, div.jp-progress, .pager li a { + width:10em; margin:.3em; padding:.6em .5em .4em; + font-size:1em; font-family:Arial, Verdana, sans-serif; background:#fff; color:#333; border:1px solid #ddd; outline:none; -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } +input[type="checkbox"] { margin: 0; padding: 0; height: 13px; width: 13px; } +input[type="hidden"] { height:0; width:0; } input[type="text"], input[type="password"], input[type="search"], textarea { background:#f8f8f8; color:#555; cursor:text; } input[type="text"], input[type="password"], input[type="search"] { -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; } input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active, @@ -60,23 +63,6 @@ input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:# #quota { cursor:default; } -/* PRIMARY ACTION BUTTON, use sparingly */ -.primary, input[type="submit"].primary, input[type="button"].primary, button.primary, .button.primary { - border:1px solid #1d2d44; - background:#35537a; color:#ddd; text-shadow:#000 0 -1px 0; - -moz-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; -} - .primary:hover, input[type="submit"].primary:hover, input[type="button"].primary:hover, button.primary:hover, .button.primary:hover, - .primary:focus, input[type="submit"].primary:focus, input[type="button"].primary:focus, button.primary:focus, .button.primary:focus { - border:1px solid #1d2d44; - background:#2d3d54; color:#fff; text-shadow:#000 0 -1px 0; - -moz-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; - } - .primary:active, input[type="submit"].primary:active, input[type="button"].primary:active, button.primary:active, .button.primary:active { - border:1px solid #1d2d44; - background:#1d2d42; color:#bbb; text-shadow:#000 0 -1px 0; - -moz-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; -webkit-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; - } #body-login input { font-size:1.5em; } @@ -107,56 +93,23 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b #login { min-height:30em; margin:2em auto 0; border-bottom:1px solid #f8f8f8; background:#eee; } #login form { width:22em; margin:2em auto 2em; padding:0; } -#login form fieldset { margin-bottom:20px; } -#login form #adminaccount { margin-bottom:5px; } -#login form fieldset legend, #datadirContent label { - width:100%; text-align:center; - font-weight:bold; color:#999; text-shadow:0 1px 0 white; -} -#login form fieldset legend a { color:#999; } -#login #datadirContent label { display:block; margin:0; color:#999; } -#login form #datadirField legend { margin-bottom:15px; } - -/* Nicely grouping input field sets */ -.grouptop input { - margin-bottom:0; - border-bottom:0; border-bottom-left-radius:0; border-bottom-right-radius:0; -} -.groupmiddle input { - margin-top:0; margin-bottom:0; - border-top:0; border-radius:0; - box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; -} -.groupbottom input { - margin-top:0; - border-top:0; border-top-right-radius:0; border-top-left-radius:0; - box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; -} +#login form fieldset { background:0; border:0; margin-bottom:2em; padding:0; } +#login form fieldset legend { font-weight:bold; } #login form label { margin:.95em 0 0 .85em; color:#666; } -#login .groupmiddle label, #login .groupbottom label { margin-top:13px; } /* NEEDED FOR INFIELD LABELS */ p.infield { position: relative; } label.infield { cursor: text !important; } -#login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } +#login form label.infield { position:absolute; font-size:1.5em; color:#AAA; } +#login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } #login form #selectDbType { text-align:center; } -#login form #selectDbType label { - position:static; margin:0 -3px 5px; padding:.4em; - font-size:12px; font-weight:bold; background:#f8f8f8; color:#888; cursor:pointer; - border:1px solid #ddd; text-shadow:#eee 0 1px 0; - -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -} -#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#000; background-color:#e8e8e8; } - -fieldset.warning { - padding:8px; - color:#b94a48; background-color:#f2dede; border:1px solid #eed3d7; - border-radius:5px; -} -fieldset.warning legend { color:#b94a48 !important; } +#login form #selectDbType label { position:static; font-size:1em; margin:0 -.3em 1em; cursor:pointer; padding:.4em; border:1px solid #ddd; font-weight:bold; background:#f8f8f8; color:#555; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } +#login form #selectDbType label span { cursor:pointer; font-size:0.9em; } +#login form #selectDbType label.ui-state-hover span, #login form #selectDbType label.ui-state-active span { color:#000; } +#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color: #333; background-color: #ccc; } /* NAVIGATION ------------------------------------------------------------- */ From 2ec96c7a636f8c5bdd75144d79a30f868be470b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 6 Dec 2012 16:37:23 +0100 Subject: [PATCH 443/481] fix new li icons jumping when replacing p with input --- apps/files/css/files.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 8ce760db77..89427124f8 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -4,7 +4,7 @@ /* FILE MENU */ .actions { padding:.3em; float:left; height:2em; } -.actions input, .actions button, .actions .button { margin:0; float:left; overflow:hidden; } +.actions input, .actions button, .actions .button { margin:0; float:left; } #file_menu { right:0; position:absolute; top:0; } #file_menu a { display:block; float:left; background-image:none; text-decoration:none; } .file_upload_form, #file_newfolder_form { display:inline; float: left; margin:0; padding:0; } @@ -17,7 +17,8 @@ #new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } #new>a { padding:.5em 1.2em .3em; color:#fff; text-shadow:0 1px 0 #51a351; } #new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; } -#new>ul>li { margin:.3em; padding-left:2em; background-repeat:no-repeat; cursor:pointer; padding-bottom:0.1em } +#new>ul>li { height:20px; margin:.3em; padding-left:2em; padding-bottom:0.1em; + background-repeat:no-repeat; cursor:pointer; } #new>ul>li>p { cursor:pointer; } #new>ul>li>input { padding:0.3em; margin:-0.3em; } #new { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } @@ -33,6 +34,7 @@ background-color:#5bb75b; margin-left:0.2em; height:27px; + overflow:hidden; } #file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } From 80d8ca24ec5d8b0071c0c901dfe042d99a46fcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 7 Dec 2012 12:12:40 +0100 Subject: [PATCH 444/481] fix svg -> png replacement for android, cleanup and remove obsolete css --- apps/files/css/files.css | 61 +++++++++++++++++++--------------- apps/files/js/files.js | 8 +---- apps/files/templates/index.php | 8 ++--- core/js/js.js | 2 +- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 89427124f8..b56d3e29d7 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -5,43 +5,46 @@ /* FILE MENU */ .actions { padding:.3em; float:left; height:2em; } .actions input, .actions button, .actions .button { margin:0; float:left; } -#file_menu { right:0; position:absolute; top:0; } -#file_menu a { display:block; float:left; background-image:none; text-decoration:none; } -.file_upload_form, #file_newfolder_form { display:inline; float: left; margin:0; padding:0; } -#fileSelector, #file_upload_submit, #file_newfolder_submit { display:none; } -.file_upload_wrapper, #file_newfolder_name { background-repeat:no-repeat; background-position:.5em .5em; padding-left:2em; } -.file_upload_wrapper { font-weight:bold; display:-moz-inline-box; /* fallback for older firefox versions*/ display:block; float:left; padding-left:0; overflow:hidden; position:relative; margin:0; margin-left:2px; } -.file_upload_button_wrapper { position:relative; display:block; width:100%; height:27px; cursor:pointer; z-index:1000; } -#new { background-color:#5bb75b; float:left; margin:0 0 0 1em; z-index:1010; height:17px; } + +#new { + height:17px; margin:0 0 0 1em; z-index:1010; float:left; + background-color:#5bb75b; + border:1px solid; border-color:#51a351 #419341 #387038; + -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; + -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; + box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; +} #new:hover, #upload:hover { background-color:#4b964b; } #new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } #new>a { padding:.5em 1.2em .3em; color:#fff; text-shadow:0 1px 0 #51a351; } -#new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; } +#new>ul { + display:none; position:fixed; min-width:7em; z-index:-1; + padding:.5em; margin-top:0.075em; margin-left:-.5em; + text-align:left; + background:#f8f8f8; border:1px solid #ddd; +} #new>ul>li { height:20px; margin:.3em; padding-left:2em; padding-bottom:0.1em; background-repeat:no-repeat; cursor:pointer; } #new>ul>li>p { cursor:pointer; } #new>ul>li>input { padding:0.3em; margin:-0.3em; } -#new { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } #new .popup { border-top-left-radius:0; z-index:10; } -#upload { background-image: url('%webroot%/core/img/actions/upload-white.svg'); - background-repeat: no-repeat; - background-position: 7px 6px; - padding:0; - color:#fff; - text-shadow:0 1px 0 #51a351; + +#upload { + height:27px; padding:0; margin-left:0.2em; overflow:hidden; + color:#fff; text-shadow:0 1px 0 #51a351; border-color:#51a351 #419341 #387038; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; background-color:#5bb75b; - margin-left:0.2em; - height:27px; - overflow:hidden; } - -#file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } - -#file_newfolder_submit, #file_upload_submit { width:3em; } +#upload a { + position:relative; display:block; width:100%; height:27px; + cursor:pointer; z-index:1000; + background-image: url('%webroot%/core/img/actions/upload-white.svg'); + background-repeat: no-repeat; + background-position: 7px 6px; +} .file_upload_target { display:none; } - +.file_upload_form { display:inline; float: left; margin:0; padding:0; cursor:pointer; overflow: visible; } #file_upload_start { left:0; top:0; width:28px; height:27px; padding:0; font-size:1em; @@ -51,10 +54,14 @@ #uploadprogresswrapper { position:absolute; right:13.5em; top:0em; } #uploadprogresswrapper #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } -.file_upload_form, .file_upload_wrapper, #file_upload_start, #file_upload_submit { cursor:pointer; overflow: visible; } /* FILE TABLE */ -#emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; } + +#emptyfolder { + position: absolute; + margin: 10em 0 0 10em; + font-size: 1.5em; font-weight: bold; + color: #888; text-shadow: #fff 0 1px 0; } table { position:relative; top:37px; width:100%; } tbody tr { background-color:#fff; height:2.5em; } tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; } @@ -78,7 +85,7 @@ table td.filename input.filename { width:100%; cursor:text; } table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; } table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0; } /* TODO fix usability bug (accidental file/folder selection) */ -table td.filename .nametext { width:40em; overflow:hidden; text-overflow:ellipsis; } +table td.filename .nametext { overflow:hidden; text-overflow:ellipsis; } table td.filename .uploadtext { font-weight:normal; margin-left:.5em; } table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } table thead.fixed tr{ position:fixed; top:6.5em; z-index:49; -moz-box-shadow:0 -3px 7px #ddd; -webkit-box-shadow:0 -3px 7px #ddd; box-shadow:0 -3px 7px #ddd; } diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 7e1a90f45b..ece0b29ae1 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -66,7 +66,7 @@ $(document).ready(function() { } // Triggers invisible file input - $('.file_upload_button_wrapper').live('click', function() { + $('#upload a').live('click', function() { $(this).parent().children('#file_upload_start').trigger('click'); return false; }); @@ -168,12 +168,6 @@ $(document).ready(function() { procesSelection(); }); - $('#file_newfolder_name').click(function(){ - if($('#file_newfolder_name').val() == 'New Folder'){ - $('#file_newfolder_name').val(''); - } - }); - $('.download').click('click',function(event) { var files=getSelectedFiles('name').join(';'); var dir=$('#dir').val()||'/'; diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 82dc96d643..bd34c9a76d 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -15,7 +15,6 @@
    -
    - - + - +
    -
    diff --git a/core/js/js.js b/core/js/js.js index 3b4cabe710..7d967321d9 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -615,7 +615,7 @@ $(document).ready(function(){ $('.jp-controls .jp-previous').tipsy({gravity:'nw', fade:true, live:true}); $('.jp-controls .jp-next').tipsy({gravity:'n', fade:true, live:true}); $('.password .action').tipsy({gravity:'se', fade:true, live:true}); - $('.file_upload_button_wrapper').tipsy({gravity:'w', fade:true}); + $('#upload a').tipsy({gravity:'w', fade:true}); $('.selectedActions a').tipsy({gravity:'s', fade:true, live:true}); $('a.delete').tipsy({gravity: 'e', fade:true, live:true}); $('a.action').tipsy({gravity:'s', fade:true, live:true}); From 787e8b86d929a8d0a7dca2812d75bf4d5e467e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 7 Dec 2012 17:41:52 +0100 Subject: [PATCH 445/481] cleanup CSS whitespace and remove extra input[type='checkbok'] --- apps/files/css/files.css | 25 ++++---- core/css/styles.css | 119 +++++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index b56d3e29d7..9bd92c9258 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -39,29 +39,30 @@ #upload a { position:relative; display:block; width:100%; height:27px; cursor:pointer; z-index:1000; - background-image: url('%webroot%/core/img/actions/upload-white.svg'); - background-repeat: no-repeat; - background-position: 7px 6px; + background-image:url('%webroot%/core/img/actions/upload-white.svg'); + background-repeat:no-repeat; + background-position:7px 6px; } .file_upload_target { display:none; } -.file_upload_form { display:inline; float: left; margin:0; padding:0; cursor:pointer; overflow: visible; } +.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; } #file_upload_start { left:0; top:0; width:28px; height:27px; padding:0; - font-size:1em; + font-size:1em; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; - z-index:-1; position:relative; cursor:pointer; overflow: hidden; } + z-index:-1; position:relative; cursor:pointer; overflow:hidden; +} #uploadprogresswrapper { position:absolute; right:13.5em; top:0em; } #uploadprogresswrapper #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; } - /* FILE TABLE */ #emptyfolder { - position: absolute; - margin: 10em 0 0 10em; - font-size: 1.5em; font-weight: bold; - color: #888; text-shadow: #fff 0 1px 0; } + position:absolute; + margin:10em 0 0 10em; + font-size:1.5em; font-weight:bold; + color:#888; text-shadow:#fff 0 1px 0; +} table { position:relative; top:37px; width:100%; } tbody tr { background-color:#fff; height:2.5em; } tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; } @@ -111,4 +112,4 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; } #scanning-message{ top:40%; left:40%; position:absolute; display:none; } -div.crumb a{ padding: 0.9em 0 0.7em 0; } +div.crumb a{ padding:0.9em 0 0.7em 0; } diff --git a/core/css/styles.css b/core/css/styles.css index faf38bdb87..b61f26caf6 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -3,7 +3,7 @@ See the COPYING-README file. */ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section { margin:0; padding:0; border:0; outline:0; font-weight:inherit; font-size:100%; font-family:inherit; vertical-align:baseline; cursor:default; } -html, body { height: 100%; overflow: auto; } +html, body { height:100%; overflow:auto; } article, aside, dialog, figure, footer, header, hgroup, nav, section { display:block; } body { line-height:1.5; } table { border-collapse:separate; border-spacing:0; white-space:nowrap; } @@ -17,16 +17,16 @@ body { background:#fefefe; font:normal .8em/1.6em "Lucida Grande", Arial, Verdan /* HEADERS */ #body-user #header, #body-settings #header { position:fixed; top:0; left:0; right:0; z-index:100; height:2.5em; line-height:2.5em; padding:.5em; background:#1d2d44; -moz-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; } -#body-login #header { margin: -2em auto 0; text-align:center; height:10em; padding:1em 0 .5em; +#body-login #header { margin:-2em auto 0; text-align:center; height:10em; padding:1em 0 .5em; -moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); -background: #1d2d44; /* Old browsers */ -background: -moz-linear-gradient(top, #35537a 0%, #1d2d42 100%); /* FF3.6+ */ -background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#35537a), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ -background: -webkit-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* Chrome10+,Safari5.1+ */ -background: -o-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* Opera11.10+ */ -background: -ms-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* IE10+ */ -background: linear-gradient(top, #35537a 0%,#1d2d42 100%); /* W3C */ -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } +background:#1d2d44; /* Old browsers */ +background:-moz-linear-gradient(top, #35537a 0%, #1d2d42 100%); /* FF3.6+ */ +background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#35537a), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ +background:-webkit-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* Chrome10+,Safari5.1+ */ +background:-o-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* Opera11.10+ */ +background:-ms-linear-gradient(top, #35537a 0%,#1d2d42 100%); /* IE10+ */ +background:linear-gradient(top, #35537a 0%,#1d2d42 100%); /* W3C */ +filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } #owncloud { float:left; vertical-align:middle; } .header-right { float:right; vertical-align:middle; padding:0 0.5em; } @@ -41,7 +41,6 @@ input:not([type="checkbox"]), textarea, select, button, .button, #quota, div.jp- -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } -input[type="checkbox"] { margin: 0; padding: 0; height: 13px; width: 13px; } input[type="hidden"] { height:0; width:0; } input[type="text"], input[type="password"], input[type="search"], textarea { background:#f8f8f8; color:#555; cursor:text; } input[type="text"], input[type="password"], input[type="search"] { -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; } @@ -58,7 +57,7 @@ input[type="submit"], input[type="button"], button, .button, #quota, div.jp-prog } input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, select:hover, select:focus, select:active, input[type="button"]:focus, .button:hover { background:#fff; color:#333; } input[type="submit"] img, input[type="button"] img, button img, .button img { cursor:pointer; } -input[type="checkbox"] { width:auto; } +input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; } input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } #quota { cursor:default; } @@ -66,29 +65,29 @@ input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:# #body-login input { font-size:1.5em; } -#body-login input[type="text"], #body-login input[type="password"] { width: 13em; } -#body-login input.login { width: auto; float: right; } +#body-login input[type="text"], #body-login input[type="password"] { width:13em; } +#body-login input.login { width:auto; float:right; } #remember_login { margin:.8em .2em 0 1em; } .searchbox input[type="search"] { font-size:1.2em; padding:.2em .5em .2em 1.5em; background:#fff url('../img/actions/search.svg') no-repeat .5em center; border:0; -moz-border-radius:1em; -webkit-border-radius:1em; border-radius:1em; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70);opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; } input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; } -#select_all{ margin-top: .4em !important;} +#select_all{ margin-top:.4em !important;} /* CONTENT ------------------------------------------------------------------ */ -#controls { padding: 0 0.5em; width:100%; top:3.5em; height:2.8em; margin:0; background:#f7f7f7; border-bottom:1px solid #eee; position:fixed; z-index:50; -moz-box-shadow:0 -3px 7px #000; -webkit-box-shadow:0 -3px 7px #000; box-shadow:0 -3px 7px #000; } +#controls { padding:0 0.5em; width:100%; top:3.5em; height:2.8em; margin:0; background:#f7f7f7; border-bottom:1px solid #eee; position:fixed; z-index:50; -moz-box-shadow:0 -3px 7px #000; -webkit-box-shadow:0 -3px 7px #000; box-shadow:0 -3px 7px #000; } #controls .button { display:inline-block; } -#content { top: 3.5em; left: 12.5em; position: absolute; } -#leftcontent, .leftcontent { position:fixed; overflow: auto; top:6.4em; width:20em; background:#f8f8f8; border-right:1px solid #ddd; } +#content { top:3.5em; left:12.5em; position:absolute; } +#leftcontent, .leftcontent { position:fixed; overflow:auto; top:6.4em; width:20em; background:#f8f8f8; border-right:1px solid #ddd; } #leftcontent li, .leftcontent li { background:#f8f8f8; padding:.5em .8em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 200ms; -moz-transition:background-color 200ms; -o-transition:background-color 200ms; transition:background-color 200ms; } #leftcontent li:hover, #leftcontent li:active, #leftcontent li.active, .leftcontent li:hover, .leftcontent li:active, .leftcontent li.active { background:#eee; } #leftcontent li.active, .leftcontent li.active { font-weight:bold; } #leftcontent li:hover, .leftcontent li:hover { color:#333; background:#ddd; } -#leftcontent a { height: 100%; display: block; margin: 0; padding: 0 1em 0 0; float: left; } -#rightcontent, .rightcontent { position:fixed; top: 6.4em; left: 32.5em; overflow: auto } +#leftcontent a { height:100%; display:block; margin:0; padding:0 1em 0 0; float:left; } +#rightcontent, .rightcontent { position:fixed; top:6.4em; left:32.5em; overflow:auto } /* LOG IN & INSTALLATION ------------------------------------------------------------ */ #body-login { background:#ddd; } -#body-login div.buttons { text-align: center; } -#body-login p.info { width:22em; text-align: center; margin:2em auto; color:#777; text-shadow:#fff 0 1px 0; } +#body-login div.buttons { text-align:center; } +#body-login p.info { width:22em; text-align:center; margin:2em auto; color:#777; text-shadow:#fff 0 1px 0; } #body-login p.info a { font-weight:bold; color:#777; } #login { min-height:30em; margin:2em auto 0; border-bottom:1px solid #f8f8f8; background:#eee; } @@ -98,8 +97,8 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b #login form label { margin:.95em 0 0 .85em; color:#666; } /* NEEDED FOR INFIELD LABELS */ -p.infield { position: relative; } -label.infield { cursor: text !important; } +p.infield { position:relative; } +label.infield { cursor:text !important; } #login form label.infield { position:absolute; font-size:1.5em; color:#AAA; } #login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } @@ -109,11 +108,11 @@ label.infield { cursor: text !important; } #login form #selectDbType label { position:static; font-size:1em; margin:0 -.3em 1em; cursor:pointer; padding:.4em; border:1px solid #ddd; font-weight:bold; background:#f8f8f8; color:#555; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } #login form #selectDbType label span { cursor:pointer; font-size:0.9em; } #login form #selectDbType label.ui-state-hover span, #login form #selectDbType label.ui-state-active span { color:#000; } -#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color: #333; background-color: #ccc; } +#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#333; background-color:#ccc; } /* NAVIGATION ------------------------------------------------------------- */ -#navigation { position:fixed; top:3.5em; float:left; width:12.5em; padding:0; z-index:75; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; overflow:hidden;} +#navigation { position:fixed; top:3.5em; float:left; width:12.5em; padding:0; z-index:75; height:100%; background:#eee; border-right:1px #ccc solid; -moz-box-shadow:-3px 0 7px #000; -webkit-box-shadow:-3px 0 7px #000; box-shadow:-3px 0 7px #000; overflow:hidden;} #navigation a { display:block; padding:.6em .5em .4em 2.5em; background:#eee 1em center no-repeat; border-bottom:1px solid #ddd; border-top:1px solid #fff; text-decoration:none; font-size:1.2em; color:#666; text-shadow:#f8f8f8 0 1px 0; } #navigation a.active, #navigation a:hover, #navigation a:focus { background-color:#dbdbdb; border-top:1px solid #d4d4d4; border-bottom:1px solid #ccc; color:#333; } #navigation a.active { background-color:#ddd; } @@ -124,15 +123,15 @@ label.infield { cursor: text !important; } /* VARIOUS REUSABLE SELECTORS */ .hidden { display:none; } -.bold { font-weight: bold; } -.center { text-align: center; } +.bold { font-weight:bold; } +.center { text-align:center; } #notification { z-index:101; background-color:#fc4; border:0; padding:0 .7em .3em; display:none; position:fixed; left:50%; top:0; -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; -moz-border-radius-bottomright:1em; -webkit-border-bottom-right-radius:1em; border-bottom-right-radius:1em; } #notification span { cursor:pointer; font-weight:bold; margin-left:1em; } tr .action, .selectedActions a { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; } tr:hover .action, .selectedActions a { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter:alpha(opacity=50); opacity:.5; } -tr .action { width: 16px; height: 16px; } +tr .action { width:16px; height:16px; } .header-action { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; } tr:hover .action:hover, .selectedActions a:hover, .header-action:hover { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } @@ -141,58 +140,58 @@ tbody tr:hover, tr:active { background-color:#f8f8f8; } #body-settings .personalblock, #body-settings .helpblock { padding:.5em 1em; margin:1em; background:#f8f8f8; color:#555; text-shadow:#fff 0 1px 0; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } #body-settings .personalblock#quota { position:relative; padding:0; } -#body-settings #controls+.helpblock { position:relative; margin-top: 3em; } +#body-settings #controls+.helpblock { position:relative; margin-top:3em; } .personalblock > legend { margin-top:2em; } -.personalblock > legend, th, dt, label { font-weight: bold; } -code { font-family: "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", monospace; } +.personalblock > legend, th, dt, label { font-weight:bold; } +code { font-family:"Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", monospace; } #quota div, div.jp-play-bar, div.jp-seek-bar { padding:0; background:#e6e6e6; font-weight:normal; white-space:nowrap; -moz-border-radius-bottomleft:.4em; -webkit-border-bottom-left-radius:.4em; border-bottom-left-radius:.4em; -moz-border-radius-topleft:.4em; -webkit-border-top-left-radius:.4em; border-top-left-radius:.4em; } -#quotatext {padding: .6em 1em;} +#quotatext {padding:.6em 1em;} div.jp-play-bar, div.jp-seek-bar { padding:0; } .pager { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; } .pager li { display:inline-block; } -li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color: #FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow: hidden; text-overflow: ellipsis; } -.hint { background-image: url('../img/actions/info.png'); background-repeat:no-repeat; color: #777777; padding-left: 25px; background-position: 0 0.3em;} -.separator { display: inline; border-left: 1px solid #d3d3d3; border-right: 1px solid #fff; height: 10px; width:0px; margin: 4px; } +li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color:#FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow:hidden; text-overflow:ellipsis; } +.hint { background-image:url('../img/actions/info.png'); background-repeat:no-repeat; color:#777777; padding-left:25px; background-position:0 0.3em;} +.separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; } -a.bookmarklet { background-color: #ddd; border:1px solid #ccc; padding: 5px;padding-top: 0px;padding-bottom: 2px; text-decoration: none; margin-top: 5px } +a.bookmarklet { background-color:#ddd; border:1px solid #ccc; padding:5px;padding-top:0px;padding-bottom:2px; text-decoration:none; margin-top:5px } -.exception{color: #000000;} -.exception textarea{width:95%;height: 200px;background:#ffe;border:0;} +.exception{color:#000000;} +.exception textarea{width:95%;height:200px;background:#ffe;border:0;} -.ui-icon-circle-triangle-e{ background-image: url('../img/actions/play-next.svg'); } -.ui-icon-circle-triangle-w{ background-image: url('../img/actions/play-previous.svg'); } -.ui-datepicker-prev,.ui-datepicker-next{ border: 1px solid #ddd; background: #ffffff; } +.ui-icon-circle-triangle-e{ background-image:url('../img/actions/play-next.svg'); } +.ui-icon-circle-triangle-w{ background-image:url('../img/actions/play-previous.svg'); } +.ui-datepicker-prev,.ui-datepicker-next{ border:1px solid #ddd; background:#ffffff; } /* ---- DIALOGS ---- */ -#dirtree {width: 100%;} -#filelist {height: 270px; overflow:scroll; background-color: white; width: 100%;} -.filepicker_element_selected { background-color: lightblue;} -.filepicker_loader {height: 120px; width: 100%; background-color: #333; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; filter:alpha(opacity=30); opacity:.3; visibility: visible; position:absolute; top:0; left:0; text-align:center; padding-top: 150px;} +#dirtree {width:100%;} +#filelist {height:270px; overflow:scroll; background-color:white; width:100%;} +.filepicker_element_selected { background-color:lightblue;} +.filepicker_loader {height:120px; width:100%; background-color:#333; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; filter:alpha(opacity=30); opacity:.3; visibility:visible; position:absolute; top:0; left:0; text-align:center; padding-top:150px;} /* ---- CATEGORIES ---- */ -#categoryform .scrollarea { position: absolute; left: 10px; top: 10px; right: 10px; bottom: 50px; overflow: auto; border:1px solid #ddd; background: #f8f8f8; } -#categoryform .bottombuttons { position: absolute; bottom: 10px;} -#categoryform .bottombuttons * { float: left;} +#categoryform .scrollarea { position:absolute; left:10px; top:10px; right:10px; bottom:50px; overflow:auto; border:1px solid #ddd; background:#f8f8f8; } +#categoryform .bottombuttons { position:absolute; bottom:10px;} +#categoryform .bottombuttons * { float:left;} /*#categorylist { border:1px solid #ddd;}*/ #categorylist li { background:#f8f8f8; padding:.3em .8em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; } #categorylist li:hover, #categorylist li:active { background:#eee; } -#category_addinput { width: 10em; } +#category_addinput { width:10em; } /* ---- APP SETTINGS ---- */ -.popup { background-color: white; border-radius: 10px 10px 10px 10px; box-shadow: 0 0 20px #888888; color: #333333; padding: 10px; position: fixed !important; z-index: 200; } -.popup.topright { top: 7em; right: 1em; } -.popup.bottomleft { bottom: 1em; left: 33em; } -.popup .close { position:absolute; top: 0.2em; right:0.2em; height: 20px; width: 20px; background:url('../img/actions/delete.svg') no-repeat center; } -.popup h2 { font-weight: bold; font-size: 1.2em; } -.arrow { border-bottom: 10px solid white; border-left: 10px solid transparent; border-right: 10px solid transparent; display: block; height: 0; position: absolute; width: 0; z-index: 201; } -.arrow.left { left: -13px; bottom: 1.2em; -webkit-transform: rotate(270deg); -moz-transform: rotate(270deg); -o-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } -.arrow.up { top: -8px; right: 2em; } -.arrow.down { -webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); -o-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } +.popup { background-color:white; border-radius:10px 10px 10px 10px; box-shadow:0 0 20px #888888; color:#333333; padding:10px; position:fixed !important; z-index:200; } +.popup.topright { top:7em; right:1em; } +.popup.bottomleft { bottom:1em; left:33em; } +.popup .close { position:absolute; top:0.2em; right:0.2em; height:20px; width:20px; background:url('../img/actions/delete.svg') no-repeat center; } +.popup h2 { font-weight:bold; font-size:1.2em; } +.arrow { border-bottom:10px solid white; border-left:10px solid transparent; border-right:10px solid transparent; display:block; height:0; position:absolute; width:0; z-index:201; } +.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); } +.arrow.up { top:-8px; right:2em; } +.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); } /* ---- BREADCRUMB ---- */ div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; } From b810e42cc70beb817de466835dcdc9de9d092bdc Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Fri, 7 Dec 2012 20:34:17 +0100 Subject: [PATCH 446/481] Improve autodetection of language. Fixes #730. --- lib/l10n.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/l10n.php b/lib/l10n.php index f172710e5d..4f9c3a0ede 100644 --- a/lib/l10n.php +++ b/lib/l10n.php @@ -294,8 +294,14 @@ class OC_L10N{ } foreach($accepted_languages as $i) { $temp = explode(';', $i); - if(array_search($temp[0], $available) !== false) { - return $temp[0]; + $temp[0] = str_replace('-','_',$temp[0]); + if( ($key = array_search($temp[0], $available)) !== false) { + return $available[$key]; + } + } + foreach($available as $l) { + if ( $temp[0] == substr($l,0,2) ) { + return $l; } } } From 2ca72d0da717be6278aed5c0df48b2127f42c709 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 8 Dec 2012 00:10:53 +0100 Subject: [PATCH 447/481] [tx-robot] updated from transifex --- apps/user_ldap/l10n/gl.php | 22 ++++++++-------- core/l10n/zh_TW.php | 3 +++ l10n/gl/lib.po | 37 +++++++++++++------------- l10n/gl/user_ldap.po | 29 +++++++++++---------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 40 ++++++++++++++--------------- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/zh_TW/core.po | 10 ++++---- lib/l10n/gl.php | 18 ++++++------- 16 files changed, 91 insertions(+), 86 deletions(-) diff --git a/apps/user_ldap/l10n/gl.php b/apps/user_ldap/l10n/gl.php index efcea02c18..41431293cb 100644 --- a/apps/user_ldap/l10n/gl.php +++ b/apps/user_ldap/l10n/gl.php @@ -1,37 +1,37 @@ "Servidor", -"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Podes omitir o protocolo agás que precises de SSL. Nese caso comeza con ldaps://", +"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Pode omitir o protocolo agás que precise de SSL. Nese caso comece con ldaps://", "Base DN" => "DN base", -"You can specify Base DN for users and groups in the Advanced tab" => "Podes especificar a DN base para usuarios e grupos na lapela de «Avanzado»", +"You can specify Base DN for users and groups in the Advanced tab" => "Pode especificar a DN base para usuarios e grupos na lapela de «Avanzado»", "User DN" => "DN do usuario", -"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso en anónimo deixa o DN e o contrasinal baleiros.", +"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso en anónimo de o DN e o contrasinal baleiros.", "Password" => "Contrasinal", -"For anonymous access, leave DN and Password empty." => "Para o acceso anónimo deixa o DN e o contrasinal baleiros.", +"For anonymous access, leave DN and Password empty." => "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "User Login Filter" => "Filtro de acceso de usuarios", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action." => "Define o filtro que se aplica cando se intenta o acceso. %%uid substitúe o nome de usuario e a acción de acceso.", "use %%uid placeholder, e.g. \"uid=%%uid\"" => "usar a marca de posición %%uid, p.ex «uid=%%uid»", "User List Filter" => "Filtro da lista de usuarios", "Defines the filter to apply, when retrieving users." => "Define o filtro a aplicar cando se recompilan os usuarios.", -"without any placeholder, e.g. \"objectClass=person\"." => "sen ningunha marca de posición, como p.ex \"objectClass=persoa\".", +"without any placeholder, e.g. \"objectClass=person\"." => "sen ningunha marca de posición, como p.ex «objectClass=persoa».", "Group Filter" => "Filtro de grupo", "Defines the filter to apply, when retrieving groups." => "Define o filtro a aplicar cando se recompilan os grupos.", -"without any placeholder, e.g. \"objectClass=posixGroup\"." => "sen ningunha marca de posición, como p.ex \"objectClass=grupoPosix\".", +"without any placeholder, e.g. \"objectClass=posixGroup\"." => "sen ningunha marca de posición, como p.ex «objectClass=grupoPosix».", "Port" => "Porto", "Base User Tree" => "Base da árbore de usuarios", "Base Group Tree" => "Base da árbore de grupo", "Group-Member association" => "Asociación de grupos e membros", "Use TLS" => "Usar TLS", -"Do not use it for SSL connections, it will fail." => "Non o empregues para conexións SSL: fallará.", +"Do not use it for SSL connections, it will fail." => "Non empregualo para conexións SSL: fallará.", "Case insensitve LDAP server (Windows)" => "Servidor LDAP que non distingue entre maiúsculas e minúsculas (Windows)", -"Turn off SSL certificate validation." => "Apaga a validación do certificado SSL.", -"If connection only works with this option, import the LDAP server's SSL certificate in your ownCloud server." => "Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no teu servidor ownCloud.", +"Turn off SSL certificate validation." => "Desactiva a validación do certificado SSL.", +"If connection only works with this option, import the LDAP server's SSL certificate in your ownCloud server." => "Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no seu servidor ownCloud.", "Not recommended, use for testing only." => "Non se recomenda. Só para probas.", "User Display Name Field" => "Campo de mostra do nome de usuario", "The LDAP attribute to use to generate the user`s ownCloud name." => "O atributo LDAP a empregar para xerar o nome de usuario de ownCloud.", "Group Display Name Field" => "Campo de mostra do nome de grupo", "The LDAP attribute to use to generate the groups`s ownCloud name." => "O atributo LDAP úsase para xerar os nomes dos grupos de ownCloud.", "in bytes" => "en bytes", -"in seconds. A change empties the cache." => "en segundos. Calquera cambio baleira o caché.", -"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Deixar baleiro para o nome de usuario (por defecto). Noutro caso, especifica un atributo LDAP/AD.", +"in seconds. A change empties the cache." => "en segundos. Calquera cambio baleira a caché.", +"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD.", "Help" => "Axuda" ); diff --git a/core/l10n/zh_TW.php b/core/l10n/zh_TW.php index 2d5bb40708..45c7596e60 100644 --- a/core/l10n/zh_TW.php +++ b/core/l10n/zh_TW.php @@ -1,6 +1,7 @@ "無分類添加?", "This category already exists: " => "此分類已經存在:", +"Object type not provided." => "不支援的物件類型", "No categories selected for deletion." => "沒選擇要刪除的分類", "Settings" => "設定", "seconds ago" => "幾秒前", @@ -22,7 +23,9 @@ "Yes" => "Yes", "Ok" => "Ok", "Error" => "錯誤", +"The app name is not specified." => "沒有詳述APP名稱.", "Error while sharing" => "分享時發生錯誤", +"Error while unsharing" => "取消分享時發生錯誤", "Shared with you by {owner}" => "{owner} 已經和您分享", "Share with" => "與分享", "Share with link" => "使用連結分享", diff --git a/l10n/gl/lib.po b/l10n/gl/lib.po index ff45072b3d..739b0ba67f 100644 --- a/l10n/gl/lib.po +++ b/l10n/gl/lib.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Miguel Branco , 2012. # Xosé M. Lamas , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 22:32+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-12-08 00:10+0100\n" +"PO-Revision-Date: 2012-12-06 11:56+0000\n" +"Last-Translator: mbouzada \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,27 +20,27 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app.php:285 +#: app.php:287 msgid "Help" msgstr "Axuda" -#: app.php:292 +#: app.php:294 msgid "Personal" -msgstr "Personal" +msgstr "Persoal" -#: app.php:297 +#: app.php:299 msgid "Settings" msgstr "Configuracións" -#: app.php:302 +#: app.php:304 msgid "Users" msgstr "Usuarios" -#: app.php:309 +#: app.php:311 msgid "Apps" msgstr "Aplicativos" -#: app.php:311 +#: app.php:313 msgid "Admin" msgstr "Administración" @@ -49,7 +50,7 @@ msgstr "As descargas ZIP están desactivadas" #: files.php:362 msgid "Files need to be downloaded one by one." -msgstr "Os ficheiros necesitan ser descargados de un en un." +msgstr "Os ficheiros necesitan seren descargados de un en un." #: files.php:362 files.php:387 msgid "Back to Files" @@ -65,11 +66,11 @@ msgstr "O aplicativo non está activado" #: json.php:39 json.php:64 json.php:77 json.php:89 msgid "Authentication error" -msgstr "Erro na autenticación" +msgstr "Produciuse un erro na autenticación" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "Token caducado. Recarga a páxina." +msgstr "Testemuña caducada. Recargue a páxina." #: search/provider/file.php:17 search/provider/file.php:35 msgid "Files" @@ -98,12 +99,12 @@ msgstr "hai %d minutos" #: template.php:106 msgid "1 hour ago" -msgstr "1 hora antes" +msgstr "Vai 1 hora" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "%d horas antes" +msgstr "Vai %d horas" #: template.php:108 msgid "today" @@ -125,7 +126,7 @@ msgstr "último mes" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "%d meses antes" +msgstr "Vai %d meses" #: template.php:113 msgid "last year" @@ -138,7 +139,7 @@ msgstr "anos atrás" #: updater.php:75 #, php-format msgid "%s is available. Get more information" -msgstr "%s está dispoñible. Obtén máis información" +msgstr "%s está dispoñíbel. Obtéña máis información" #: updater.php:77 msgid "up to date" @@ -151,4 +152,4 @@ msgstr "a comprobación de actualizacións está desactivada" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "Non se puido atopar a categoría «%s»" +msgstr "Non foi posíbel atopar a categoría «%s»" diff --git a/l10n/gl/user_ldap.po b/l10n/gl/user_ldap.po index ba881709d9..8f640a984a 100644 --- a/l10n/gl/user_ldap.po +++ b/l10n/gl/user_ldap.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Miguel Branco, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 18:13+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"PO-Revision-Date: 2012-12-06 11:45+0000\n" +"Last-Translator: mbouzada \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "Servidor" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "Podes omitir o protocolo agás que precises de SSL. Nese caso comeza con ldaps://" +msgstr "Pode omitir o protocolo agás que precise de SSL. Nese caso comece con ldaps://" #: templates/settings.php:9 msgid "Base DN" @@ -33,7 +34,7 @@ msgstr "DN base" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "Podes especificar a DN base para usuarios e grupos na lapela de «Avanzado»" +msgstr "Pode especificar a DN base para usuarios e grupos na lapela de «Avanzado»" #: templates/settings.php:10 msgid "User DN" @@ -44,7 +45,7 @@ msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso en anónimo deixa o DN e o contrasinal baleiros." +msgstr "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso en anónimo de o DN e o contrasinal baleiros." #: templates/settings.php:11 msgid "Password" @@ -52,7 +53,7 @@ msgstr "Contrasinal" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "Para o acceso anónimo deixa o DN e o contrasinal baleiros." +msgstr "Para o acceso anónimo deixe o DN e o contrasinal baleiros." #: templates/settings.php:12 msgid "User Login Filter" @@ -80,7 +81,7 @@ msgstr "Define o filtro a aplicar cando se recompilan os usuarios." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "sen ningunha marca de posición, como p.ex \"objectClass=persoa\"." +msgstr "sen ningunha marca de posición, como p.ex «objectClass=persoa»." #: templates/settings.php:14 msgid "Group Filter" @@ -92,7 +93,7 @@ msgstr "Define o filtro a aplicar cando se recompilan os grupos." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "sen ningunha marca de posición, como p.ex \"objectClass=grupoPosix\"." +msgstr "sen ningunha marca de posición, como p.ex «objectClass=grupoPosix»." #: templates/settings.php:17 msgid "Port" @@ -116,7 +117,7 @@ msgstr "Usar TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "Non o empregues para conexións SSL: fallará." +msgstr "Non empregualo para conexións SSL: fallará." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" @@ -124,13 +125,13 @@ msgstr "Servidor LDAP que non distingue entre maiúsculas e minúsculas (Windows #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "Apaga a validación do certificado SSL." +msgstr "Desactiva a validación do certificado SSL." #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no teu servidor ownCloud." +msgstr "Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no seu servidor ownCloud." #: templates/settings.php:23 msgid "Not recommended, use for testing only." @@ -158,13 +159,13 @@ msgstr "en bytes" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "en segundos. Calquera cambio baleira o caché." +msgstr "en segundos. Calquera cambio baleira a caché." #: templates/settings.php:30 msgid "" "Leave empty for user name (default). Otherwise, specify an LDAP/AD " "attribute." -msgstr "Deixar baleiro para o nome de usuario (por defecto). Noutro caso, especifica un atributo LDAP/AD." +msgstr "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD." #: templates/settings.php:32 msgid "Help" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index e18065eecf..f01edae58c 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index e271f0f67f..c95c4834fd 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -106,80 +106,80 @@ msgid "" "allowed." msgstr "" -#: js/files.js:183 +#: js/files.js:184 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:218 +#: js/files.js:219 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:218 +#: js/files.js:219 msgid "Upload Error" msgstr "" -#: js/files.js:235 +#: js/files.js:236 msgid "Close" msgstr "" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:255 js/files.js:369 js/files.js:399 msgid "Pending" msgstr "" -#: js/files.js:274 +#: js/files.js:275 msgid "1 file uploading" msgstr "" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:278 js/files.js:332 js/files.js:347 msgid "{count} files uploading" msgstr "" -#: js/files.js:349 js/files.js:382 +#: js/files.js:350 js/files.js:383 msgid "Upload cancelled." msgstr "" -#: js/files.js:451 +#: js/files.js:452 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:523 +#: js/files.js:524 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:704 +#: js/files.js:705 msgid "{count} files scanned" msgstr "" -#: js/files.js:712 +#: js/files.js:713 msgid "error while scanning" msgstr "" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:786 templates/index.php:65 msgid "Name" msgstr "" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:787 templates/index.php:76 msgid "Size" msgstr "" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:788 templates/index.php:78 msgid "Modified" msgstr "" -#: js/files.js:814 +#: js/files.js:815 msgid "1 folder" msgstr "" -#: js/files.js:816 +#: js/files.js:817 msgid "{count} folders" msgstr "" -#: js/files.js:824 +#: js/files.js:825 msgid "1 file" msgstr "" -#: js/files.js:826 +#: js/files.js:827 msgid "{count} files" msgstr "" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index c43daf64c0..32ec56eb59 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 95e15fe86c..243c37a6c2 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 06108b09eb..1fbb4b2efa 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 2e877107c5..5c71a75af7 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index b5d4fadfec..1750515a79 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index f9d81288a9..abe6858996 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 1d78876b39..1179565de1 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 466a1e2302..ac038dd142 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/zh_TW/core.po b/l10n/zh_TW/core.po index ae5dc301b3..104f616766 100644 --- a/l10n/zh_TW/core.po +++ b/l10n/zh_TW/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-29 00:04+0100\n" -"PO-Revision-Date: 2012-11-28 01:36+0000\n" +"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"PO-Revision-Date: 2012-12-06 01:24+0000\n" "Last-Translator: dw4dev \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -36,7 +36,7 @@ msgstr "此分類已經存在:" #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "" +msgstr "不支援的物件類型" #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 @@ -147,7 +147,7 @@ msgstr "錯誤" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "" +msgstr "沒有詳述APP名稱." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" @@ -159,7 +159,7 @@ msgstr "分享時發生錯誤" #: js/share.js:135 msgid "Error while unsharing" -msgstr "" +msgstr "取消分享時發生錯誤" #: js/share.js:142 msgid "Error while changing permissions" diff --git a/lib/l10n/gl.php b/lib/l10n/gl.php index fd59cff02f..1e897959e4 100644 --- a/lib/l10n/gl.php +++ b/lib/l10n/gl.php @@ -1,34 +1,34 @@ "Axuda", -"Personal" => "Personal", +"Personal" => "Persoal", "Settings" => "Configuracións", "Users" => "Usuarios", "Apps" => "Aplicativos", "Admin" => "Administración", "ZIP download is turned off." => "As descargas ZIP están desactivadas", -"Files need to be downloaded one by one." => "Os ficheiros necesitan ser descargados de un en un.", +"Files need to be downloaded one by one." => "Os ficheiros necesitan seren descargados de un en un.", "Back to Files" => "Volver aos ficheiros", "Selected files too large to generate zip file." => "Os ficheiros seleccionados son demasiado grandes como para xerar un ficheiro zip.", "Application is not enabled" => "O aplicativo non está activado", -"Authentication error" => "Erro na autenticación", -"Token expired. Please reload page." => "Token caducado. Recarga a páxina.", +"Authentication error" => "Produciuse un erro na autenticación", +"Token expired. Please reload page." => "Testemuña caducada. Recargue a páxina.", "Files" => "Ficheiros", "Text" => "Texto", "Images" => "Imaxes", "seconds ago" => "hai segundos", "1 minute ago" => "hai 1 minuto", "%d minutes ago" => "hai %d minutos", -"1 hour ago" => "1 hora antes", -"%d hours ago" => "%d horas antes", +"1 hour ago" => "Vai 1 hora", +"%d hours ago" => "Vai %d horas", "today" => "hoxe", "yesterday" => "onte", "%d days ago" => "hai %d días", "last month" => "último mes", -"%d months ago" => "%d meses antes", +"%d months ago" => "Vai %d meses", "last year" => "último ano", "years ago" => "anos atrás", -"%s is available. Get more information" => "%s está dispoñible. Obtén máis información", +"%s is available. Get more information" => "%s está dispoñíbel. Obtéña máis información", "up to date" => "ao día", "updates check is disabled" => "a comprobación de actualizacións está desactivada", -"Could not find category \"%s\"" => "Non se puido atopar a categoría «%s»" +"Could not find category \"%s\"" => "Non foi posíbel atopar a categoría «%s»" ); From 4cc895aa0a7d73e6817bfcc9f1fc4d76740b0513 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Sat, 8 Dec 2012 16:42:54 +0100 Subject: [PATCH 448/481] [contacts_api] move addressbook to it's own file --- lib/iaddressbook.php | 72 +++++++++++++++++++++++++++++++++++++++++ lib/public/contacts.php | 51 ----------------------------- 2 files changed, 72 insertions(+), 51 deletions(-) create mode 100644 lib/iaddressbook.php diff --git a/lib/iaddressbook.php b/lib/iaddressbook.php new file mode 100644 index 0000000000..3920514036 --- /dev/null +++ b/lib/iaddressbook.php @@ -0,0 +1,72 @@ +. + * + */ + +namespace OC { + interface IAddressBook { + + /** + * @return string defining the technical unique key + */ + public function getKey(); + + /** + * In comparison to getKey() this function returns a human readable (maybe translated) name + * @return mixed + */ + public function getDisplayName(); + + /** + * @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, $options); +// // dummy results +// return array( +// array('id' => 0, 'FN' => 'Thomas Müller', 'EMAIL' => 'a@b.c', 'GEO' => '37.386013;-122.082932'), +// array('id' => 5, 'FN' => 'Thomas Tanghus', 'EMAIL' => array('d@e.f', 'g@h.i')), +// ); + + /** + * @param array $properties this array if key-value-pairs defines a contact + * @return array representing the contact just created or updated + */ + public function createOrUpdate($properties); +// // dummy +// return array('id' => 0, 'FN' => 'Thomas Müller', 'EMAIL' => 'a@b.c', +// 'PHOTO' => 'VALUE=uri:http://www.abc.com/pub/photos/jqpublic.gif', +// 'ADR' => ';;123 Main Street;Any Town;CA;91921-1234' +// ); + + /** + * @return mixed + */ + public function getPermissions(); + + /** + * @param object $id the unique identifier to a contact + * @return bool successful or not + */ + public function delete($id); + } +} diff --git a/lib/public/contacts.php b/lib/public/contacts.php index ca0b15b2c7..ab46614c8f 100644 --- a/lib/public/contacts.php +++ b/lib/public/contacts.php @@ -26,57 +26,6 @@ * */ -namespace OC { - interface IAddressBook { - - /** - * @return string defining the technical unique key - */ - public function getKey(); - - /** - * In comparison to getKey() this function returns a human readable (maybe translated) name - * @return mixed - */ - public function getDisplayName(); - - /** - * @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, $options); -// // dummy results -// return array( -// array('id' => 0, 'FN' => 'Thomas Müller', 'EMAIL' => 'a@b.c', 'GEO' => '37.386013;-122.082932'), -// array('id' => 5, 'FN' => 'Thomas Tanghus', 'EMAIL' => array('d@e.f', 'g@h.i')), -// ); - - /** - * @param array $properties this array if key-value-pairs defines a contact - * @return array representing the contact just created or updated - */ - public function createOrUpdate($properties); -// // dummy -// return array('id' => 0, 'FN' => 'Thomas Müller', 'EMAIL' => 'a@b.c', -// 'PHOTO' => 'VALUE=uri:http://www.abc.com/pub/photos/jqpublic.gif', -// 'ADR' => ';;123 Main Street;Any Town;CA;91921-1234' -// ); - - /** - * @return mixed - */ - public function getPermissions(); - - /** - * @param object $id the unique identifier to a contact - * @return bool successful or not - */ - public function delete($id); - } -} - // 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 { From e3e4dcf77b0abf719fd69fcbbe8cab76b530c138 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 9 Dec 2012 00:12:41 +0100 Subject: [PATCH 449/481] [tx-robot] updated from transifex --- apps/files/l10n/ko.php | 3 ++ apps/files/l10n/sl.php | 1 + apps/user_ldap/l10n/ko.php | 4 +++ core/l10n/ko.php | 5 +++ l10n/ko/core.po | 24 +++++++------- l10n/ko/files.po | 50 ++++++++++++++--------------- l10n/ko/settings.po | 8 ++--- l10n/ko/user_ldap.po | 12 +++---- l10n/sl/files.po | 46 +++++++++++++------------- l10n/sl/settings.po | 8 ++--- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- settings/l10n/ko.php | 1 + settings/l10n/sl.php | 1 + 22 files changed, 99 insertions(+), 84 deletions(-) diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index 0e2e542678..3a7a689857 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -1,5 +1,6 @@ "업로드에 성공하였습니다.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드된 파일은 php.ini의 upload_max_filesize에 설정된 사이즈를 초과하고 있습니다:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "업로드한 파일이 HTML 문서에 지정한 MAX_FILE_SIZE보다 더 큼", "The uploaded file was only partially uploaded" => "파일이 부분적으로 업로드됨", "No file was uploaded" => "업로드된 파일 없음", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "{old_name}이 {new_name}으로 대체됨", "unshared {files}" => "{files} 공유해제", "deleted {files}" => "{files} 삭제됨", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "유효하지 않은 이름, '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.", "generating ZIP-file, it may take some time." => "ZIP파일 생성에 시간이 걸릴 수 있습니다.", "Unable to upload your file as it is a directory or has 0 bytes" => "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다.", "Upload Error" => "업로드 에러", @@ -27,6 +29,7 @@ "{count} files uploading" => "{count} 파일 업로드중", "Upload cancelled." => "업로드 취소.", "File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "유효하지 않은 폴더명입니다. \"Shared\"의 사용은 ownCloud에의해 예약이 끝난 상태입니다.", "{count} files scanned" => "{count} 파일 스캔되었습니다.", "error while scanning" => "스캔하는 도중 에러", "Name" => "이름", diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index b9d030c5d5..c5ee6c422d 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -1,5 +1,6 @@ "Datoteka je uspešno naložena brez napak.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Naložena datoteka presega dovoljeno velikost. Le-ta je določena z vrstico upload_max_filesize v datoteki php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu", "The uploaded file was only partially uploaded" => "Datoteka je le delno naložena", "No file was uploaded" => "Nobena datoteka ni bila naložena", diff --git a/apps/user_ldap/l10n/ko.php b/apps/user_ldap/l10n/ko.php index 681365d221..b0af5bc165 100644 --- a/apps/user_ldap/l10n/ko.php +++ b/apps/user_ldap/l10n/ko.php @@ -4,6 +4,7 @@ "Base DN" => "기본 DN", "You can specify Base DN for users and groups in the Advanced tab" => "당신은 고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다.", "User DN" => "사용자 DN", +"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "클라이언트 유저의 DN는 결합이 완료되어야 합니다. 예를 들면 uid=agent, dc=example, dc=com. 익명 액세스의 경우, DN와 패스워드는 비워둔채로 남겨두세요.", "Password" => "비밀번호", "For anonymous access, leave DN and Password empty." => "익명의 접속을 위해서는 DN과 비밀번호를 빈상태로 두면 됩니다.", "User Login Filter" => "사용자 로그인 필터", @@ -11,8 +12,10 @@ "use %%uid placeholder, e.g. \"uid=%%uid\"" => "use %%uid placeholder, e.g. \"uid=%%uid\"", "User List Filter" => "사용자 목록 필터", "Defines the filter to apply, when retrieving users." => "사용자를 검색 할 때 적용 할 필터를 정의합니다.", +"without any placeholder, e.g. \"objectClass=person\"." => "플레이스홀더를 이용하지 마세요. 예 \"objectClass=person\".", "Group Filter" => "그룹 필터", "Defines the filter to apply, when retrieving groups." => "그룹을 검색 할 때 적용 할 필터를 정의합니다.", +"without any placeholder, e.g. \"objectClass=posixGroup\"." => "플레이스홀더를 이용하지 마세요. 예 \"objectClass=posixGroup\".", "Port" => "포트", "Base User Tree" => "기본 사용자 트리", "Base Group Tree" => "기본 그룹 트리", @@ -28,6 +31,7 @@ "Group Display Name Field" => "그룹 표시 이름 필드", "The LDAP attribute to use to generate the groups`s ownCloud name." => "LDAP 속성은 그룹의 ownCloud 이름을 생성하기 위해 사용합니다.", "in bytes" => "바이트", +"in seconds. A change empties the cache." => "초. 변경 후에 캐쉬가 클리어 됩니다.", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "사용자 이름(기본값)을 비워 둡니다. 그렇지 않으면 LDAP/AD 특성을 지정합니다.", "Help" => "도움말" ); diff --git a/core/l10n/ko.php b/core/l10n/ko.php index e00e4bd29c..5a0b581fff 100644 --- a/core/l10n/ko.php +++ b/core/l10n/ko.php @@ -33,6 +33,10 @@ "Error while sharing" => "공유하던 중에 에러발생", "Error while unsharing" => "공유해제하던 중에 에러발생", "Error while changing permissions" => "권한변경 중에 에러발생", +"Shared with you and the group {group} by {owner}" => "당신과 {owner} 의 그룹 {group} 로 공유중", +"Shared with you by {owner}" => "{owner} 와 공유중", +"Share with" => "공유자", +"Share with link" => "URL 링크로 공유", "Password protect" => "비밀번호 보호", "Password" => "암호", "Set expiration date" => "만료일자 설정", @@ -40,6 +44,7 @@ "Share via email:" => "via 이메일로 공유", "No people found" => "발견된 사람 없음", "Resharing is not allowed" => "재공유는 허용되지 않습니다", +"Shared in {item} with {user}" => "{item} 내에서 {user} 와 공유중", "Unshare" => "공유해제", "can edit" => "편집 가능", "access control" => "컨트롤에 접근", diff --git a/l10n/ko/core.po b/l10n/ko/core.po index 4f2ad6145e..362fa216ac 100644 --- a/l10n/ko/core.po +++ b/l10n/ko/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 07:04+0000\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-08 15:57+0000\n" "Last-Translator: 남자사람 \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" @@ -140,8 +140,8 @@ msgid "The object type is not specified." msgstr "객체 유형이 지정되지 않았습니다." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "에러" @@ -167,19 +167,19 @@ msgstr "권한변경 중에 에러발생" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "" +msgstr "당신과 {owner} 의 그룹 {group} 로 공유중" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "" +msgstr "{owner} 와 공유중" #: js/share.js:158 msgid "Share with" -msgstr "" +msgstr "공유자" #: js/share.js:163 msgid "Share with link" -msgstr "" +msgstr "URL 링크로 공유" #: js/share.js:164 msgid "Password protect" @@ -212,7 +212,7 @@ msgstr "재공유는 허용되지 않습니다" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "" +msgstr "{item} 내에서 {user} 와 공유중" #: js/share.js:292 msgid "Unshare" @@ -242,15 +242,15 @@ msgstr "삭제" msgid "share" msgstr "공유" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "패스워드로 보호됨" -#: js/share.js:527 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "만료일자 해제 에러" -#: js/share.js:539 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "만료일자 설정 에러" diff --git a/l10n/ko/files.po b/l10n/ko/files.po index 9e15a4f302..ade758140e 100644 --- a/l10n/ko/files.po +++ b/l10n/ko/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-08 15:59+0000\n" +"Last-Translator: 남자사람 \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgstr "업로드에 성공하였습니다." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "업로드된 파일은 php.ini의 upload_max_filesize에 설정된 사이즈를 초과하고 있습니다:" #: ajax/upload.php:23 msgid "" @@ -107,82 +107,82 @@ msgstr "{files} 삭제됨" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "유효하지 않은 이름, '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다." -#: js/files.js:183 +#: js/files.js:184 msgid "generating ZIP-file, it may take some time." msgstr "ZIP파일 생성에 시간이 걸릴 수 있습니다." -#: js/files.js:218 +#: js/files.js:219 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다." -#: js/files.js:218 +#: js/files.js:219 msgid "Upload Error" msgstr "업로드 에러" -#: js/files.js:235 +#: js/files.js:236 msgid "Close" msgstr "닫기" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:255 js/files.js:369 js/files.js:399 msgid "Pending" msgstr "보류 중" -#: js/files.js:274 +#: js/files.js:275 msgid "1 file uploading" msgstr "1 파일 업로드중" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:278 js/files.js:332 js/files.js:347 msgid "{count} files uploading" msgstr "{count} 파일 업로드중" -#: js/files.js:349 js/files.js:382 +#: js/files.js:350 js/files.js:383 msgid "Upload cancelled." msgstr "업로드 취소." -#: js/files.js:451 +#: js/files.js:452 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다." -#: js/files.js:523 +#: js/files.js:524 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "" +msgstr "유효하지 않은 폴더명입니다. \"Shared\"의 사용은 ownCloud에의해 예약이 끝난 상태입니다." -#: js/files.js:704 +#: js/files.js:705 msgid "{count} files scanned" msgstr "{count} 파일 스캔되었습니다." -#: js/files.js:712 +#: js/files.js:713 msgid "error while scanning" msgstr "스캔하는 도중 에러" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:786 templates/index.php:65 msgid "Name" msgstr "이름" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:787 templates/index.php:76 msgid "Size" msgstr "크기" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:788 templates/index.php:78 msgid "Modified" msgstr "수정됨" -#: js/files.js:814 +#: js/files.js:815 msgid "1 folder" msgstr "1 폴더" -#: js/files.js:816 +#: js/files.js:817 msgid "{count} folders" msgstr "{count} 폴더" -#: js/files.js:824 +#: js/files.js:825 msgid "1 file" msgstr "1 파일" -#: js/files.js:826 +#: js/files.js:827 msgid "{count} files" msgstr "{count} 파일" diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po index 1b4bacb26b..a193316f43 100644 --- a/l10n/ko/settings.po +++ b/l10n/ko/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-08 15:56+0000\n" +"Last-Translator: 남자사람 \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +70,7 @@ msgstr "언어가 변경되었습니다" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "관리자는 자신을 관리자 그룹으로부터 삭제할 수 없습니다." #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/ko/user_ldap.po b/l10n/ko/user_ldap.po index 5084f863d1..06ae4ee838 100644 --- a/l10n/ko/user_ldap.po +++ b/l10n/ko/user_ldap.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 06:34+0000\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-08 15:51+0000\n" "Last-Translator: 남자사람 \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" @@ -44,7 +44,7 @@ msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "클라이언트 유저의 DN는 결합이 완료되어야 합니다. 예를 들면 uid=agent, dc=example, dc=com. 익명 액세스의 경우, DN와 패스워드는 비워둔채로 남겨두세요." #: templates/settings.php:11 msgid "Password" @@ -80,7 +80,7 @@ msgstr "사용자를 검색 할 때 적용 할 필터를 정의합니다." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "플레이스홀더를 이용하지 마세요. 예 \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" @@ -92,7 +92,7 @@ msgstr "그룹을 검색 할 때 적용 할 필터를 정의합니다." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "플레이스홀더를 이용하지 마세요. 예 \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" @@ -158,7 +158,7 @@ msgstr "바이트" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "초. 변경 후에 캐쉬가 클리어 됩니다." #: templates/settings.php:30 msgid "" diff --git a/l10n/sl/files.po b/l10n/sl/files.po index 7b4024e231..db703c7acc 100644 --- a/l10n/sl/files.po +++ b/l10n/sl/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-07 23:34+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgstr "Datoteka je uspešno naložena brez napak." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Naložena datoteka presega dovoljeno velikost. Le-ta je določena z vrstico upload_max_filesize v datoteki php.ini:" #: ajax/upload.php:23 msgid "" @@ -110,80 +110,80 @@ msgid "" "allowed." msgstr "Neveljavno ime, znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni." -#: js/files.js:183 +#: js/files.js:184 msgid "generating ZIP-file, it may take some time." msgstr "Ustvarjanje datoteke ZIP. To lahko traja nekaj časa." -#: js/files.js:218 +#: js/files.js:219 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Pošiljanje ni mogoče, saj gre za mapo, ali pa je datoteka velikosti 0 bajtov." -#: js/files.js:218 +#: js/files.js:219 msgid "Upload Error" msgstr "Napaka med nalaganjem" -#: js/files.js:235 +#: js/files.js:236 msgid "Close" msgstr "Zapri" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:255 js/files.js:369 js/files.js:399 msgid "Pending" msgstr "V čakanju ..." -#: js/files.js:274 +#: js/files.js:275 msgid "1 file uploading" msgstr "Pošiljanje 1 datoteke" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:278 js/files.js:332 js/files.js:347 msgid "{count} files uploading" msgstr "nalagam {count} datotek" -#: js/files.js:349 js/files.js:382 +#: js/files.js:350 js/files.js:383 msgid "Upload cancelled." msgstr "Pošiljanje je preklicano." -#: js/files.js:451 +#: js/files.js:452 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano." -#: js/files.js:523 +#: js/files.js:524 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Neveljavno ime datoteke. Uporaba mape \"Share\" je rezervirana za ownCloud." -#: js/files.js:704 +#: js/files.js:705 msgid "{count} files scanned" msgstr "{count} files scanned" -#: js/files.js:712 +#: js/files.js:713 msgid "error while scanning" msgstr "napaka med pregledovanjem datotek" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:786 templates/index.php:65 msgid "Name" msgstr "Ime" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:787 templates/index.php:76 msgid "Size" msgstr "Velikost" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:788 templates/index.php:78 msgid "Modified" msgstr "Spremenjeno" -#: js/files.js:814 +#: js/files.js:815 msgid "1 folder" msgstr "1 mapa" -#: js/files.js:816 +#: js/files.js:817 msgid "{count} folders" msgstr "{count} map" -#: js/files.js:824 +#: js/files.js:825 msgid "1 file" msgstr "1 datoteka" -#: js/files.js:826 +#: js/files.js:827 msgid "{count} files" msgstr "{count} datotek" diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po index d8b32993d4..bc1c29f480 100644 --- a/l10n/sl/settings.po +++ b/l10n/sl/settings.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"PO-Revision-Date: 2012-12-07 23:52+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -71,7 +71,7 @@ msgstr "Jezik je bil spremenjen" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Administratorji sebe ne morejo odstraniti iz skupine admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index f01edae58c..0bfb19d926 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index c95c4834fd..8cd7d9c843 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 32ec56eb59..e4885f5d5a 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 243c37a6c2..0c46550dd7 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 1fbb4b2efa..7ff9b935a8 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 5c71a75af7..752adc4d0c 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 1750515a79..4512618428 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:10+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index abe6858996..883fd22680 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:10+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 1179565de1..757f61c791 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index ac038dd142..739342dab6 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" +"POT-Creation-Date: 2012-12-09 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/settings/l10n/ko.php b/settings/l10n/ko.php index cf864c353d..74e37c647e 100644 --- a/settings/l10n/ko.php +++ b/settings/l10n/ko.php @@ -11,6 +11,7 @@ "Authentication error" => "인증 오류", "Unable to delete user" => "사용자 삭제가 불가능합니다.", "Language changed" => "언어가 변경되었습니다", +"Admins can't remove themself from the admin group" => "관리자는 자신을 관리자 그룹으로부터 삭제할 수 없습니다.", "Unable to add user to group %s" => "%s 그룹에 사용자 추가가 불가능합니다.", "Unable to remove user from group %s" => "%s 그룹으로부터 사용자 제거가 불가능합니다.", "Disable" => "비활성화", diff --git a/settings/l10n/sl.php b/settings/l10n/sl.php index 9c65b17cee..b65a7ad641 100644 --- a/settings/l10n/sl.php +++ b/settings/l10n/sl.php @@ -11,6 +11,7 @@ "Authentication error" => "Napaka overitve", "Unable to delete user" => "Ni mogoče izbrisati uporabnika", "Language changed" => "Jezik je bil spremenjen", +"Admins can't remove themself from the admin group" => "Administratorji sebe ne morejo odstraniti iz skupine admin", "Unable to add user to group %s" => "Uporabnika ni mogoče dodati k skupini %s", "Unable to remove user from group %s" => "Uporabnika ni mogoče odstraniti iz skupine %s", "Disable" => "Onemogoči", From 7b0e2b348b3ad5b4351c37cc91531718773c3864 Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Sun, 9 Dec 2012 20:21:04 +0100 Subject: [PATCH 450/481] Fix the loop to search al the available languages, not only the las element. --- lib/l10n.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n.php b/lib/l10n.php index 4f9c3a0ede..b83d8ff86d 100644 --- a/lib/l10n.php +++ b/lib/l10n.php @@ -298,10 +298,10 @@ class OC_L10N{ if( ($key = array_search($temp[0], $available)) !== false) { return $available[$key]; } - } - foreach($available as $l) { - if ( $temp[0] == substr($l,0,2) ) { - return $l; + foreach($available as $l) { + if ( $temp[0] == substr($l,0,2) ) { + return $l; + } } } } From a444999a8c52d203cdc788eeb7e138356d2a3eb9 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Mon, 10 Dec 2012 00:12:32 +0100 Subject: [PATCH 451/481] [tx-robot] updated from transifex --- apps/files/l10n/ko.php | 66 ++++++------- apps/files_encryption/l10n/ko.php | 2 +- apps/files_external/l10n/ko.php | 26 ++--- apps/files_sharing/l10n/ko.php | 10 +- apps/files_versions/l10n/ko.php | 8 +- apps/user_ldap/l10n/ko.php | 40 ++++---- core/l10n/ko.php | 118 +++++++++++----------- l10n/ko/core.po | 124 +++++++++++------------ l10n/ko/files.po | 146 ++++++++++++++-------------- l10n/ko/files_encryption.po | 11 ++- l10n/ko/files_external.po | 56 ++++++----- l10n/ko/files_sharing.po | 27 ++--- l10n/ko/files_versions.po | 15 +-- l10n/ko/lib.po | 57 +++++------ l10n/ko/settings.po | 50 +++++----- l10n/ko/user_ldap.po | 47 ++++----- l10n/ko/user_webdavauth.po | 6 +- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 74 +++++++------- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- lib/l10n/ko.php | 36 +++---- settings/l10n/ko.php | 44 ++++----- 29 files changed, 494 insertions(+), 487 deletions(-) diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index 3a7a689857..4b5d57dff9 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -1,62 +1,62 @@ "업로드에 성공하였습니다.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드된 파일은 php.ini의 upload_max_filesize에 설정된 사이즈를 초과하고 있습니다:", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "업로드한 파일이 HTML 문서에 지정한 MAX_FILE_SIZE보다 더 큼", "The uploaded file was only partially uploaded" => "파일이 부분적으로 업로드됨", "No file was uploaded" => "업로드된 파일 없음", "Missing a temporary folder" => "임시 폴더가 사라짐", "Failed to write to disk" => "디스크에 쓰지 못했습니다", "Files" => "파일", -"Unshare" => "공유해제", +"Unshare" => "공유 해제", "Delete" => "삭제", -"Rename" => "이름변경", -"{new_name} already exists" => "{new_name} 이미 존재함", -"replace" => "대체", -"suggest name" => "이름을 제안", +"Rename" => "이름 바꾸기", +"{new_name} already exists" => "{new_name}이(가) 이미 존재함", +"replace" => "바꾸기", +"suggest name" => "이름 제안", "cancel" => "취소", -"replaced {new_name}" => "{new_name} 으로 대체", -"undo" => "복구", -"replaced {new_name} with {old_name}" => "{old_name}이 {new_name}으로 대체됨", -"unshared {files}" => "{files} 공유해제", +"replaced {new_name}" => "{new_name}을(를) 대체함", +"undo" => "실행 취소", +"replaced {new_name} with {old_name}" => "{old_name}이(가) {new_name}(으)로 대체됨", +"unshared {files}" => "{files} 공유 해제됨", "deleted {files}" => "{files} 삭제됨", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "유효하지 않은 이름, '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.", -"generating ZIP-file, it may take some time." => "ZIP파일 생성에 시간이 걸릴 수 있습니다.", -"Unable to upload your file as it is a directory or has 0 bytes" => "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다.", -"Upload Error" => "업로드 에러", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.", +"generating ZIP-file, it may take some time." => "ZIP 파일을 생성하고 있습니다. 시간이 걸릴 수도 있습니다.", +"Unable to upload your file as it is a directory or has 0 bytes" => "이 파일은 디렉터리이거나 비어 있기 때문에 업로드할 수 없습니다", +"Upload Error" => "업로드 오류", "Close" => "닫기", "Pending" => "보류 중", -"1 file uploading" => "1 파일 업로드중", -"{count} files uploading" => "{count} 파일 업로드중", -"Upload cancelled." => "업로드 취소.", -"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다.", -"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "유효하지 않은 폴더명입니다. \"Shared\"의 사용은 ownCloud에의해 예약이 끝난 상태입니다.", -"{count} files scanned" => "{count} 파일 스캔되었습니다.", -"error while scanning" => "스캔하는 도중 에러", +"1 file uploading" => "파일 1개 업로드 중", +"{count} files uploading" => "파일 {count}개 업로드 중", +"Upload cancelled." => "업로드가 취소되었습니다.", +"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", +"Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" => "폴더 이름이 올바르지 않습니다. \"Shared\" 폴더는 ownCloud에서 예약되었습니다.", +"{count} files scanned" => "파일 {count}개 검색됨", +"error while scanning" => "검색 중 오류 발생", "Name" => "이름", "Size" => "크기", "Modified" => "수정됨", -"1 folder" => "1 폴더", -"{count} folders" => "{count} 폴더", -"1 file" => "1 파일", -"{count} files" => "{count} 파일", +"1 folder" => "폴더 1개", +"{count} folders" => "폴더 {count}개", +"1 file" => "파일 1개", +"{count} files" => "파일 {count}개", "File handling" => "파일 처리", "Maximum upload size" => "최대 업로드 크기", -"max. possible: " => "최대. 가능한:", -"Needed for multi-file and folder downloads." => "멀티 파일 및 폴더 다운로드에 필요.", -"Enable ZIP-download" => "ZIP- 다운로드 허용", -"0 is unlimited" => "0은 무제한 입니다", -"Maximum input size for ZIP files" => "ZIP 파일에 대한 최대 입력 크기", +"max. possible: " => "최대 가능:", +"Needed for multi-file and folder downloads." => "다중 파일 및 폴더 다운로드에 필요합니다.", +"Enable ZIP-download" => "ZIP 다운로드 허용", +"0 is unlimited" => "0은 무제한입니다", +"Maximum input size for ZIP files" => "ZIP 파일 최대 크기", "Save" => "저장", "New" => "새로 만들기", "Text file" => "텍스트 파일", "Folder" => "폴더", -"From link" => "From link", +"From link" => "링크에서", "Upload" => "업로드", "Cancel upload" => "업로드 취소", "Nothing in here. Upload something!" => "내용이 없습니다. 업로드할 수 있습니다!", "Download" => "다운로드", "Upload too large" => "업로드 용량 초과", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", -"Files are being scanned, please wait." => "파일을 검색중입니다, 기다려 주십시오.", -"Current scanning" => "커런트 스캐닝" +"Files are being scanned, please wait." => "파일을 검색하고 있습니다. 기다려 주십시오.", +"Current scanning" => "현재 검색" ); diff --git a/apps/files_encryption/l10n/ko.php b/apps/files_encryption/l10n/ko.php index 83816bc2f1..4702753435 100644 --- a/apps/files_encryption/l10n/ko.php +++ b/apps/files_encryption/l10n/ko.php @@ -1,6 +1,6 @@ "암호화", -"Exclude the following file types from encryption" => "다음파일 형식에 암호화 제외", +"Exclude the following file types from encryption" => "다음 파일 형식은 암호화하지 않음", "None" => "없음", "Enable Encryption" => "암호화 사용" ); diff --git a/apps/files_external/l10n/ko.php b/apps/files_external/l10n/ko.php index d44ad88d85..74a400303b 100644 --- a/apps/files_external/l10n/ko.php +++ b/apps/files_external/l10n/ko.php @@ -1,24 +1,24 @@ "접근 허가", -"Error configuring Dropbox storage" => "드롭박스 저장공간 구성 에러", -"Grant access" => "접근권한 부여", -"Fill out all required fields" => "모든 필요한 필드들을 입력하세요.", -"Please provide a valid Dropbox app key and secret." => "유효한 드롭박스 응용프로그램 키와 비밀번호를 입력해주세요.", -"Error configuring Google Drive storage" => "구글드라이브 저장공간 구성 에러", -"External Storage" => "확장 저장공간", -"Mount point" => "마운트 포인트", +"Access granted" => "접근 허가됨", +"Error configuring Dropbox storage" => "Dropbox 저장소 설정 오류", +"Grant access" => "접근 권한 부여", +"Fill out all required fields" => "모든 필수 항목을 입력하십시오", +"Please provide a valid Dropbox app key and secret." => "올바른 Dropbox 앱 키와 암호를 입력하십시오.", +"Error configuring Google Drive storage" => "Google 드라이브 저장소 설정 오류", +"External Storage" => "외부 저장소", +"Mount point" => "마운트 지점", "Backend" => "백엔드", "Configuration" => "설정", "Options" => "옵션", -"Applicable" => "적용가능", -"Add mount point" => "마운트 포인트 추가", -"None set" => "세트 없음", +"Applicable" => "적용 가능", +"Add mount point" => "마운트 지점 추가", +"None set" => "설정되지 않음", "All Users" => "모든 사용자", "Groups" => "그룹", "Users" => "사용자", "Delete" => "삭제", -"Enable User External Storage" => "사용자 확장 저장공간 사용", -"Allow users to mount their own external storage" => "사용자들에게 그들의 확장 저장공간 마운트 하는것을 허용", +"Enable User External Storage" => "사용자 외부 저장소 사용", +"Allow users to mount their own external storage" => "사용자별 외부 저장소 마운트 허용", "SSL root certificates" => "SSL 루트 인증서", "Import Root Certificate" => "루트 인증서 가져오기" ); diff --git a/apps/files_sharing/l10n/ko.php b/apps/files_sharing/l10n/ko.php index c172da854d..600168d9bf 100644 --- a/apps/files_sharing/l10n/ko.php +++ b/apps/files_sharing/l10n/ko.php @@ -1,9 +1,9 @@ "비밀번호", +"Password" => "암호", "Submit" => "제출", -"%s shared the folder %s with you" => "%s 공유된 폴더 %s 당신과 함께", -"%s shared the file %s with you" => "%s 공유된 파일 %s 당신과 함께", +"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다", +"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다", "Download" => "다운로드", -"No preview available for" => "사용가능한 프리뷰가 없습니다.", -"web services under your control" => "당신의 통제하에 있는 웹서비스" +"No preview available for" => "다음 항목을 미리 볼 수 없음:", +"web services under your control" => "내가 관리하는 웹 서비스" ); diff --git a/apps/files_versions/l10n/ko.php b/apps/files_versions/l10n/ko.php index 9c14de0962..688babb112 100644 --- a/apps/files_versions/l10n/ko.php +++ b/apps/files_versions/l10n/ko.php @@ -1,8 +1,8 @@ "모든 버전이 만료되었습니다.", +"Expire all versions" => "모든 버전 삭제", "History" => "역사", "Versions" => "버전", -"This will delete all existing backup versions of your files" => "당신 파일의 존재하는 모든 백업 버전이 삭제될것입니다.", -"Files Versioning" => "파일 버전관리중", -"Enable" => "가능" +"This will delete all existing backup versions of your files" => "이 파일의 모든 백업 버전을 삭제합니다", +"Files Versioning" => "파일 버전 관리", +"Enable" => "사용함" ); diff --git a/apps/user_ldap/l10n/ko.php b/apps/user_ldap/l10n/ko.php index b0af5bc165..aa775e42b1 100644 --- a/apps/user_ldap/l10n/ko.php +++ b/apps/user_ldap/l10n/ko.php @@ -1,37 +1,37 @@ "호스트", -"You can omit the protocol, except you require SSL. Then start with ldaps://" => "당신은 필요로하는 SSL을 제외하고, 프로토콜을 생략 할 수 있습니다. 다음 시작 주소는 LDAPS://", +"You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL을 사용하는 경우가 아니라면 프로토콜을 입력하지 않아도 됩니다. SSL을 사용하려면 ldaps://를 입력하십시오.", "Base DN" => "기본 DN", -"You can specify Base DN for users and groups in the Advanced tab" => "당신은 고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다.", +"You can specify Base DN for users and groups in the Advanced tab" => "고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다.", "User DN" => "사용자 DN", -"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "클라이언트 유저의 DN는 결합이 완료되어야 합니다. 예를 들면 uid=agent, dc=example, dc=com. 익명 액세스의 경우, DN와 패스워드는 비워둔채로 남겨두세요.", -"Password" => "비밀번호", -"For anonymous access, leave DN and Password empty." => "익명의 접속을 위해서는 DN과 비밀번호를 빈상태로 두면 됩니다.", +"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "바인딩 작업을 수행할 클라이언트 사용자 DN입니다. 예를 들어서 uid=agent,dc=example,dc=com입니다. 익명 접근을 허용하려면 DN과 암호를 비워 두십시오.", +"Password" => "암호", +"For anonymous access, leave DN and Password empty." => "익명 접근을 허용하려면 DN과 암호를 비워 두십시오.", "User Login Filter" => "사용자 로그인 필터", -"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action." => "로그인을 시도 할 때 적용 할 필터를 정의합니다. %%udi는 로그인 작업의 사용자 이름을 대체합니다.", -"use %%uid placeholder, e.g. \"uid=%%uid\"" => "use %%uid placeholder, e.g. \"uid=%%uid\"", +"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action." => "로그인을 시도할 때 적용할 필터입니다. %%uid는 로그인 작업에서의 사용자 이름으로 대체됩니다.", +"use %%uid placeholder, e.g. \"uid=%%uid\"" => "%%uid 자리 비움자를 사용하십시오. 예제: \"uid=%%uid\"\"", "User List Filter" => "사용자 목록 필터", -"Defines the filter to apply, when retrieving users." => "사용자를 검색 할 때 적용 할 필터를 정의합니다.", -"without any placeholder, e.g. \"objectClass=person\"." => "플레이스홀더를 이용하지 마세요. 예 \"objectClass=person\".", +"Defines the filter to apply, when retrieving users." => "사용자를 검색할 때 적용할 필터를 정의합니다.", +"without any placeholder, e.g. \"objectClass=person\"." => "자리 비움자를 사용할 수 없습니다. 예제: \"objectClass=person\"", "Group Filter" => "그룹 필터", -"Defines the filter to apply, when retrieving groups." => "그룹을 검색 할 때 적용 할 필터를 정의합니다.", -"without any placeholder, e.g. \"objectClass=posixGroup\"." => "플레이스홀더를 이용하지 마세요. 예 \"objectClass=posixGroup\".", +"Defines the filter to apply, when retrieving groups." => "그룹을 검색할 때 적용할 필터를 정의합니다.", +"without any placeholder, e.g. \"objectClass=posixGroup\"." => "자리 비움자를 사용할 수 없습니다. 예제: \"objectClass=posixGroup\"", "Port" => "포트", "Base User Tree" => "기본 사용자 트리", "Base Group Tree" => "기본 그룹 트리", -"Group-Member association" => "그룹 회원 동료", +"Group-Member association" => "그룹-회원 연결", "Use TLS" => "TLS 사용", -"Do not use it for SSL connections, it will fail." => "SSL연결을 사용하지 마세요, 그것은 실패할겁니다.", -"Case insensitve LDAP server (Windows)" => "insensitve LDAP 서버 (Windows)의 경우", +"Do not use it for SSL connections, it will fail." => "SSL 연결 시 사용하는 경우 연결되지 않습니다.", +"Case insensitve LDAP server (Windows)" => "서버에서 대소문자를 구분하지 않음 (Windows)", "Turn off SSL certificate validation." => "SSL 인증서 유효성 검사를 해제합니다.", -"If connection only works with this option, import the LDAP server's SSL certificate in your ownCloud server." => "연결에만 이 옵션을 사용할 경우 당신의 ownCloud 서버에 LDAP 서버의 SSL 인증서를 가져옵니다.", -"Not recommended, use for testing only." => "추천하지 않음, 테스트로만 사용", -"User Display Name Field" => "사용자 표시 이름 필드", +"If connection only works with this option, import the LDAP server's SSL certificate in your ownCloud server." => "이 옵션을 사용해야 연결할 수 있는 경우에는 LDAP 서버의 SSL 인증서를 ownCloud로 가져올 수 있습니다.", +"Not recommended, use for testing only." => "추천하지 않음, 테스트로만 사용하십시오.", +"User Display Name Field" => "사용자의 표시 이름 필드", "The LDAP attribute to use to generate the user`s ownCloud name." => "LDAP 속성은 사용자의 ownCloud 이름을 생성하기 위해 사용합니다.", -"Group Display Name Field" => "그룹 표시 이름 필드", +"Group Display Name Field" => "그룹의 표시 이름 필드", "The LDAP attribute to use to generate the groups`s ownCloud name." => "LDAP 속성은 그룹의 ownCloud 이름을 생성하기 위해 사용합니다.", "in bytes" => "바이트", -"in seconds. A change empties the cache." => "초. 변경 후에 캐쉬가 클리어 됩니다.", -"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "사용자 이름(기본값)을 비워 둡니다. 그렇지 않으면 LDAP/AD 특성을 지정합니다.", +"in seconds. A change empties the cache." => "초. 항목 변경 시 캐시가 갱신됩니다.", +"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오.", "Help" => "도움말" ); diff --git a/core/l10n/ko.php b/core/l10n/ko.php index 5a0b581fff..3846dff796 100644 --- a/core/l10n/ko.php +++ b/core/l10n/ko.php @@ -1,64 +1,64 @@ "카테고리 타입이 제공되지 않습니다.", -"No category to add?" => "추가할 카테고리가 없습니까?", -"This category already exists: " => "이 카테고리는 이미 존재합니다:", -"Object type not provided." => "오브젝트 타입이 제공되지 않습니다.", -"%s ID not provided." => "%s ID가 제공되지 않습니다.", -"Error adding %s to favorites." => "즐겨찾기에 %s 를 추가하는데 에러발생.", -"No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다.", -"Error removing %s from favorites." => "즐겨찾기로 부터 %s 를 제거하는데 에러발생", +"Category type not provided." => "분류 형식이 제공되지 않았습니다.", +"No category to add?" => "추가할 분류가 없습니까?", +"This category already exists: " => "이 분류는 이미 존재합니다:", +"Object type not provided." => "객체 형식이 제공되지 않았습니다.", +"%s ID not provided." => "%s ID가 제공되지 않았습니다.", +"Error adding %s to favorites." => "책갈피에 %s을(를) 추가할 수 없었습니다.", +"No categories selected for deletion." => "삭제할 분류를 선택하지 않았습니다.", +"Error removing %s from favorites." => "책갈피에서 %s을(를) 삭제할 수 없었습니다.", "Settings" => "설정", "seconds ago" => "초 전", -"1 minute ago" => "1 분 전", -"{minutes} minutes ago" => "{minutes} 분 전", -"1 hour ago" => "1 시간 전", -"{hours} hours ago" => "{hours} 시간 전", +"1 minute ago" => "1분 전", +"{minutes} minutes ago" => "{minutes}분 전", +"1 hour ago" => "1시간 전", +"{hours} hours ago" => "{hours}시간 전", "today" => "오늘", "yesterday" => "어제", -"{days} days ago" => "{days} 일 전", +"{days} days ago" => "{days}일 전", "last month" => "지난 달", -"{months} months ago" => "{months} 달 전", -"months ago" => "달 전", -"last year" => "지난 해", +"{months} months ago" => "{months}개월 전", +"months ago" => "개월 전", +"last year" => "작년", "years ago" => "년 전", "Choose" => "선택", "Cancel" => "취소", -"No" => "아니오", +"No" => "아니요", "Yes" => "예", "Ok" => "승락", "The object type is not specified." => "객체 유형이 지정되지 않았습니다.", -"Error" => "에러", -"The app name is not specified." => "응용프로그램 이름이 지정되지 않았습니다.", -"The required file {file} is not installed!" => "필요한 파일 {file} 이 인스톨되지 않았습니다!", -"Error while sharing" => "공유하던 중에 에러발생", -"Error while unsharing" => "공유해제하던 중에 에러발생", -"Error while changing permissions" => "권한변경 중에 에러발생", -"Shared with you and the group {group} by {owner}" => "당신과 {owner} 의 그룹 {group} 로 공유중", -"Shared with you by {owner}" => "{owner} 와 공유중", -"Share with" => "공유자", +"Error" => "오류", +"The app name is not specified." => "앱 이름이 지정되지 않았습니다.", +"The required file {file} is not installed!" => "필요한 파일 {file}이(가) 설치되지 않았습니다!", +"Error while sharing" => "공유하는 중 오류 발생", +"Error while unsharing" => "공유 해제하는 중 오류 발생", +"Error while changing permissions" => "권한 변경하는 중 오류 발생", +"Shared with you and the group {group} by {owner}" => "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중", +"Shared with you by {owner}" => "{owner} 님이 공유 중", +"Share with" => "다음으로 공유", "Share with link" => "URL 링크로 공유", -"Password protect" => "비밀번호 보호", +"Password protect" => "암호 보호", "Password" => "암호", -"Set expiration date" => "만료일자 설정", -"Expiration date" => "만료일", -"Share via email:" => "via 이메일로 공유", +"Set expiration date" => "만료 날짜 설정", +"Expiration date" => "만료 날짜", +"Share via email:" => "이메일로 공유:", "No people found" => "발견된 사람 없음", -"Resharing is not allowed" => "재공유는 허용되지 않습니다", -"Shared in {item} with {user}" => "{item} 내에서 {user} 와 공유중", -"Unshare" => "공유해제", +"Resharing is not allowed" => "다시 공유할 수 없습니다", +"Shared in {item} with {user}" => "{user} 님과 {item}에서 공유 중", +"Unshare" => "공유 해제", "can edit" => "편집 가능", -"access control" => "컨트롤에 접근", +"access control" => "접근 제어", "create" => "만들기", "update" => "업데이트", "delete" => "삭제", "share" => "공유", -"Password protected" => "패스워드로 보호됨", -"Error unsetting expiration date" => "만료일자 해제 에러", -"Error setting expiration date" => "만료일자 설정 에러", -"ownCloud password reset" => "ownCloud 비밀번호 재설정", -"Use the following link to reset your password: {link}" => "다음 링크를 사용하여 암호를 초기화할 수 있습니다: {link}", -"You will receive a link to reset your password via Email." => "전자 우편으로 암호 재설정 링크를 보냈습니다.", -"Reset email send." => "리셋 이메일을 보냈습니다.", +"Password protected" => "암호로 보호됨", +"Error unsetting expiration date" => "만료 날짜 해제 오류", +"Error setting expiration date" => "만료 날짜 설정 오류", +"ownCloud password reset" => "ownCloud 암호 재설정", +"Use the following link to reset your password: {link}" => "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}", +"You will receive a link to reset your password via Email." => "이메일로 암호 재설정 링크를 보냈습니다.", +"Reset email send." => "초기화 이메일을 보냈습니다.", "Request failed!" => "요청이 실패했습니다!", "Username" => "사용자 이름", "Request reset" => "요청 초기화", @@ -68,26 +68,26 @@ "Reset password" => "암호 재설정", "Personal" => "개인", "Users" => "사용자", -"Apps" => "프로그램", +"Apps" => "앱", "Admin" => "관리자", "Help" => "도움말", -"Access forbidden" => "접근 금지", +"Access forbidden" => "접근 금지됨", "Cloud not found" => "클라우드를 찾을 수 없습니다", -"Edit categories" => "카테고리 편집", +"Edit categories" => "분류 편집", "Add" => "추가", "Security Warning" => "보안 경고", -"No secure random number generator is available, please enable the PHP OpenSSL extension." => "안전한 난수 생성기가 사용가능하지 않습니다. PHP의 OpenSSL 확장을 설정해주세요.", -"Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "안전한 난수 생성기없이는 공격자가 귀하의 계정을 통해 비밀번호 재설정 토큰을 예측하여 얻을수 있습니다.", -"Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "당신의 데이터 디렉토리 및 파일을 인터넷에서 액세스 할 수 있습니다. ownCloud가 제공하는 .htaccess 파일이 작동하지 않습니다. 우리는 데이터 디렉토리를 더이상 접근 할 수 없도록 웹서버의 루트 외부로 데이터 디렉토리를 이동하는 방식의 웹 서버를 구성하는 것이 좋다고 강력하게 제안합니다.", -"Create an admin account" => "관리자 계정을 만드십시오", +"No secure random number generator is available, please enable the PHP OpenSSL extension." => "안전한 난수 생성기를 사용할 수 없습니다. PHP의 OpenSSL 확장을 활성화해 주십시오.", +"Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "안전한 난수 생성기를 사용하지 않으면 공격자가 암호 초기화 토큰을 추측하여 계정을 탈취할 수 있습니다.", +"Your data directory and your files are probably accessible from the internet. The .htaccess file that ownCloud provides is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." => "데이터 디렉터리와 파일을 인터넷에서 접근할 수 있는 것 같습니다. ownCloud에서 제공한 .htaccess 파일이 작동하지 않습니다. 웹 서버를 다시 설정하여 데이터 디렉터리에 접근할 수 없도록 하거나 문서 루트 바깥쪽으로 옮기는 것을 추천합니다.", +"Create an admin account" => "관리자 계정 만들기", "Advanced" => "고급", -"Data folder" => "자료 폴더", -"Configure the database" => "데이터베이스 구성", -"will be used" => "사용 될 것임", +"Data folder" => "데이터 폴더", +"Configure the database" => "데이터베이스 설정", +"will be used" => "사용될 예정", "Database user" => "데이터베이스 사용자", "Database password" => "데이터베이스 암호", "Database name" => "데이터베이스 이름", -"Database tablespace" => "데이터베이스 테이블공간", +"Database tablespace" => "데이터베이스 테이블 공간", "Database host" => "데이터베이스 호스트", "Finish setup" => "설치 완료", "Sunday" => "일요일", @@ -111,16 +111,16 @@ "December" => "12월", "web services under your control" => "내가 관리하는 웹 서비스", "Log out" => "로그아웃", -"Automatic logon rejected!" => "자동 로그인이 거절되었습니다!", -"If you did not change your password recently, your account may be compromised!" => "당신의 비밀번호를 최근에 변경하지 않았다면, 당신의 계정은 무단도용 될 수 있습니다.", -"Please change your password to secure your account again." => "당신 계정의 안전을 위해 비밀번호를 변경해 주세요.", +"Automatic logon rejected!" => "자동 로그인이 거부되었습니다!", +"If you did not change your password recently, your account may be compromised!" => "최근에 암호를 변경하지 않았다면 계정이 탈취되었을 수도 있습니다!", +"Please change your password to secure your account again." => "계정의 안전을 위하여 암호를 변경하십시오.", "Lost your password?" => "암호를 잊으셨습니까?", "remember" => "기억하기", "Log in" => "로그인", -"You are logged out." => "로그아웃 하셨습니다.", +"You are logged out." => "로그아웃되었습니다.", "prev" => "이전", "next" => "다음", -"Security Warning!" => "보안경고!", -"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "당신의 비밀번호를 인증해주세요.
    보안상의 이유로 당신은 경우에 따라 암호를 다시 입력하라는 메시지가 표시 될 수 있습니다.", -"Verify" => "인증" +"Security Warning!" => "보안 경고!", +"Please verify your password.
    For security reasons you may be occasionally asked to enter your password again." => "암호를 확인해 주십시오.
    보안상의 이유로 종종 암호를 물어볼 것입니다.", +"Verify" => "확인" ); diff --git a/l10n/ko/core.po b/l10n/ko/core.po index 362fa216ac..11331b588a 100644 --- a/l10n/ko/core.po +++ b/l10n/ko/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" -"PO-Revision-Date: 2012-12-08 15:57+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:08+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,41 +22,41 @@ msgstr "" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." -msgstr "카테고리 타입이 제공되지 않습니다." +msgstr "분류 형식이 제공되지 않았습니다." #: ajax/vcategories/add.php:30 msgid "No category to add?" -msgstr "추가할 카테고리가 없습니까?" +msgstr "추가할 분류가 없습니까?" #: ajax/vcategories/add.php:37 msgid "This category already exists: " -msgstr "이 카테고리는 이미 존재합니다:" +msgstr "이 분류는 이미 존재합니다:" #: ajax/vcategories/addToFavorites.php:26 ajax/vcategories/delete.php:27 #: ajax/vcategories/favorites.php:24 #: ajax/vcategories/removeFromFavorites.php:26 msgid "Object type not provided." -msgstr "오브젝트 타입이 제공되지 않습니다." +msgstr "객체 형식이 제공되지 않았습니다." #: ajax/vcategories/addToFavorites.php:30 #: ajax/vcategories/removeFromFavorites.php:30 #, php-format msgid "%s ID not provided." -msgstr "%s ID가 제공되지 않습니다." +msgstr "%s ID가 제공되지 않았습니다." #: ajax/vcategories/addToFavorites.php:35 #, php-format msgid "Error adding %s to favorites." -msgstr "즐겨찾기에 %s 를 추가하는데 에러발생." +msgstr "책갈피에 %s을(를) 추가할 수 없었습니다." #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." -msgstr "삭제 카테고리를 선택하지 않았습니다." +msgstr "삭제할 분류를 선택하지 않았습니다." #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." -msgstr "즐겨찾기로 부터 %s 를 제거하는데 에러발생" +msgstr "책갈피에서 %s을(를) 삭제할 수 없었습니다." #: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" @@ -68,19 +68,19 @@ msgstr "초 전" #: js/js.js:705 msgid "1 minute ago" -msgstr "1 분 전" +msgstr "1분 전" #: js/js.js:706 msgid "{minutes} minutes ago" -msgstr "{minutes} 분 전" +msgstr "{minutes}분 전" #: js/js.js:707 msgid "1 hour ago" -msgstr "1 시간 전" +msgstr "1시간 전" #: js/js.js:708 msgid "{hours} hours ago" -msgstr "{hours} 시간 전" +msgstr "{hours}시간 전" #: js/js.js:709 msgid "today" @@ -92,7 +92,7 @@ msgstr "어제" #: js/js.js:711 msgid "{days} days ago" -msgstr "{days} 일 전" +msgstr "{days}일 전" #: js/js.js:712 msgid "last month" @@ -100,15 +100,15 @@ msgstr "지난 달" #: js/js.js:713 msgid "{months} months ago" -msgstr "{months} 달 전" +msgstr "{months}개월 전" #: js/js.js:714 msgid "months ago" -msgstr "달 전" +msgstr "개월 전" #: js/js.js:715 msgid "last year" -msgstr "지난 해" +msgstr "작년" #: js/js.js:716 msgid "years ago" @@ -124,7 +124,7 @@ msgstr "취소" #: js/oc-dialogs.js:162 msgid "No" -msgstr "아니오" +msgstr "아니요" #: js/oc-dialogs.js:163 msgid "Yes" @@ -143,39 +143,39 @@ msgstr "객체 유형이 지정되지 않았습니다." #: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 #: js/share.js:545 msgid "Error" -msgstr "에러" +msgstr "오류" #: js/oc-vcategories.js:179 msgid "The app name is not specified." -msgstr "응용프로그램 이름이 지정되지 않았습니다." +msgstr "앱 이름이 지정되지 않았습니다." #: js/oc-vcategories.js:194 msgid "The required file {file} is not installed!" -msgstr "필요한 파일 {file} 이 인스톨되지 않았습니다!" +msgstr "필요한 파일 {file}이(가) 설치되지 않았습니다!" #: js/share.js:124 msgid "Error while sharing" -msgstr "공유하던 중에 에러발생" +msgstr "공유하는 중 오류 발생" #: js/share.js:135 msgid "Error while unsharing" -msgstr "공유해제하던 중에 에러발생" +msgstr "공유 해제하는 중 오류 발생" #: js/share.js:142 msgid "Error while changing permissions" -msgstr "권한변경 중에 에러발생" +msgstr "권한 변경하는 중 오류 발생" #: js/share.js:151 msgid "Shared with you and the group {group} by {owner}" -msgstr "당신과 {owner} 의 그룹 {group} 로 공유중" +msgstr "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중" #: js/share.js:153 msgid "Shared with you by {owner}" -msgstr "{owner} 와 공유중" +msgstr "{owner} 님이 공유 중" #: js/share.js:158 msgid "Share with" -msgstr "공유자" +msgstr "다음으로 공유" #: js/share.js:163 msgid "Share with link" @@ -183,7 +183,7 @@ msgstr "URL 링크로 공유" #: js/share.js:164 msgid "Password protect" -msgstr "비밀번호 보호" +msgstr "암호 보호" #: js/share.js:168 templates/installation.php:42 templates/login.php:24 #: templates/verify.php:13 @@ -192,15 +192,15 @@ msgstr "암호" #: js/share.js:173 msgid "Set expiration date" -msgstr "만료일자 설정" +msgstr "만료 날짜 설정" #: js/share.js:174 msgid "Expiration date" -msgstr "만료일" +msgstr "만료 날짜" #: js/share.js:206 msgid "Share via email:" -msgstr "via 이메일로 공유" +msgstr "이메일로 공유:" #: js/share.js:208 msgid "No people found" @@ -208,15 +208,15 @@ msgstr "발견된 사람 없음" #: js/share.js:235 msgid "Resharing is not allowed" -msgstr "재공유는 허용되지 않습니다" +msgstr "다시 공유할 수 없습니다" #: js/share.js:271 msgid "Shared in {item} with {user}" -msgstr "{item} 내에서 {user} 와 공유중" +msgstr "{user} 님과 {item}에서 공유 중" #: js/share.js:292 msgid "Unshare" -msgstr "공유해제" +msgstr "공유 해제" #: js/share.js:304 msgid "can edit" @@ -224,7 +224,7 @@ msgstr "편집 가능" #: js/share.js:306 msgid "access control" -msgstr "컨트롤에 접근" +msgstr "접근 제어" #: js/share.js:309 msgid "create" @@ -244,31 +244,31 @@ msgstr "공유" #: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" -msgstr "패스워드로 보호됨" +msgstr "암호로 보호됨" #: js/share.js:533 msgid "Error unsetting expiration date" -msgstr "만료일자 해제 에러" +msgstr "만료 날짜 해제 오류" #: js/share.js:545 msgid "Error setting expiration date" -msgstr "만료일자 설정 에러" +msgstr "만료 날짜 설정 오류" #: lostpassword/controller.php:47 msgid "ownCloud password reset" -msgstr "ownCloud 비밀번호 재설정" +msgstr "ownCloud 암호 재설정" #: lostpassword/templates/email.php:2 msgid "Use the following link to reset your password: {link}" -msgstr "다음 링크를 사용하여 암호를 초기화할 수 있습니다: {link}" +msgstr "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}" #: lostpassword/templates/lostpassword.php:3 msgid "You will receive a link to reset your password via Email." -msgstr "전자 우편으로 암호 재설정 링크를 보냈습니다." +msgstr "이메일로 암호 재설정 링크를 보냈습니다." #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." -msgstr "리셋 이메일을 보냈습니다." +msgstr "초기화 이메일을 보냈습니다." #: lostpassword/templates/lostpassword.php:8 msgid "Request failed!" @@ -309,7 +309,7 @@ msgstr "사용자" #: strings.php:7 msgid "Apps" -msgstr "프로그램" +msgstr "앱" #: strings.php:8 msgid "Admin" @@ -321,7 +321,7 @@ msgstr "도움말" #: templates/403.php:12 msgid "Access forbidden" -msgstr "접근 금지" +msgstr "접근 금지됨" #: templates/404.php:12 msgid "Cloud not found" @@ -329,7 +329,7 @@ msgstr "클라우드를 찾을 수 없습니다" #: templates/edit_categories_dialog.php:4 msgid "Edit categories" -msgstr "카테고리 편집" +msgstr "분류 편집" #: templates/edit_categories_dialog.php:16 msgid "Add" @@ -343,13 +343,13 @@ msgstr "보안 경고" msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." -msgstr "안전한 난수 생성기가 사용가능하지 않습니다. PHP의 OpenSSL 확장을 설정해주세요." +msgstr "안전한 난수 생성기를 사용할 수 없습니다. PHP의 OpenSSL 확장을 활성화해 주십시오." #: templates/installation.php:26 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." -msgstr "안전한 난수 생성기없이는 공격자가 귀하의 계정을 통해 비밀번호 재설정 토큰을 예측하여 얻을수 있습니다." +msgstr "안전한 난수 생성기를 사용하지 않으면 공격자가 암호 초기화 토큰을 추측하여 계정을 탈취할 수 있습니다." #: templates/installation.php:32 msgid "" @@ -358,11 +358,11 @@ msgid "" "strongly suggest that you configure your webserver in a way that the data " "directory is no longer accessible or you move the data directory outside the" " webserver document root." -msgstr "당신의 데이터 디렉토리 및 파일을 인터넷에서 액세스 할 수 있습니다. ownCloud가 제공하는 .htaccess 파일이 작동하지 않습니다. 우리는 데이터 디렉토리를 더이상 접근 할 수 없도록 웹서버의 루트 외부로 데이터 디렉토리를 이동하는 방식의 웹 서버를 구성하는 것이 좋다고 강력하게 제안합니다." +msgstr "데이터 디렉터리와 파일을 인터넷에서 접근할 수 있는 것 같습니다. ownCloud에서 제공한 .htaccess 파일이 작동하지 않습니다. 웹 서버를 다시 설정하여 데이터 디렉터리에 접근할 수 없도록 하거나 문서 루트 바깥쪽으로 옮기는 것을 추천합니다." #: templates/installation.php:36 msgid "Create an admin account" -msgstr "관리자 계정을 만드십시오" +msgstr "관리자 계정 만들기" #: templates/installation.php:48 msgid "Advanced" @@ -370,16 +370,16 @@ msgstr "고급" #: templates/installation.php:50 msgid "Data folder" -msgstr "자료 폴더" +msgstr "데이터 폴더" #: templates/installation.php:57 msgid "Configure the database" -msgstr "데이터베이스 구성" +msgstr "데이터베이스 설정" #: templates/installation.php:62 templates/installation.php:73 #: templates/installation.php:83 templates/installation.php:93 msgid "will be used" -msgstr "사용 될 것임" +msgstr "사용될 예정" #: templates/installation.php:105 msgid "Database user" @@ -395,7 +395,7 @@ msgstr "데이터베이스 이름" #: templates/installation.php:121 msgid "Database tablespace" -msgstr "데이터베이스 테이블공간" +msgstr "데이터베이스 테이블 공간" #: templates/installation.php:127 msgid "Database host" @@ -491,17 +491,17 @@ msgstr "로그아웃" #: templates/login.php:8 msgid "Automatic logon rejected!" -msgstr "자동 로그인이 거절되었습니다!" +msgstr "자동 로그인이 거부되었습니다!" #: templates/login.php:9 msgid "" "If you did not change your password recently, your account may be " "compromised!" -msgstr "당신의 비밀번호를 최근에 변경하지 않았다면, 당신의 계정은 무단도용 될 수 있습니다." +msgstr "최근에 암호를 변경하지 않았다면 계정이 탈취되었을 수도 있습니다!" #: templates/login.php:10 msgid "Please change your password to secure your account again." -msgstr "당신 계정의 안전을 위해 비밀번호를 변경해 주세요." +msgstr "계정의 안전을 위하여 암호를 변경하십시오." #: templates/login.php:15 msgid "Lost your password?" @@ -517,7 +517,7 @@ msgstr "로그인" #: templates/logout.php:1 msgid "You are logged out." -msgstr "로그아웃 하셨습니다." +msgstr "로그아웃되었습니다." #: templates/part.pagenavi.php:3 msgid "prev" @@ -529,14 +529,14 @@ msgstr "다음" #: templates/verify.php:5 msgid "Security Warning!" -msgstr "보안경고!" +msgstr "보안 경고!" #: templates/verify.php:6 msgid "" "Please verify your password.
    For security reasons you may be " "occasionally asked to enter your password again." -msgstr "당신의 비밀번호를 인증해주세요.
    보안상의 이유로 당신은 경우에 따라 암호를 다시 입력하라는 메시지가 표시 될 수 있습니다." +msgstr "암호를 확인해 주십시오.
    보안상의 이유로 종종 암호를 물어볼 것입니다." #: templates/verify.php:16 msgid "Verify" -msgstr "인증" +msgstr "확인" diff --git a/l10n/ko/files.po b/l10n/ko/files.po index ade758140e..0fcb15b44b 100644 --- a/l10n/ko/files.po +++ b/l10n/ko/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" -"PO-Revision-Date: 2012-12-08 15:59+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 05:40+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgstr "업로드에 성공하였습니다." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "업로드된 파일은 php.ini의 upload_max_filesize에 설정된 사이즈를 초과하고 있습니다:" +msgstr "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:" #: ajax/upload.php:23 msgid "" @@ -55,51 +55,51 @@ msgstr "디스크에 쓰지 못했습니다" msgid "Files" msgstr "파일" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" -msgstr "공유해제" +msgstr "공유 해제" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "삭제" #: js/fileactions.js:181 msgid "Rename" -msgstr "이름변경" +msgstr "이름 바꾸기" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" -msgstr "{new_name} 이미 존재함" +msgstr "{new_name}이(가) 이미 존재함" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" -msgstr "대체" +msgstr "바꾸기" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" -msgstr "이름을 제안" +msgstr "이름 제안" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "취소" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" -msgstr "{new_name} 으로 대체" +msgstr "{new_name}을(를) 대체함" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" -msgstr "복구" +msgstr "실행 취소" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" -msgstr "{old_name}이 {new_name}으로 대체됨" +msgstr "{old_name}이(가) {new_name}(으)로 대체됨" + +#: js/filelist.js:282 +msgid "unshared {files}" +msgstr "{files} 공유 해제됨" #: js/filelist.js:284 -msgid "unshared {files}" -msgstr "{files} 공유해제" - -#: js/filelist.js:286 msgid "deleted {files}" msgstr "{files} 삭제됨" @@ -107,84 +107,84 @@ msgstr "{files} 삭제됨" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "유효하지 않은 이름, '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다." +msgstr "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다." -#: js/files.js:184 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." -msgstr "ZIP파일 생성에 시간이 걸릴 수 있습니다." +msgstr "ZIP 파일을 생성하고 있습니다. 시간이 걸릴 수도 있습니다." -#: js/files.js:219 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" -msgstr "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다." +msgstr "이 파일은 디렉터리이거나 비어 있기 때문에 업로드할 수 없습니다" -#: js/files.js:219 +#: js/files.js:209 msgid "Upload Error" -msgstr "업로드 에러" +msgstr "업로드 오류" -#: js/files.js:236 +#: js/files.js:226 msgid "Close" msgstr "닫기" -#: js/files.js:255 js/files.js:369 js/files.js:399 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "보류 중" -#: js/files.js:275 +#: js/files.js:265 msgid "1 file uploading" -msgstr "1 파일 업로드중" +msgstr "파일 1개 업로드 중" -#: js/files.js:278 js/files.js:332 js/files.js:347 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" -msgstr "{count} 파일 업로드중" +msgstr "파일 {count}개 업로드 중" -#: js/files.js:350 js/files.js:383 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." -msgstr "업로드 취소." +msgstr "업로드가 취소되었습니다." -#: js/files.js:452 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." -msgstr "파일 업로드을 진행합니다. 페이지를 떠나게 될경우 업로드가 취소됩니다." +msgstr "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다." -#: js/files.js:524 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" -msgstr "유효하지 않은 폴더명입니다. \"Shared\"의 사용은 ownCloud에의해 예약이 끝난 상태입니다." +msgstr "폴더 이름이 올바르지 않습니다. \"Shared\" 폴더는 ownCloud에서 예약되었습니다." -#: js/files.js:705 +#: js/files.js:693 msgid "{count} files scanned" -msgstr "{count} 파일 스캔되었습니다." +msgstr "파일 {count}개 검색됨" -#: js/files.js:713 +#: js/files.js:701 msgid "error while scanning" -msgstr "스캔하는 도중 에러" +msgstr "검색 중 오류 발생" -#: js/files.js:786 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "이름" -#: js/files.js:787 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "크기" -#: js/files.js:788 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "수정됨" -#: js/files.js:815 +#: js/files.js:803 msgid "1 folder" -msgstr "1 폴더" +msgstr "폴더 1개" -#: js/files.js:817 +#: js/files.js:805 msgid "{count} folders" -msgstr "{count} 폴더" +msgstr "폴더 {count}개" -#: js/files.js:825 +#: js/files.js:813 msgid "1 file" -msgstr "1 파일" +msgstr "파일 1개" -#: js/files.js:827 +#: js/files.js:815 msgid "{count} files" -msgstr "{count} 파일" +msgstr "파일 {count}개" #: templates/admin.php:5 msgid "File handling" @@ -196,23 +196,23 @@ msgstr "최대 업로드 크기" #: templates/admin.php:9 msgid "max. possible: " -msgstr "최대. 가능한:" +msgstr "최대 가능:" #: templates/admin.php:12 msgid "Needed for multi-file and folder downloads." -msgstr "멀티 파일 및 폴더 다운로드에 필요." +msgstr "다중 파일 및 폴더 다운로드에 필요합니다." #: templates/admin.php:14 msgid "Enable ZIP-download" -msgstr "ZIP- 다운로드 허용" +msgstr "ZIP 다운로드 허용" #: templates/admin.php:17 msgid "0 is unlimited" -msgstr "0은 무제한 입니다" +msgstr "0은 무제한입니다" #: templates/admin.php:19 msgid "Maximum input size for ZIP files" -msgstr "ZIP 파일에 대한 최대 입력 크기" +msgstr "ZIP 파일 최대 크기" #: templates/admin.php:23 msgid "Save" @@ -232,7 +232,7 @@ msgstr "폴더" #: templates/index.php:14 msgid "From link" -msgstr "From link" +msgstr "링크에서" #: templates/index.php:35 msgid "Upload" @@ -242,28 +242,28 @@ msgstr "업로드" msgid "Cancel upload" msgstr "업로드 취소" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "내용이 없습니다. 업로드할 수 있습니다!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "다운로드" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "업로드 용량 초과" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다." -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." -msgstr "파일을 검색중입니다, 기다려 주십시오." +msgstr "파일을 검색하고 있습니다. 기다려 주십시오." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" -msgstr "커런트 스캐닝" +msgstr "현재 검색" diff --git a/l10n/ko/files_encryption.po b/l10n/ko/files_encryption.po index 4039e55eb0..7317bd55f1 100644 --- a/l10n/ko/files_encryption.po +++ b/l10n/ko/files_encryption.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 09:52+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:13+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,12 +25,12 @@ msgstr "암호화" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "다음파일 형식에 암호화 제외" +msgstr "다음 파일 형식은 암호화하지 않음" #: templates/settings.php:5 msgid "None" msgstr "없음" -#: templates/settings.php:10 +#: templates/settings.php:12 msgid "Enable Encryption" msgstr "암호화 사용" diff --git a/l10n/ko/files_external.po b/l10n/ko/files_external.po index 77bee80532..8a9204f06a 100644 --- a/l10n/ko/files_external.po +++ b/l10n/ko/files_external.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 09:51+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:12+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,35 +21,35 @@ msgstr "" #: js/dropbox.js:7 js/dropbox.js:25 js/google.js:7 js/google.js:23 msgid "Access granted" -msgstr "접근 허가" +msgstr "접근 허가됨" #: js/dropbox.js:28 js/dropbox.js:74 js/dropbox.js:79 js/dropbox.js:86 msgid "Error configuring Dropbox storage" -msgstr "드롭박스 저장공간 구성 에러" +msgstr "Dropbox 저장소 설정 오류" #: js/dropbox.js:34 js/dropbox.js:45 js/google.js:31 js/google.js:40 msgid "Grant access" -msgstr "접근권한 부여" +msgstr "접근 권한 부여" #: js/dropbox.js:73 js/google.js:72 msgid "Fill out all required fields" -msgstr "모든 필요한 필드들을 입력하세요." +msgstr "모든 필수 항목을 입력하십시오" #: js/dropbox.js:85 msgid "Please provide a valid Dropbox app key and secret." -msgstr "유효한 드롭박스 응용프로그램 키와 비밀번호를 입력해주세요." +msgstr "올바른 Dropbox 앱 키와 암호를 입력하십시오." #: js/google.js:26 js/google.js:73 js/google.js:78 msgid "Error configuring Google Drive storage" -msgstr "구글드라이브 저장공간 구성 에러" +msgstr "Google 드라이브 저장소 설정 오류" #: templates/settings.php:3 msgid "External Storage" -msgstr "확장 저장공간" +msgstr "외부 저장소" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:7 templates/settings.php:21 msgid "Mount point" -msgstr "마운트 포인트" +msgstr "마운트 지점" #: templates/settings.php:8 msgid "Backend" @@ -64,44 +65,45 @@ msgstr "옵션" #: templates/settings.php:11 msgid "Applicable" -msgstr "적용가능" +msgstr "적용 가능" -#: templates/settings.php:23 +#: templates/settings.php:26 msgid "Add mount point" -msgstr "마운트 포인트 추가" +msgstr "마운트 지점 추가" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:84 msgid "None set" -msgstr "세트 없음" +msgstr "설정되지 않음" -#: templates/settings.php:63 +#: templates/settings.php:85 msgid "All Users" msgstr "모든 사용자" -#: templates/settings.php:64 +#: templates/settings.php:86 msgid "Groups" msgstr "그룹" -#: templates/settings.php:69 +#: templates/settings.php:94 msgid "Users" msgstr "사용자" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:107 templates/settings.php:108 +#: templates/settings.php:148 templates/settings.php:149 msgid "Delete" msgstr "삭제" -#: templates/settings.php:87 +#: templates/settings.php:123 msgid "Enable User External Storage" -msgstr "사용자 확장 저장공간 사용" +msgstr "사용자 외부 저장소 사용" -#: templates/settings.php:88 +#: templates/settings.php:124 msgid "Allow users to mount their own external storage" -msgstr "사용자들에게 그들의 확장 저장공간 마운트 하는것을 허용" +msgstr "사용자별 외부 저장소 마운트 허용" -#: templates/settings.php:99 +#: templates/settings.php:138 msgid "SSL root certificates" msgstr "SSL 루트 인증서" -#: templates/settings.php:113 +#: templates/settings.php:157 msgid "Import Root Certificate" msgstr "루트 인증서 가져오기" diff --git a/l10n/ko/files_sharing.po b/l10n/ko/files_sharing.po index d4b5001cfc..0190903ffa 100644 --- a/l10n/ko/files_sharing.po +++ b/l10n/ko/files_sharing.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 09:46+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:12+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,30 +21,30 @@ msgstr "" #: templates/authenticate.php:4 msgid "Password" -msgstr "비밀번호" +msgstr "암호" #: templates/authenticate.php:6 msgid "Submit" msgstr "제출" -#: templates/public.php:9 +#: templates/public.php:17 #, php-format msgid "%s shared the folder %s with you" -msgstr "%s 공유된 폴더 %s 당신과 함께" +msgstr "%s 님이 폴더 %s을(를) 공유하였습니다" -#: templates/public.php:11 +#: templates/public.php:19 #, php-format msgid "%s shared the file %s with you" -msgstr "%s 공유된 파일 %s 당신과 함께" +msgstr "%s 님이 파일 %s을(를) 공유하였습니다" -#: templates/public.php:14 templates/public.php:30 +#: templates/public.php:22 templates/public.php:38 msgid "Download" msgstr "다운로드" -#: templates/public.php:29 +#: templates/public.php:37 msgid "No preview available for" -msgstr "사용가능한 프리뷰가 없습니다." +msgstr "다음 항목을 미리 볼 수 없음:" -#: templates/public.php:35 +#: templates/public.php:43 msgid "web services under your control" -msgstr "당신의 통제하에 있는 웹서비스" +msgstr "내가 관리하는 웹 서비스" diff --git a/l10n/ko/files_versions.po b/l10n/ko/files_versions.po index 7476cb5783..20d3071b54 100644 --- a/l10n/ko/files_versions.po +++ b/l10n/ko/files_versions.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 09:43+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:11+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,7 +21,7 @@ msgstr "" #: js/settings-personal.js:31 templates/settings-personal.php:10 msgid "Expire all versions" -msgstr "모든 버전이 만료되었습니다." +msgstr "모든 버전 삭제" #: js/versions.js:16 msgid "History" @@ -32,12 +33,12 @@ msgstr "버전" #: templates/settings-personal.php:7 msgid "This will delete all existing backup versions of your files" -msgstr "당신 파일의 존재하는 모든 백업 버전이 삭제될것입니다." +msgstr "이 파일의 모든 백업 버전을 삭제합니다" #: templates/settings.php:3 msgid "Files Versioning" -msgstr "파일 버전관리중" +msgstr "파일 버전 관리" #: templates/settings.php:4 msgid "Enable" -msgstr "가능" +msgstr "사용함" diff --git a/l10n/ko/lib.po b/l10n/ko/lib.po index c4e82579bc..3870ebda87 100644 --- a/l10n/ko/lib.po +++ b/l10n/ko/lib.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 06:19+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:06+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,37 +19,37 @@ msgstr "" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: app.php:285 +#: app.php:287 msgid "Help" msgstr "도움말" -#: app.php:292 +#: app.php:294 msgid "Personal" -msgstr "개인의" +msgstr "개인" -#: app.php:297 +#: app.php:299 msgid "Settings" msgstr "설정" -#: app.php:302 +#: app.php:304 msgid "Users" msgstr "사용자" -#: app.php:309 -msgid "Apps" -msgstr "어플리케이션" - #: app.php:311 +msgid "Apps" +msgstr "앱" + +#: app.php:313 msgid "Admin" msgstr "관리자" #: files.php:361 msgid "ZIP download is turned off." -msgstr "ZIP 다운로드가 꺼졌습니다." +msgstr "ZIP 다운로드가 비활성화되었습니다." #: files.php:362 msgid "Files need to be downloaded one by one." -msgstr "파일 차례대로 다운로드가 필요합니다." +msgstr "파일을 개별적으로 다운로드해야 합니다." #: files.php:362 files.php:387 msgid "Back to Files" @@ -56,11 +57,11 @@ msgstr "파일로 돌아가기" #: files.php:386 msgid "Selected files too large to generate zip file." -msgstr "zip 파일 생성하기 위한 너무 많은 파일들이 선택되었습니다." +msgstr "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다." #: json.php:28 msgid "Application is not enabled" -msgstr "응용프로그램이 사용 가능하지 않습니다." +msgstr "앱이 활성화되지 않았습니다" #: json.php:39 json.php:64 json.php:77 json.php:89 msgid "Authentication error" @@ -68,7 +69,7 @@ msgstr "인증 오류" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "토큰 만료. 페이지를 새로고침 해주세요." +msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오." #: search/provider/file.php:17 search/provider/file.php:35 msgid "Files" @@ -76,7 +77,7 @@ msgstr "파일" #: search/provider/file.php:26 search/provider/file.php:33 msgid "Text" -msgstr "문자 번호" +msgstr "텍스트" #: search/provider/file.php:29 msgid "Images" @@ -93,16 +94,16 @@ msgstr "1분 전" #: template.php:105 #, php-format msgid "%d minutes ago" -msgstr "%d 분 전" +msgstr "%d분 전" #: template.php:106 msgid "1 hour ago" -msgstr "1 시간 전" +msgstr "1시간 전" #: template.php:107 #, php-format msgid "%d hours ago" -msgstr "%d 시간 전" +msgstr "%d시간 전" #: template.php:108 msgid "today" @@ -115,7 +116,7 @@ msgstr "어제" #: template.php:110 #, php-format msgid "%d days ago" -msgstr "%d 일 전" +msgstr "%d일 전" #: template.php:111 msgid "last month" @@ -124,20 +125,20 @@ msgstr "지난 달" #: template.php:112 #, php-format msgid "%d months ago" -msgstr "%d 달 전" +msgstr "%d개월 전" #: template.php:113 msgid "last year" -msgstr "지난 해" +msgstr "작년" #: template.php:114 msgid "years ago" -msgstr "작년" +msgstr "년 전" #: updater.php:75 #, php-format msgid "%s is available. Get more information" -msgstr "%s은 가능합니다. 더 자세한 정보는 이곳으로.." +msgstr "%s을(를) 사용할 수 있습니다. 자세한 정보 보기" #: updater.php:77 msgid "up to date" @@ -145,9 +146,9 @@ msgstr "최신" #: updater.php:80 msgid "updates check is disabled" -msgstr "업데이트 확인이 비활성화 되어있습니다." +msgstr "업데이트 확인이 비활성화됨" #: vcategories.php:188 vcategories.php:249 #, php-format msgid "Could not find category \"%s\"" -msgstr "\"%s\" 카테고리를 찾을 수 없습니다." +msgstr "분류 \"%s\"을(를) 찾을 수 없습니다." diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po index a193316f43..5cf547ad04 100644 --- a/l10n/ko/settings.po +++ b/l10n/ko/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" -"PO-Revision-Date: 2012-12-08 15:56+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 05:40+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,19 +30,19 @@ msgstr "그룹이 이미 존재합니다." #: ajax/creategroup.php:19 msgid "Unable to add group" -msgstr "그룹추가가 불가능합니다." +msgstr "그룹을 추가할 수 없습니다." #: ajax/enableapp.php:12 msgid "Could not enable app. " -msgstr "응용프로그램 가능하지 않습니다." +msgstr "앱을 활성화할 수 없습니다." #: ajax/lostpassword.php:12 msgid "Email saved" -msgstr "이메일 저장" +msgstr "이메일 저장됨" #: ajax/lostpassword.php:14 msgid "Invalid email" -msgstr "잘못된 이메일" +msgstr "잘못된 이메일 주소" #: ajax/openid.php:13 msgid "OpenID Changed" @@ -54,7 +54,7 @@ msgstr "잘못된 요청" #: ajax/removegroup.php:13 msgid "Unable to delete group" -msgstr "그룹 삭제가 불가능합니다." +msgstr "그룹을 삭제할 수 없습니다." #: ajax/removeuser.php:15 ajax/setquota.php:15 ajax/togglegroups.php:18 msgid "Authentication error" @@ -62,7 +62,7 @@ msgstr "인증 오류" #: ajax/removeuser.php:24 msgid "Unable to delete user" -msgstr "사용자 삭제가 불가능합니다." +msgstr "사용자를 삭제할 수 없습니다." #: ajax/setlanguage.php:15 msgid "Language changed" @@ -70,17 +70,17 @@ msgstr "언어가 변경되었습니다" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "관리자는 자신을 관리자 그룹으로부터 삭제할 수 없습니다." +msgstr "관리자 자신을 관리자 그룹에서 삭제할 수 없습니다" #: ajax/togglegroups.php:28 #, php-format msgid "Unable to add user to group %s" -msgstr "%s 그룹에 사용자 추가가 불가능합니다." +msgstr "그룹 %s에 사용자를 추가할 수 없습니다." #: ajax/togglegroups.php:34 #, php-format msgid "Unable to remove user from group %s" -msgstr "%s 그룹으로부터 사용자 제거가 불가능합니다." +msgstr "그룹 %s에서 사용자를 삭제할 수 없습니다." #: js/apps.js:28 js/apps.js:67 msgid "Disable" @@ -92,7 +92,7 @@ msgstr "활성화" #: js/personal.js:69 msgid "Saving..." -msgstr "저장..." +msgstr "저장 중..." #: personal.php:42 personal.php:43 msgid "__language_name__" @@ -104,19 +104,19 @@ msgstr "앱 추가" #: templates/apps.php:11 msgid "More Apps" -msgstr "더많은 응용프로그램들" +msgstr "더 많은 앱" #: templates/apps.php:27 msgid "Select an App" -msgstr "프로그램 선택" +msgstr "앱 선택" #: templates/apps.php:31 msgid "See application page at apps.owncloud.com" -msgstr "application page at apps.owncloud.com을 보시오." +msgstr "apps.owncloud.com에 있는 앱 페이지를 참고하십시오" #: templates/apps.php:32 msgid "-licensed by " -msgstr "-licensed by " +msgstr "-라이선스 보유자 " #: templates/help.php:9 msgid "Documentation" @@ -145,11 +145,11 @@ msgstr "대답" #: templates/personal.php:8 #, php-format msgid "You have used %s of the available %s" -msgstr "You have used %s of the available %s" +msgstr "현재 공간 %s/%s을(를) 사용 중입니다" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" -msgstr "데스크탑 및 모바일 동기화 클라이언트" +msgstr "데스크톱 및 모바일 동기화 클라이언트" #: templates/personal.php:13 msgid "Download" @@ -157,7 +157,7 @@ msgstr "다운로드" #: templates/personal.php:19 msgid "Your password was changed" -msgstr "당신의 비밀번호가 변경되었습니다." +msgstr "암호가 변경되었습니다" #: templates/personal.php:20 msgid "Unable to change your password" @@ -181,15 +181,15 @@ msgstr "암호 변경" #: templates/personal.php:30 msgid "Email" -msgstr "전자 우편" +msgstr "이메일" #: templates/personal.php:31 msgid "Your email address" -msgstr "전자 우편 주소" +msgstr "이메일 주소" #: templates/personal.php:32 msgid "Fill in an email address to enable password recovery" -msgstr "암호 찾기 기능을 사용하려면 전자 우편 주소를 입력하십시오." +msgstr "암호 찾기 기능을 사용하려면 이메일 주소를 입력하십시오." #: templates/personal.php:38 templates/personal.php:39 msgid "Language" @@ -211,7 +211,7 @@ msgid "" "licensed under the AGPL." -msgstr "ownCloud community에 의해서 개발되었습니다. 소스코드AGPL에 따라 사용이 허가됩니다." +msgstr "ownCloud 커뮤니티에 의해서 개발되었습니다. 원본 코드AGPL에 따라 사용이 허가됩니다." #: templates/users.php:21 templates/users.php:76 msgid "Name" @@ -235,7 +235,7 @@ msgstr "기본 할당량" #: templates/users.php:55 templates/users.php:138 msgid "Other" -msgstr "다른" +msgstr "기타" #: templates/users.php:80 templates/users.php:112 msgid "Group Admin" diff --git a/l10n/ko/user_ldap.po b/l10n/ko/user_ldap.po index 06ae4ee838..f9102c199e 100644 --- a/l10n/ko/user_ldap.po +++ b/l10n/ko/user_ldap.po @@ -4,13 +4,14 @@ # # Translators: # 남자사람 , 2012. +# Shinjo Park , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" -"PO-Revision-Date: 2012-12-08 15:51+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 06:10+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "호스트" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "당신은 필요로하는 SSL을 제외하고, 프로토콜을 생략 할 수 있습니다. 다음 시작 주소는 LDAPS://" +msgstr "SSL을 사용하는 경우가 아니라면 프로토콜을 입력하지 않아도 됩니다. SSL을 사용하려면 ldaps://를 입력하십시오." #: templates/settings.php:9 msgid "Base DN" @@ -33,7 +34,7 @@ msgstr "기본 DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "당신은 고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다." +msgstr "고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다." #: templates/settings.php:10 msgid "User DN" @@ -44,15 +45,15 @@ msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "클라이언트 유저의 DN는 결합이 완료되어야 합니다. 예를 들면 uid=agent, dc=example, dc=com. 익명 액세스의 경우, DN와 패스워드는 비워둔채로 남겨두세요." +msgstr "바인딩 작업을 수행할 클라이언트 사용자 DN입니다. 예를 들어서 uid=agent,dc=example,dc=com입니다. 익명 접근을 허용하려면 DN과 암호를 비워 두십시오." #: templates/settings.php:11 msgid "Password" -msgstr "비밀번호" +msgstr "암호" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "익명의 접속을 위해서는 DN과 비밀번호를 빈상태로 두면 됩니다." +msgstr "익명 접근을 허용하려면 DN과 암호를 비워 두십시오." #: templates/settings.php:12 msgid "User Login Filter" @@ -63,12 +64,12 @@ msgstr "사용자 로그인 필터" msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "로그인을 시도 할 때 적용 할 필터를 정의합니다. %%udi는 로그인 작업의 사용자 이름을 대체합니다." +msgstr "로그인을 시도할 때 적용할 필터입니다. %%uid는 로그인 작업에서의 사용자 이름으로 대체됩니다." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "use %%uid placeholder, e.g. \"uid=%%uid\"" +msgstr "%%uid 자리 비움자를 사용하십시오. 예제: \"uid=%%uid\"\"" #: templates/settings.php:13 msgid "User List Filter" @@ -76,11 +77,11 @@ msgstr "사용자 목록 필터" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "사용자를 검색 할 때 적용 할 필터를 정의합니다." +msgstr "사용자를 검색할 때 적용할 필터를 정의합니다." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "플레이스홀더를 이용하지 마세요. 예 \"objectClass=person\"." +msgstr "자리 비움자를 사용할 수 없습니다. 예제: \"objectClass=person\"" #: templates/settings.php:14 msgid "Group Filter" @@ -88,11 +89,11 @@ msgstr "그룹 필터" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "그룹을 검색 할 때 적용 할 필터를 정의합니다." +msgstr "그룹을 검색할 때 적용할 필터를 정의합니다." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "플레이스홀더를 이용하지 마세요. 예 \"objectClass=posixGroup\"." +msgstr "자리 비움자를 사용할 수 없습니다. 예제: \"objectClass=posixGroup\"" #: templates/settings.php:17 msgid "Port" @@ -108,7 +109,7 @@ msgstr "기본 그룹 트리" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "그룹 회원 동료" +msgstr "그룹-회원 연결" #: templates/settings.php:21 msgid "Use TLS" @@ -116,11 +117,11 @@ msgstr "TLS 사용" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "SSL연결을 사용하지 마세요, 그것은 실패할겁니다." +msgstr "SSL 연결 시 사용하는 경우 연결되지 않습니다." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "insensitve LDAP 서버 (Windows)의 경우" +msgstr "서버에서 대소문자를 구분하지 않음 (Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." @@ -130,15 +131,15 @@ msgstr "SSL 인증서 유효성 검사를 해제합니다." msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "연결에만 이 옵션을 사용할 경우 당신의 ownCloud 서버에 LDAP 서버의 SSL 인증서를 가져옵니다." +msgstr "이 옵션을 사용해야 연결할 수 있는 경우에는 LDAP 서버의 SSL 인증서를 ownCloud로 가져올 수 있습니다." #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "추천하지 않음, 테스트로만 사용" +msgstr "추천하지 않음, 테스트로만 사용하십시오." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "사용자 표시 이름 필드" +msgstr "사용자의 표시 이름 필드" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." @@ -146,7 +147,7 @@ msgstr "LDAP 속성은 사용자의 ownCloud 이름을 생성하기 위해 사 #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "그룹 표시 이름 필드" +msgstr "그룹의 표시 이름 필드" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." @@ -158,13 +159,13 @@ msgstr "바이트" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "초. 변경 후에 캐쉬가 클리어 됩니다." +msgstr "초. 항목 변경 시 캐시가 갱신됩니다." #: templates/settings.php:30 msgid "" "Leave empty for user name (default). Otherwise, specify an LDAP/AD " "attribute." -msgstr "사용자 이름(기본값)을 비워 둡니다. 그렇지 않으면 LDAP/AD 특성을 지정합니다." +msgstr "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오." #: templates/settings.php:32 msgid "Help" diff --git a/l10n/ko/user_webdavauth.po b/l10n/ko/user_webdavauth.po index b0ed4619ec..8eb43e9a75 100644 --- a/l10n/ko/user_webdavauth.po +++ b/l10n/ko/user_webdavauth.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 10:07+0000\n" -"Last-Translator: 남자사람 \n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"PO-Revision-Date: 2012-12-09 05:57+0000\n" +"Last-Translator: Shinjo Park \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 0bfb19d926..1d3ffbc346 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 8cd7d9c843..4c3649abd9 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -52,11 +52,11 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "" @@ -64,39 +64,39 @@ msgstr "" msgid "Rename" msgstr "" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr "" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "" @@ -106,80 +106,80 @@ msgid "" "allowed." msgstr "" -#: js/files.js:184 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:219 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:219 +#: js/files.js:209 msgid "Upload Error" msgstr "" -#: js/files.js:236 +#: js/files.js:226 msgid "Close" msgstr "" -#: js/files.js:255 js/files.js:369 js/files.js:399 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "" -#: js/files.js:275 +#: js/files.js:265 msgid "1 file uploading" msgstr "" -#: js/files.js:278 js/files.js:332 js/files.js:347 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "" -#: js/files.js:350 js/files.js:383 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "" -#: js/files.js:452 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "" -#: js/files.js:524 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "" -#: js/files.js:705 +#: js/files.js:693 msgid "{count} files scanned" msgstr "" -#: js/files.js:713 +#: js/files.js:701 msgid "error while scanning" msgstr "" -#: js/files.js:786 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "" -#: js/files.js:787 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "" -#: js/files.js:788 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "" -#: js/files.js:815 +#: js/files.js:803 msgid "1 folder" msgstr "" -#: js/files.js:817 +#: js/files.js:805 msgid "{count} folders" msgstr "" -#: js/files.js:825 +#: js/files.js:813 msgid "1 file" msgstr "" -#: js/files.js:827 +#: js/files.js:815 msgid "{count} files" msgstr "" @@ -239,28 +239,28 @@ msgstr "" msgid "Cancel upload" msgstr "" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "" -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index e4885f5d5a..868042399c 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 0c46550dd7..3424fa328e 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 7ff9b935a8..4b9f7b9f1b 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 752adc4d0c..9feeb5ff2e 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 4512618428..7f3cf2ad93 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 883fd22680..95e54cf29b 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 757f61c791..ac0f4d27ce 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 739342dab6..ff16809f89 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 00:11+0100\n" +"POT-Creation-Date: 2012-12-10 00:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/lib/l10n/ko.php b/lib/l10n/ko.php index 6f32e3b54e..c4716f9f8b 100644 --- a/lib/l10n/ko.php +++ b/lib/l10n/ko.php @@ -1,34 +1,34 @@ "도움말", -"Personal" => "개인의", +"Personal" => "개인", "Settings" => "설정", "Users" => "사용자", -"Apps" => "어플리케이션", +"Apps" => "앱", "Admin" => "관리자", -"ZIP download is turned off." => "ZIP 다운로드가 꺼졌습니다.", -"Files need to be downloaded one by one." => "파일 차례대로 다운로드가 필요합니다.", +"ZIP download is turned off." => "ZIP 다운로드가 비활성화되었습니다.", +"Files need to be downloaded one by one." => "파일을 개별적으로 다운로드해야 합니다.", "Back to Files" => "파일로 돌아가기", -"Selected files too large to generate zip file." => "zip 파일 생성하기 위한 너무 많은 파일들이 선택되었습니다.", -"Application is not enabled" => "응용프로그램이 사용 가능하지 않습니다.", +"Selected files too large to generate zip file." => "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다.", +"Application is not enabled" => "앱이 활성화되지 않았습니다", "Authentication error" => "인증 오류", -"Token expired. Please reload page." => "토큰 만료. 페이지를 새로고침 해주세요.", +"Token expired. Please reload page." => "토큰이 만료되었습니다. 페이지를 새로 고치십시오.", "Files" => "파일", -"Text" => "문자 번호", +"Text" => "텍스트", "Images" => "그림", "seconds ago" => "초 전", "1 minute ago" => "1분 전", -"%d minutes ago" => "%d 분 전", -"1 hour ago" => "1 시간 전", -"%d hours ago" => "%d 시간 전", +"%d minutes ago" => "%d분 전", +"1 hour ago" => "1시간 전", +"%d hours ago" => "%d시간 전", "today" => "오늘", "yesterday" => "어제", -"%d days ago" => "%d 일 전", +"%d days ago" => "%d일 전", "last month" => "지난 달", -"%d months ago" => "%d 달 전", -"last year" => "지난 해", -"years ago" => "작년", -"%s is available. Get more information" => "%s은 가능합니다. 더 자세한 정보는 이곳으로..", +"%d months ago" => "%d개월 전", +"last year" => "작년", +"years ago" => "년 전", +"%s is available. Get more information" => "%s을(를) 사용할 수 있습니다. 자세한 정보 보기", "up to date" => "최신", -"updates check is disabled" => "업데이트 확인이 비활성화 되어있습니다.", -"Could not find category \"%s\"" => "\"%s\" 카테고리를 찾을 수 없습니다." +"updates check is disabled" => "업데이트 확인이 비활성화됨", +"Could not find category \"%s\"" => "분류 \"%s\"을(를) 찾을 수 없습니다." ); diff --git a/settings/l10n/ko.php b/settings/l10n/ko.php index 74e37c647e..7e9ba19a8f 100644 --- a/settings/l10n/ko.php +++ b/settings/l10n/ko.php @@ -1,56 +1,56 @@ "앱 스토어에서 목록을 가져올 수 없습니다", "Group already exists" => "그룹이 이미 존재합니다.", -"Unable to add group" => "그룹추가가 불가능합니다.", -"Could not enable app. " => "응용프로그램 가능하지 않습니다.", -"Email saved" => "이메일 저장", -"Invalid email" => "잘못된 이메일", +"Unable to add group" => "그룹을 추가할 수 없습니다.", +"Could not enable app. " => "앱을 활성화할 수 없습니다.", +"Email saved" => "이메일 저장됨", +"Invalid email" => "잘못된 이메일 주소", "OpenID Changed" => "OpenID 변경됨", "Invalid request" => "잘못된 요청", -"Unable to delete group" => "그룹 삭제가 불가능합니다.", +"Unable to delete group" => "그룹을 삭제할 수 없습니다.", "Authentication error" => "인증 오류", -"Unable to delete user" => "사용자 삭제가 불가능합니다.", +"Unable to delete user" => "사용자를 삭제할 수 없습니다.", "Language changed" => "언어가 변경되었습니다", -"Admins can't remove themself from the admin group" => "관리자는 자신을 관리자 그룹으로부터 삭제할 수 없습니다.", -"Unable to add user to group %s" => "%s 그룹에 사용자 추가가 불가능합니다.", -"Unable to remove user from group %s" => "%s 그룹으로부터 사용자 제거가 불가능합니다.", +"Admins can't remove themself from the admin group" => "관리자 자신을 관리자 그룹에서 삭제할 수 없습니다", +"Unable to add user to group %s" => "그룹 %s에 사용자를 추가할 수 없습니다.", +"Unable to remove user from group %s" => "그룹 %s에서 사용자를 삭제할 수 없습니다.", "Disable" => "비활성화", "Enable" => "활성화", -"Saving..." => "저장...", +"Saving..." => "저장 중...", "__language_name__" => "한국어", "Add your App" => "앱 추가", -"More Apps" => "더많은 응용프로그램들", -"Select an App" => "프로그램 선택", -"See application page at apps.owncloud.com" => "application page at apps.owncloud.com을 보시오.", -"-licensed by " => "-licensed by ", +"More Apps" => "더 많은 앱", +"Select an App" => "앱 선택", +"See application page at apps.owncloud.com" => "apps.owncloud.com에 있는 앱 페이지를 참고하십시오", +"-licensed by " => "-라이선스 보유자 ", "Documentation" => "문서", "Managing Big Files" => "큰 파일 관리", "Ask a question" => "질문하기", "Problems connecting to help database." => "데이터베이스에 연결하는 데 문제가 발생하였습니다.", "Go there manually." => "직접 갈 수 있습니다.", "Answer" => "대답", -"You have used %s of the available %s" => "You have used %s of the available %s", -"Desktop and Mobile Syncing Clients" => "데스크탑 및 모바일 동기화 클라이언트", +"You have used %s of the available %s" => "현재 공간 %s/%s을(를) 사용 중입니다", +"Desktop and Mobile Syncing Clients" => "데스크톱 및 모바일 동기화 클라이언트", "Download" => "다운로드", -"Your password was changed" => "당신의 비밀번호가 변경되었습니다.", +"Your password was changed" => "암호가 변경되었습니다", "Unable to change your password" => "암호를 변경할 수 없음", "Current password" => "현재 암호", "New password" => "새 암호", "show" => "보이기", "Change password" => "암호 변경", -"Email" => "전자 우편", -"Your email address" => "전자 우편 주소", -"Fill in an email address to enable password recovery" => "암호 찾기 기능을 사용하려면 전자 우편 주소를 입력하십시오.", +"Email" => "이메일", +"Your email address" => "이메일 주소", +"Fill in an email address to enable password recovery" => "암호 찾기 기능을 사용하려면 이메일 주소를 입력하십시오.", "Language" => "언어", "Help translate" => "번역 돕기", "use this address to connect to your ownCloud in your file manager" => "파일 관리자에서 내 ownCloud에 연결할 때 이 주소를 사용하십시오", -"Developed by the ownCloud community, the source code is licensed under the AGPL." => "ownCloud community에 의해서 개발되었습니다. 소스코드AGPL에 따라 사용이 허가됩니다.", +"Developed by the ownCloud community, the source code is licensed under the AGPL." => "ownCloud 커뮤니티에 의해서 개발되었습니다. 원본 코드AGPL에 따라 사용이 허가됩니다.", "Name" => "이름", "Password" => "암호", "Groups" => "그룹", "Create" => "만들기", "Default Quota" => "기본 할당량", -"Other" => "다른", +"Other" => "기타", "Group Admin" => "그룹 관리자", "Quota" => "할당량", "Delete" => "삭제" From cb6c4303217dcd2352af8cfab01c72daeef45f25 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 10 Dec 2012 15:08:58 +0100 Subject: [PATCH 452/481] add my install changes from #721 again after they have been reverted through #282 --- core/css/styles.css | 65 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index b61f26caf6..be05d76ece 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -62,6 +62,23 @@ input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:# #quota { cursor:default; } +/* PRIMARY ACTION BUTTON, use sparingly */ +.primary, input[type="submit"].primary, input[type="button"].primary, button.primary, .button.primary { + border:1px solid #1d2d44; + background:#35537a; color:#ddd; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; box-shadow:0 0 1px #000,0 1px 1px #6d7d94 inset; +} + .primary:hover, input[type="submit"].primary:hover, input[type="button"].primary:hover, button.primary:hover, .button.primary:hover, + .primary:focus, input[type="submit"].primary:focus, input[type="button"].primary:focus, button.primary:focus, .button.primary:focus { + border:1px solid #1d2d44; + background:#2d3d54; color:#fff; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; -webkit-box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; box-shadow:0 0 1px #000,0 1px 1px #5d6d84 inset; + } + .primary:active, input[type="submit"].primary:active, input[type="button"].primary:active, button.primary:active, .button.primary:active { + border:1px solid #1d2d44; + background:#1d2d42; color:#bbb; text-shadow:#000 0 -1px 0; + -moz-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; -webkit-box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; box-shadow:0 1px 1px #fff,0 1px 1px 0 rgba(0,0,0,.2) inset; + } #body-login input { font-size:1.5em; } @@ -92,23 +109,57 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b #login { min-height:30em; margin:2em auto 0; border-bottom:1px solid #f8f8f8; background:#eee; } #login form { width:22em; margin:2em auto 2em; padding:0; } -#login form fieldset { background:0; border:0; margin-bottom:2em; padding:0; } -#login form fieldset legend { font-weight:bold; } +#login form fieldset { margin-bottom:20px; } +#login form #adminaccount { margin-bottom:5px; } +#login form fieldset legend, #datadirContent label { + width:100%; text-align:center; + font-weight:bold; color:#999; text-shadow:0 1px 0 white; +} +#login form fieldset legend a { color:#999; } +#login #datadirContent label { display:block; margin:0; color:#999; } +#login form #datadirField legend { margin-bottom:15px; } + +/* Nicely grouping input field sets */ +.grouptop input { + margin-bottom:0; + border-bottom:0; border-bottom-left-radius:0; border-bottom-right-radius:0; +} +.groupmiddle input { + margin-top:0; margin-bottom:0; + border-top:0; border-radius:0; + box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; +} +.groupbottom input { + margin-top:0; + border-top:0; border-top-right-radius:0; border-top-left-radius:0; + box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; +} #login form label { margin:.95em 0 0 .85em; color:#666; } +#login .groupmiddle label, #login .groupbottom label { margin-top:13px; } /* NEEDED FOR INFIELD LABELS */ p.infield { position:relative; } label.infield { cursor:text !important; } -#login form label.infield { position:absolute; font-size:1.5em; color:#AAA; } +#login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } #login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } #login form #selectDbType { text-align:center; } -#login form #selectDbType label { position:static; font-size:1em; margin:0 -.3em 1em; cursor:pointer; padding:.4em; border:1px solid #ddd; font-weight:bold; background:#f8f8f8; color:#555; text-shadow:#eee 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; } -#login form #selectDbType label span { cursor:pointer; font-size:0.9em; } -#login form #selectDbType label.ui-state-hover span, #login form #selectDbType label.ui-state-active span { color:#000; } -#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#333; background-color:#ccc; } +#login form #selectDbType label { + position:static; margin:0 -3px 5px; padding:.4em; + font-size:12px; font-weight:bold; background:#f8f8f8; color:#888; cursor:pointer; + border:1px solid #ddd; text-shadow:#eee 0 1px 0; + -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; +} +#login form #selectDbType label.ui-state-hover, #login form #selectDbType label.ui-state-active { color:#000; background-color:#e8e8e8; } + +fieldset.warning { + padding:8px; + color:#b94a48; background-color:#f2dede; border:1px solid #eed3d7; + border-radius:5px; +} +fieldset.warning legend { color:#b94a48 !important; } /* NAVIGATION ------------------------------------------------------------- */ From 45074d5023d408f4f81bc45380ce68b1008f9414 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Mon, 10 Dec 2012 18:41:08 +0100 Subject: [PATCH 453/481] restoring feature to send sharing link via email --- apps/files_sharing/ajax/email.php | 39 +++++++++++++++++++++++++++++++ apps/files_sharing/js/share.js | 24 ++++++++++++++++++- core/css/share.css | 14 +++++++---- core/js/share.js | 12 ++++++++-- 4 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 apps/files_sharing/ajax/email.php diff --git a/apps/files_sharing/ajax/email.php b/apps/files_sharing/ajax/email.php new file mode 100644 index 0000000000..4ed4eef723 --- /dev/null +++ b/apps/files_sharing/ajax/email.php @@ -0,0 +1,39 @@ +t('User %s shared a file with you', $user); +if ($type === 'dir') + $subject = (string)$l->t('User %s shared a folder with you', $user); + +$text = (string)$l->t('User %s shared the file "%s" with you. It is available for download here: %s', array($user, $file, $link)); +if ($type === 'dir') + $text = (string)$l->t('User %s shared the folder "%s" with you. It is available for download here: %s', array($user, $file, $link)); + +// handle localhost installations +$server_host = OCP\Util::getServerHost(); +if ($server_host === 'localhost') + $server_host = "example.com"; + +$default_from = 'sharing-noreply@' . $server_host; +$from_address = OCP\Config::getUserValue($user, 'settings', 'email', $default_from ); + +// send it out now +try { + OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $user); + OCP\JSON::success(); +} catch (Exception $exception) { + OCP\JSON::error(array('data' => array('message' => $exception->getMessage()))); +} diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 7eb086712f..a83252867a 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -33,6 +33,28 @@ $(document).ready(function() { }); OC.Share.loadIcons('file'); } - + + $('#emailPrivateLink').live('submit', function(event) { + event.preventDefault(); + var link = $('#linkText').val(); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + + var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + var email = $('#email').val(); + if (email != '') { + $.post(OC.filePath('files_sharing', 'ajax', 'email.php'), { toaddress: email, link: link, type: itemType, file: file }, function(result) { + if (result && result.status == 'success') { + $('#email').css('font-weight', 'bold'); + $('#email').animate({ fontWeight: 'normal' }, 2000, function() { + $(this).val(''); + }).val('Email sent'); + } else { + OC.dialogs.alert(result.data.message, 'Error while sharing'); + } + }); + } + }); + }); \ No newline at end of file diff --git a/core/css/share.css b/core/css/share.css index 5aca731356..e806d25982 100644 --- a/core/css/share.css +++ b/core/css/share.css @@ -50,11 +50,17 @@ padding-top:.5em; } - #dropdown input[type="text"],#dropdown input[type="password"] { - width:90%; - } +#dropdown input[type="text"],#dropdown input[type="password"] { + width:90%; +} - #linkText,#linkPass,#expiration { +#dropdown form { + font-size: 100%; + margin-left: 0; + margin-right: 0; +} + +#linkText,#linkPass,#expiration { display:none; } diff --git a/core/js/share.js b/core/js/share.js index 475abb58bf..962983e2f3 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -168,6 +168,10 @@ OC.Share={ html += ''; html += '
    '; html += '
    '; + html += ''; } html += '
    '; html += ''; @@ -349,13 +353,17 @@ OC.Share={ $('#linkPassText').attr('placeholder', t('core', 'Password protected')); } $('#expiration').show(); + $('#emailPrivateLink #email').show(); + $('#emailPrivateLink #emailButton').show(); }, hideLink:function() { $('#linkText').hide('blind'); $('#showPassword').hide(); $('#linkPass').hide(); - }, - dirname:function(path) { + $('#emailPrivateLink #email').hide(); + $('#emailPrivateLink #emailButton').hide(); + }, + dirname:function(path) { return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); }, showExpirationDate:function(date) { From f3bd6d14eee95fa81337410c429f1f83552fd766 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Mon, 10 Dec 2012 21:10:28 +0100 Subject: [PATCH 454/481] add some output why some of the external filesystems might not work --- apps/files_external/lib/config.php | 31 ++++++++++++++++++++++ apps/files_external/personal.php | 1 + apps/files_external/settings.php | 1 + apps/files_external/templates/settings.php | 3 ++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 87d6886c51..fb61689db8 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -394,4 +394,35 @@ class OC_Mount_Config { return true; } + /** + * check if smbclient is installed + */ + public static function checksmbclient() { + $output=shell_exec('which smbclient'); + return (empty($output)?false:true); + } + + /** + * check if php-ftp is installed + */ + public static function checkphpftp() { + if(function_exists('ftp_login')) { + return(true); + }else{ + return(false); + } + } + + /** + * check dependencies + */ + public static function checkDependencies() { + $l= new OC_L10N; + $txt=''; + + if(!OC_Mount_Config::checksmbclient()) $txt.=$l->t('Warning: "smbclient" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.').'
    '; + if(!OC_Mount_Config::checkphpftp()) $txt.=$l->t('Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.').'
    '; + + return($txt); + } } diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php index f0d76460f5..509c297762 100755 --- a/apps/files_external/personal.php +++ b/apps/files_external/personal.php @@ -29,5 +29,6 @@ $tmpl = new OCP\Template('files_external', 'settings'); $tmpl->assign('isAdminPage', false, false); $tmpl->assign('mounts', OC_Mount_Config::getPersonalMountPoints()); $tmpl->assign('certs', OC_Mount_Config::getCertificates()); +$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies(),false); $tmpl->assign('backends', $backends); return $tmpl->fetchPage(); diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php index d2be21b711..94222149a3 100644 --- a/apps/files_external/settings.php +++ b/apps/files_external/settings.php @@ -30,5 +30,6 @@ $tmpl->assign('mounts', OC_Mount_Config::getSystemMountPoints()); $tmpl->assign('backends', OC_Mount_Config::getBackends()); $tmpl->assign('groups', OC_Group::getGroups()); $tmpl->assign('users', OCP\User::getUsers()); +$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies(),false); $tmpl->assign('allowUserMounting', OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes')); return $tmpl->fetchPage(); diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index 5b954eeb50..50f4a16a5a 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -1,6 +1,7 @@
    t('External Storage'); ?> + '')) echo ''.$_['dependencies'].''; ?> '> @@ -157,4 +158,4 @@ - \ No newline at end of file + From ca7882a7c681045106146f9b8f6d9c61585a463d Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Mon, 10 Dec 2012 21:44:43 +0100 Subject: [PATCH 455/481] disable not available external filesystems. Restructure the configuration a bit and improve naming --- apps/files_external/lib/config.php | 125 +++++++++++++++-------------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index fb61689db8..afd28288b2 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -38,66 +38,74 @@ class OC_Mount_Config { * @return array */ public static function getBackends() { - return array( - 'OC_Filestorage_Local' => array( + + $backends['OC_Filestorage_Local']=array( 'backend' => 'Local', 'configuration' => array( - 'datadir' => 'Location')), - 'OC_Filestorage_AmazonS3' => array( - 'backend' => 'Amazon S3', - 'configuration' => array( - 'key' => 'Key', - 'secret' => '*Secret', - 'bucket' => 'Bucket')), - 'OC_Filestorage_Dropbox' => array( - 'backend' => 'Dropbox', - 'configuration' => array( - 'configured' => '#configured', - 'app_key' => 'App key', - 'app_secret' => 'App secret', - 'token' => '#token', - 'token_secret' => '#token_secret'), - 'custom' => 'dropbox'), - 'OC_Filestorage_FTP' => array( - 'backend' => 'FTP', - 'configuration' => array( - 'host' => 'URL', - 'user' => 'Username', - 'password' => '*Password', - 'root' => '&Root', - 'secure' => '!Secure ftps://')), - 'OC_Filestorage_Google' => array( - 'backend' => 'Google Drive', - 'configuration' => array( - 'configured' => '#configured', - 'token' => '#token', - 'token_secret' => '#token secret'), - 'custom' => 'google'), - 'OC_Filestorage_SWIFT' => array( - 'backend' => 'OpenStack Swift', - 'configuration' => array( - 'host' => 'URL', - 'user' => 'Username', - 'token' => '*Token', - 'root' => '&Root', - 'secure' => '!Secure ftps://')), - 'OC_Filestorage_SMB' => array( - 'backend' => 'SMB', - 'configuration' => array( - 'host' => 'URL', - 'user' => 'Username', - 'password' => '*Password', - 'share' => 'Share', - 'root' => '&Root')), - 'OC_Filestorage_DAV' => array( - 'backend' => 'WebDAV', - 'configuration' => array( - 'host' => 'URL', - 'user' => 'Username', - 'password' => '*Password', - 'root' => '&Root', - 'secure' => '!Secure https://')) - ); + 'datadir' => 'Location')); + + $backends['OC_Filestorage_AmazonS3']=array( + 'backend' => 'Amazon S3', + 'configuration' => array( + 'key' => 'Key', + 'secret' => '*Secret', + 'bucket' => 'Bucket')); + + $backends['OC_Filestorage_Dropbox']=array( + 'backend' => 'Dropbox', + 'configuration' => array( + 'configured' => '#configured', + 'app_key' => 'App key', + 'app_secret' => 'App secret', + 'token' => '#token', + 'token_secret' => '#token_secret'), + 'custom' => 'dropbox'); + + if(OC_Mount_Config::checkphpftp()) $backends['OC_Filestorage_FTP']=array( + 'backend' => 'FTP', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Root', + 'secure' => '!Secure ftps://')); + + $backends['OC_Filestorage_Google']=array( + 'backend' => 'Google Drive', + 'configuration' => array( + 'configured' => '#configured', + 'token' => '#token', + 'token_secret' => '#token secret'), + 'custom' => 'google'); + + $backends['OC_Filestorage_SWIFT']=array( + 'backend' => 'OpenStack Swift', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'token' => '*Token', + 'root' => '&Root', + 'secure' => '!Secure ftps://')); + + if(OC_Mount_Config::checksmbclient()) $backends['OC_Filestorage_SMB']=array( + 'backend' => 'SMB / CIFS', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'share' => 'Share', + 'root' => '&Root')); + + $backends['OC_Filestorage_DAV']=array( + 'backend' => 'ownCloud / WebDAV', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Root', + 'secure' => '!Secure https://')); + + return($backends); } /** @@ -419,7 +427,6 @@ class OC_Mount_Config { public static function checkDependencies() { $l= new OC_L10N; $txt=''; - if(!OC_Mount_Config::checksmbclient()) $txt.=$l->t('Warning: "smbclient" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.').'
    '; if(!OC_Mount_Config::checkphpftp()) $txt.=$l->t('Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.').'
    '; From 162a2c0fba6f7d7be3aa2372554e4a77a70a3e00 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Mon, 10 Dec 2012 23:22:42 +0100 Subject: [PATCH 456/481] moving sharing email code to core --- apps/files_sharing/ajax/email.php | 39 ------------------------------- apps/files_sharing/js/share.js | 26 +-------------------- core/ajax/share.php | 36 ++++++++++++++++++++++++++++ core/js/share.js | 23 ++++++++++++++++++ 4 files changed, 60 insertions(+), 64 deletions(-) delete mode 100644 apps/files_sharing/ajax/email.php diff --git a/apps/files_sharing/ajax/email.php b/apps/files_sharing/ajax/email.php deleted file mode 100644 index 4ed4eef723..0000000000 --- a/apps/files_sharing/ajax/email.php +++ /dev/null @@ -1,39 +0,0 @@ -t('User %s shared a file with you', $user); -if ($type === 'dir') - $subject = (string)$l->t('User %s shared a folder with you', $user); - -$text = (string)$l->t('User %s shared the file "%s" with you. It is available for download here: %s', array($user, $file, $link)); -if ($type === 'dir') - $text = (string)$l->t('User %s shared the folder "%s" with you. It is available for download here: %s', array($user, $file, $link)); - -// handle localhost installations -$server_host = OCP\Util::getServerHost(); -if ($server_host === 'localhost') - $server_host = "example.com"; - -$default_from = 'sharing-noreply@' . $server_host; -$from_address = OCP\Config::getUserValue($user, 'settings', 'email', $default_from ); - -// send it out now -try { - OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $user); - OCP\JSON::success(); -} catch (Exception $exception) { - OCP\JSON::error(array('data' => array('message' => $exception->getMessage()))); -} diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index a83252867a..8a546d6216 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -33,28 +33,4 @@ $(document).ready(function() { }); OC.Share.loadIcons('file'); } - - $('#emailPrivateLink').live('submit', function(event) { - event.preventDefault(); - var link = $('#linkText').val(); - var itemType = $('#dropdown').data('item-type'); - var itemSource = $('#dropdown').data('item-source'); - - var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); - var email = $('#email').val(); - if (email != '') { - $.post(OC.filePath('files_sharing', 'ajax', 'email.php'), { toaddress: email, link: link, type: itemType, file: file }, function(result) { - if (result && result.status == 'success') { - $('#email').css('font-weight', 'bold'); - $('#email').animate({ fontWeight: 'normal' }, 2000, function() { - $(this).val(''); - }).val('Email sent'); - } else { - OC.dialogs.alert(result.data.message, 'Error while sharing'); - } - }); - } - }); - - -}); \ No newline at end of file +}); diff --git a/core/ajax/share.php b/core/ajax/share.php index 41832a3c65..12206e0fd7 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -69,6 +69,42 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo ($return) ? OC_JSON::success() : OC_JSON::error(); } break; + case 'email': + // read post variables + $user = OCP\USER::getUser(); + $type = $_POST['itemType']; + $link = $_POST['link']; + $file = $_POST['file']; + $to_address = $_POST['toaddress']; + + // enable l10n support + $l = OC_L10N::get('core'); + + // setup the email + $subject = (string)$l->t('User %s shared a file with you', $user); + if ($type === 'dir') + $subject = (string)$l->t('User %s shared a folder with you', $user); + + $text = (string)$l->t('User %s shared the file "%s" with you. It is available for download here: %s', array($user, $file, $link)); + if ($type === 'dir') + $text = (string)$l->t('User %s shared the folder "%s" with you. It is available for download here: %s', array($user, $file, $link)); + + // handle localhost installations + $server_host = OCP\Util::getServerHost(); + if ($server_host === 'localhost') + $server_host = "example.com"; + + $default_from = 'sharing-noreply@' . $server_host; + $from_address = OCP\Config::getUserValue($user, 'settings', 'email', $default_from ); + + // send it out now + try { + OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $user); + OCP\JSON::success(); + } catch (Exception $exception) { + OCP\JSON::error(array('data' => array('message' => $exception->getMessage()))); + } + break; } } else if (isset($_GET['fetch'])) { switch ($_GET['fetch']) { diff --git a/core/js/share.js b/core/js/share.js index 962983e2f3..9f71f1bb66 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -555,4 +555,27 @@ $(document).ready(function() { }); }); + + $('#emailPrivateLink').live('submit', function(event) { + event.preventDefault(); + var link = $('#linkText').val(); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + var email = $('#email').val(); + if (email != '') { + $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'email', toaddress: email, link: link, itemType: itemType, itemSource: itemSource, file: file}, function(result) { + if (result && result.status == 'success') { + $('#email').css('font-weight', 'bold'); + $('#email').animate({ fontWeight: 'normal' }, 2000, function() { + $(this).val(''); + }).val(t('core','Email sent')); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Error while sharing')); + } + }); + } + }); + + }); From f7f462f2733117cc2e3be0421e7ebca85bac1562 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 11 Dec 2012 00:04:40 +0100 Subject: [PATCH 457/481] [tx-robot] updated from transifex --- apps/files/l10n/es_AR.php | 2 + l10n/de/lib.po | 18 +++---- l10n/de_DE/lib.po | 18 +++---- l10n/es_AR/files.po | 83 +++++++++++++++-------------- l10n/es_AR/settings.po | 11 ++-- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- lib/l10n/de.php | 2 +- lib/l10n/de_DE.php | 2 +- settings/l10n/es_AR.php | 3 +- 18 files changed, 82 insertions(+), 77 deletions(-) diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php index 5c7ca37387..e514d8de59 100644 --- a/apps/files/l10n/es_AR.php +++ b/apps/files/l10n/es_AR.php @@ -1,5 +1,6 @@ "No se han producido errores, el archivo se ha subido con éxito", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "El archivo que intentás subir excede el tamaño definido por upload_max_filesize en el php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo que intentás subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML", "The uploaded file was only partially uploaded" => "El archivo que intentás subir solo se subió parcialmente", "No file was uploaded" => "El archivo no fue subido", @@ -18,6 +19,7 @@ "replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}", "unshared {files}" => "{files} se dejaron de compartir", "deleted {files}" => "{files} borrados", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos.", "generating ZIP-file, it may take some time." => "generando un archivo ZIP, puede llevar un tiempo.", "Unable to upload your file as it is a directory or has 0 bytes" => "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes", "Upload Error" => "Error al subir el archivo", diff --git a/l10n/de/lib.po b/l10n/de/lib.po index 8671e9349b..b09a71c057 100644 --- a/l10n/de/lib.po +++ b/l10n/de/lib.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 09:35+0000\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"PO-Revision-Date: 2012-12-10 13:50+0000\n" "Last-Translator: Mirodin \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" @@ -24,27 +24,27 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app.php:285 +#: app.php:287 msgid "Help" msgstr "Hilfe" -#: app.php:292 +#: app.php:294 msgid "Personal" msgstr "Persönlich" -#: app.php:297 +#: app.php:299 msgid "Settings" msgstr "Einstellungen" -#: app.php:302 +#: app.php:304 msgid "Users" msgstr "Benutzer" -#: app.php:309 +#: app.php:311 msgid "Apps" msgstr "Apps" -#: app.php:311 +#: app.php:313 msgid "Admin" msgstr "Administrator" @@ -138,7 +138,7 @@ msgstr "Letztes Jahr" #: template.php:114 msgid "years ago" -msgstr "Vor wenigen Jahren" +msgstr "Vor Jahren" #: updater.php:75 #, php-format diff --git a/l10n/de_DE/lib.po b/l10n/de_DE/lib.po index 66fe1bc1e0..3c9177f17e 100644 --- a/l10n/de_DE/lib.po +++ b/l10n/de_DE/lib.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 09:34+0000\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"PO-Revision-Date: 2012-12-10 13:49+0000\n" "Last-Translator: Mirodin \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" @@ -24,27 +24,27 @@ msgstr "" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app.php:285 +#: app.php:287 msgid "Help" msgstr "Hilfe" -#: app.php:292 +#: app.php:294 msgid "Personal" msgstr "Persönlich" -#: app.php:297 +#: app.php:299 msgid "Settings" msgstr "Einstellungen" -#: app.php:302 +#: app.php:304 msgid "Users" msgstr "Benutzer" -#: app.php:309 +#: app.php:311 msgid "Apps" msgstr "Apps" -#: app.php:311 +#: app.php:313 msgid "Admin" msgstr "Administrator" @@ -138,7 +138,7 @@ msgstr "Letztes Jahr" #: template.php:114 msgid "years ago" -msgstr "Vor wenigen Jahren" +msgstr "Vor Jahren" #: updater.php:75 #, php-format diff --git a/l10n/es_AR/files.po b/l10n/es_AR/files.po index 90dafb22af..551f3b477b 100644 --- a/l10n/es_AR/files.po +++ b/l10n/es_AR/files.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Agustin Ferrario , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"PO-Revision-Date: 2012-12-10 00:37+0000\n" +"Last-Translator: Agustin Ferrario \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "No se han producido errores, el archivo se ha subido con éxito" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "El archivo que intentás subir excede el tamaño definido por upload_max_filesize en el php.ini:" #: ajax/upload.php:23 msgid "" @@ -53,11 +54,11 @@ msgstr "Error al escribir en el disco" msgid "Files" msgstr "Archivos" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "Dejar de compartir" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "Borrar" @@ -65,39 +66,39 @@ msgstr "Borrar" msgid "Rename" msgstr "Cambiar nombre" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "{new_name} ya existe" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "reemplazar" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "sugerir nombre" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "cancelar" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "reemplazado {new_name}" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "deshacer" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr "reemplazado {new_name} con {old_name}" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "{files} se dejaron de compartir" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "{files} borrados" @@ -105,82 +106,82 @@ msgstr "{files} borrados" msgid "" "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " "allowed." -msgstr "" +msgstr "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos." -#: js/files.js:183 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "generando un archivo ZIP, puede llevar un tiempo." -#: js/files.js:218 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes" -#: js/files.js:218 +#: js/files.js:209 msgid "Upload Error" msgstr "Error al subir el archivo" -#: js/files.js:235 +#: js/files.js:226 msgid "Close" msgstr "Cerrar" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "Pendiente" -#: js/files.js:274 +#: js/files.js:265 msgid "1 file uploading" msgstr "Subiendo 1 archivo" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "Subiendo {count} archivos" -#: js/files.js:349 js/files.js:382 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "La subida fue cancelada" -#: js/files.js:451 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará." -#: js/files.js:523 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Nombre del directorio inválido. Usar \"Shared\" está reservado por ownCloud." -#: js/files.js:704 +#: js/files.js:693 msgid "{count} files scanned" msgstr "{count} archivos escaneados" -#: js/files.js:712 +#: js/files.js:701 msgid "error while scanning" msgstr "error mientras se escaneaba" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "Nombre" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "Tamaño" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "Modificado" -#: js/files.js:814 +#: js/files.js:803 msgid "1 folder" msgstr "1 directorio" -#: js/files.js:816 +#: js/files.js:805 msgid "{count} folders" msgstr "{count} directorios" -#: js/files.js:824 +#: js/files.js:813 msgid "1 file" msgstr "1 archivo" -#: js/files.js:826 +#: js/files.js:815 msgid "{count} files" msgstr "{count} archivos" @@ -240,28 +241,28 @@ msgstr "Subir" msgid "Cancel upload" msgstr "Cancelar subida" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "No hay nada. ¡Subí contenido!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "Descargar" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "El archivo es demasiado grande" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Los archivos que intentás subir sobrepasan el tamaño máximo " -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "Se están escaneando los archivos, por favor esperá." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "Escaneo actual" diff --git a/l10n/es_AR/settings.po b/l10n/es_AR/settings.po index b52e9fbc91..89e8050adf 100644 --- a/l10n/es_AR/settings.po +++ b/l10n/es_AR/settings.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Agustin Ferrario , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"PO-Revision-Date: 2012-12-10 00:39+0000\n" +"Last-Translator: Agustin Ferrario \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,7 +69,7 @@ msgstr "Idioma cambiado" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Los administradores no se pueden quitar a ellos mismos del grupo administrador. " #: ajax/togglegroups.php:28 #, php-format @@ -237,7 +238,7 @@ msgstr "Otro" #: templates/users.php:80 templates/users.php:112 msgid "Group Admin" -msgstr "Grupo admin" +msgstr "Grupo Administrador" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 1d3ffbc346..de757f20d6 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 4c3649abd9..29aabae972 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 868042399c..ee157c5a09 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 3424fa328e..f9145fda2f 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 4b9f7b9f1b..740462f8b7 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 9feeb5ff2e..4101d9e9bc 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 7f3cf2ad93..e4ba32312d 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 95e54cf29b..811ce5e2c5 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index ac0f4d27ce..ee7912484b 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index ff16809f89..61c2d797f4 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" +"POT-Creation-Date: 2012-12-11 00:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/lib/l10n/de.php b/lib/l10n/de.php index 7724d8c684..4b77bf7210 100644 --- a/lib/l10n/de.php +++ b/lib/l10n/de.php @@ -26,7 +26,7 @@ "last month" => "Letzten Monat", "%d months ago" => "Vor %d Monaten", "last year" => "Letztes Jahr", -"years ago" => "Vor wenigen Jahren", +"years ago" => "Vor Jahren", "%s is available. Get more information" => "%s ist verfügbar. Weitere Informationen", "up to date" => "aktuell", "updates check is disabled" => "Die Update-Überprüfung ist ausgeschaltet", diff --git a/lib/l10n/de_DE.php b/lib/l10n/de_DE.php index 95596a7a33..e9f0f34a0e 100644 --- a/lib/l10n/de_DE.php +++ b/lib/l10n/de_DE.php @@ -26,7 +26,7 @@ "last month" => "Letzten Monat", "%d months ago" => "Vor %d Monaten", "last year" => "Letztes Jahr", -"years ago" => "Vor wenigen Jahren", +"years ago" => "Vor Jahren", "%s is available. Get more information" => "%s ist verfügbar. Weitere Informationen", "up to date" => "aktuell", "updates check is disabled" => "Die Update-Überprüfung ist ausgeschaltet", diff --git a/settings/l10n/es_AR.php b/settings/l10n/es_AR.php index 653dfbc215..ebbce841a8 100644 --- a/settings/l10n/es_AR.php +++ b/settings/l10n/es_AR.php @@ -11,6 +11,7 @@ "Authentication error" => "Error al autenticar", "Unable to delete user" => "No fue posible eliminar el usuario", "Language changed" => "Idioma cambiado", +"Admins can't remove themself from the admin group" => "Los administradores no se pueden quitar a ellos mismos del grupo administrador. ", "Unable to add user to group %s" => "No fue posible añadir el usuario al grupo %s", "Unable to remove user from group %s" => "No es posible eliminar al usuario del grupo %s", "Disable" => "Desactivar", @@ -50,7 +51,7 @@ "Create" => "Crear", "Default Quota" => "Cuota predeterminada", "Other" => "Otro", -"Group Admin" => "Grupo admin", +"Group Admin" => "Grupo Administrador", "Quota" => "Cuota", "Delete" => "Borrar" ); From b72a0f5680e4b60d3daae9185274346909590c4d Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 11 Dec 2012 13:02:45 +0100 Subject: [PATCH 458/481] remove obsolete CSS, fix database host label position --- core/css/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/core/css/styles.css b/core/css/styles.css index be05d76ece..d5b0a348ee 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -141,7 +141,6 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b p.infield { position:relative; } label.infield { cursor:text !important; } #login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } -#login #dbhostlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -8em; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } From e55a3637ce867d84c6de8bffe9898d8444bee212 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Tue, 11 Dec 2012 13:20:20 +0100 Subject: [PATCH 459/481] don't call shell_exec if safe_mode is on. --- apps/files_external/lib/config.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index afd28288b2..e37b610000 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -406,8 +406,12 @@ class OC_Mount_Config { * check if smbclient is installed */ public static function checksmbclient() { - $output=shell_exec('which smbclient'); - return (empty($output)?false:true); + if(function_exists('shell_exec')) { + $output=shell_exec('which smbclient'); + return (empty($output)?false:true); + }else{ + return(false); + } } /** From e427197dce2e8e43000e806ca4b13bfbb841436a Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Tue, 11 Dec 2012 14:07:01 +0100 Subject: [PATCH 460/481] ctor of OC_L10N requires the app name --- apps/files_external/lib/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index e37b610000..c0864dc50d 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -429,7 +429,7 @@ class OC_Mount_Config { * check dependencies */ public static function checkDependencies() { - $l= new OC_L10N; + $l= new OC_L10N('files_external'); $txt=''; if(!OC_Mount_Config::checksmbclient()) $txt.=$l->t('Warning: "smbclient" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.').'
    '; if(!OC_Mount_Config::checkphpftp()) $txt.=$l->t('Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.').'
    '; From 8126b09bfe28a2af07d38aa907dc574c6819ecfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 11 Dec 2012 14:56:04 +0100 Subject: [PATCH 461/481] add debug logging for user backend registration --- lib/user.php | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/user.php b/lib/user.php index 31c93740d7..94ea899b84 100644 --- a/lib/user.php +++ b/lib/user.php @@ -86,8 +86,9 @@ class OC_User { */ public static function useBackend( $backend = 'database' ) { if($backend instanceof OC_User_Interface) { + OC_Log::write('core', 'Adding user backend instance of '.get_class($backend).'.', OC_Log::DEBUG); self::$_usedBackends[get_class($backend)]=$backend; - }else{ + } else { // You'll never know what happens if( null === $backend OR !is_string( $backend )) { $backend = 'database'; @@ -98,15 +99,17 @@ class OC_User { case 'database': case 'mysql': case 'sqlite': + OC_Log::write('core', 'Adding user backend '.$backend.'.', OC_Log::DEBUG); self::$_usedBackends[$backend] = new OC_User_Database(); break; default: + OC_Log::write('core', 'Adding default user backend '.$backend.'.', OC_Log::DEBUG); $className = 'OC_USER_' . strToUpper($backend); self::$_usedBackends[$backend] = new $className(); break; } } - true; + return true; } /** @@ -124,15 +127,19 @@ class OC_User { foreach($backends as $i=>$config) { $class=$config['class']; $arguments=$config['arguments']; - if(class_exists($class) and array_search($i, self::$_setupedBackends)===false) { - // make a reflection object - $reflectionObj = new ReflectionClass($class); + if(class_exists($class)) { + if(array_search($i, self::$_setupedBackends)===false) { + // make a reflection object + $reflectionObj = new ReflectionClass($class); - // use Reflection to create a new instance, using the $args - $backend = $reflectionObj->newInstanceArgs($arguments); - self::useBackend($backend); - $_setupedBackends[]=$i; - }else{ + // use Reflection to create a new instance, using the $args + $backend = $reflectionObj->newInstanceArgs($arguments); + self::useBackend($backend); + $_setupedBackends[]=$i; + } else { + OC_Log::write('core', 'User backend '.$class.' already initialized.', OC_Log::DEBUG); + } + } else { OC_Log::write('core', 'User backend '.$class.' not found.', OC_Log::ERROR); } } From af12b0f5da25d2c01bf57ef1af882b92c77f934e Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 11 Dec 2012 16:00:48 +0100 Subject: [PATCH 462/481] Autoload classes with 'OC' namespace prefix. --- lib/base.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/base.php b/lib/base.php index bde65dcc7d..8862845261 100644 --- a/lib/base.php +++ b/lib/base.php @@ -90,6 +90,9 @@ class OC{ elseif(strpos($className, 'OC_')===0) { $path = strtolower(str_replace('_', '/', substr($className, 3)) . '.php'); } + elseif(strpos($className, 'OC\\')===0) { + $path = strtolower(str_replace('\\', '/', substr($className, 3)) . '.php'); + } elseif(strpos($className, 'OCP\\')===0) { $path = 'public/'.strtolower(str_replace('\\', '/', substr($className, 3)) . '.php'); } From 8ed0ce7801985d6d7e07af8eb21de480a4422f2c Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Tue, 11 Dec 2012 17:42:09 +0100 Subject: [PATCH 463/481] [contacts_api] IAddressBook moved to OCP as it's used by apps to provide access to their contact data --- lib/public/contacts.php | 10 +++++----- lib/{ => public}/iaddressbook.php | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) rename lib/{ => public}/iaddressbook.php (93%) diff --git a/lib/public/contacts.php b/lib/public/contacts.php index ab46614c8f..4cf57ed8ff 100644 --- a/lib/public/contacts.php +++ b/lib/public/contacts.php @@ -146,16 +146,16 @@ namespace OCP { } /** - * @param \OC\IAddressBook $address_book + * @param \OCP\IAddressBook $address_book */ - public static function registerAddressBook(\OC\IAddressBook $address_book) { + public static function registerAddressBook(\OCP\IAddressBook $address_book) { self::$address_books[$address_book->getKey()] = $address_book; } /** - * @param \OC\IAddressBook $address_book + * @param \OCP\IAddressBook $address_book */ - public static function unregisterAddressBook(\OC\IAddressBook $address_book) { + public static function unregisterAddressBook(\OCP\IAddressBook $address_book) { unset(self::$address_books[$address_book->getKey()]); } @@ -179,7 +179,7 @@ namespace OCP { } /** - * @var \OC\IAddressBook[] which holds all registered address books + * @var \OCP\IAddressBook[] which holds all registered address books */ private static $address_books = array(); } diff --git a/lib/iaddressbook.php b/lib/public/iaddressbook.php similarity index 93% rename from lib/iaddressbook.php rename to lib/public/iaddressbook.php index 3920514036..14943747f4 100644 --- a/lib/iaddressbook.php +++ b/lib/public/iaddressbook.php @@ -20,7 +20,9 @@ * */ -namespace OC { +// 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 { interface IAddressBook { /** From 90e8e949097699f520a13fa1aafc44d9ccd5a02e Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 11 Dec 2012 18:54:43 +0100 Subject: [PATCH 464/481] =?UTF-8?q?icons=20for=20username=20and=20password?= =?UTF-8?q?=20field,=20not=20sure=20if=20it=E2=80=99s=20good?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/css/styles.css | 13 +- core/img/actions/password.png | Bin 0 -> 197 bytes core/img/actions/password.svg | 2174 +++++++++++++++++++++++++++++++ core/img/actions/user.png | Bin 0 -> 374 bytes core/img/actions/user.svg | 1698 ++++++++++++++++++++++++ core/templates/installation.php | 4 +- core/templates/login.php | 4 +- 7 files changed, 3886 insertions(+), 7 deletions(-) create mode 100644 core/img/actions/password.png create mode 100644 core/img/actions/password.svg create mode 100644 core/img/actions/user.png create mode 100644 core/img/actions/user.svg diff --git a/core/css/styles.css b/core/css/styles.css index d5b0a348ee..01ae5f1f06 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -119,6 +119,13 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b #login #datadirContent label { display:block; margin:0; color:#999; } #login form #datadirField legend { margin-bottom:15px; } + +/* Icons for username and password fields to better recognize them */ +#adminlogin, #adminpass, #user, #password { padding-left:1.6em; background-repeat:no-repeat; background-position:.4em .75em; } +#adminlogin+label, #adminpass+label, #user+label, #password+label { left:2em; } +#adminlogin, #user { background-image:url('../img/actions/user.svg'); } +#adminpass, #password { background-image:url('../img/actions/password.svg'); } + /* Nicely grouping input field sets */ .grouptop input { margin-bottom:0; @@ -135,11 +142,11 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b box-shadow:0 1px 1px #fff,0 1px 0 #ddd inset; } -#login form label { margin:.95em 0 0 .85em; color:#666; } -#login .groupmiddle label, #login .groupbottom label { margin-top:13px; } +#login form label { color:#666; } +#login .groupmiddle label, #login .groupbottom label { top:.65em; } /* NEEDED FOR INFIELD LABELS */ p.infield { position:relative; } -label.infield { cursor:text !important; } +label.infield { cursor:text !important; top:1.05em; left:.85em; } #login form label.infield { position:absolute; font-size:19px; color:#aaa; white-space:nowrap; } #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; } #login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } diff --git a/core/img/actions/password.png b/core/img/actions/password.png new file mode 100644 index 0000000000000000000000000000000000000000..5167161dfa9906bb6e822dd849bc94328800feee GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/img/actions/user.png b/core/img/actions/user.png new file mode 100644 index 0000000000000000000000000000000000000000..2221ac679d1c2c4d94df18ed7e4aef73cffe276a GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4y)~0TzkVUVH=ivj8(LUt+un5dtb{8-=rJi29h=j7t;*00(hDn zuRP%T9{22&C_fL+|DVrh7pFb@VsyDaXF8+gh{(yx{;!~P&EOaZH|u+GncsTPMN^i|JjwC?#~Xup8|Tg3Ds+tN z{T(6g&CJ0$XvGni1?DlK8CEGuN;Bi OXYh3Ob6Mw<&;$Vf`ICJB literal 0 HcmV?d00001 diff --git a/core/img/actions/user.svg b/core/img/actions/user.svg new file mode 100644 index 0000000000..f5ac9088c6 --- /dev/null +++ b/core/img/actions/user.svg @@ -0,0 +1,1698 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/templates/installation.php b/core/templates/installation.php index f7a8a028c4..6e36cd3dc2 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -35,12 +35,12 @@
    t( 'Create an admin account' ); ?>

    - +

    - +

    diff --git a/core/templates/login.php b/core/templates/login.php index 5e4e2eb07e..53e2e9da2c 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -17,12 +17,12 @@

    - autocomplete="on" required /> +

    - /> +

    From bac4e011dc6b0fd890da6ac260afe0fd173da443 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 12 Dec 2012 00:14:08 +0100 Subject: [PATCH 465/481] [tx-robot] updated from transifex --- apps/files/l10n/de.php | 1 + apps/files/l10n/de_DE.php | 1 + core/l10n/zh_HK.php | 3 ++ l10n/ar/files_external.po | 50 +++++++++++------- l10n/bg_BG/files_external.po | 50 +++++++++++------- l10n/ca/files_external.po | 50 +++++++++++------- l10n/cs_CZ/files_external.po | 50 +++++++++++------- l10n/da/files_external.po | 50 +++++++++++------- l10n/de/files.po | 80 ++++++++++++++--------------- l10n/de/files_external.po | 50 +++++++++++------- l10n/de/lib.po | 4 +- l10n/de_DE/files.po | 80 ++++++++++++++--------------- l10n/de_DE/files_external.po | 50 +++++++++++------- l10n/el/files_external.po | 50 +++++++++++------- l10n/eo/files_external.po | 50 +++++++++++------- l10n/es/files_external.po | 50 +++++++++++------- l10n/es_AR/files_external.po | 50 +++++++++++------- l10n/et_EE/files_external.po | 50 +++++++++++------- l10n/eu/files_external.po | 50 +++++++++++------- l10n/fa/files_external.po | 50 +++++++++++------- l10n/fi_FI/files_external.po | 50 +++++++++++------- l10n/fr/files_external.po | 50 +++++++++++------- l10n/gl/files_external.po | 50 +++++++++++------- l10n/he/files_external.po | 50 +++++++++++------- l10n/hi/files_external.po | 50 +++++++++++------- l10n/hr/files_external.po | 50 +++++++++++------- l10n/hu_HU/files_external.po | 50 +++++++++++------- l10n/ia/files_external.po | 50 +++++++++++------- l10n/id/files_external.po | 50 +++++++++++------- l10n/is/files_external.po | 51 +++++++++++------- l10n/it/files_external.po | 50 +++++++++++------- l10n/ja_JP/files_external.po | 50 +++++++++++------- l10n/ka_GE/files_external.po | 50 +++++++++++------- l10n/ko/files_external.po | 51 +++++++++++------- l10n/ku_IQ/files_external.po | 50 +++++++++++------- l10n/lb/files_external.po | 50 +++++++++++------- l10n/lt_LT/files_external.po | 50 +++++++++++------- l10n/lv/files_external.po | 50 +++++++++++------- l10n/mk/files_external.po | 50 +++++++++++------- l10n/ms_MY/files_external.po | 50 +++++++++++------- l10n/nb_NO/files_external.po | 50 +++++++++++------- l10n/nl/files_external.po | 50 +++++++++++------- l10n/nn_NO/files_external.po | 50 +++++++++++------- l10n/oc/files_external.po | 50 +++++++++++------- l10n/pl/files_external.po | 50 +++++++++++------- l10n/pl_PL/files_external.po | 50 +++++++++++------- l10n/pt_BR/files_external.po | 50 +++++++++++------- l10n/pt_PT/files_external.po | 50 +++++++++++------- l10n/ro/files_external.po | 50 +++++++++++------- l10n/ru/files_external.po | 50 +++++++++++------- l10n/ru_RU/files_external.po | 50 +++++++++++------- l10n/si_LK/files_external.po | 50 +++++++++++------- l10n/sk_SK/files_external.po | 50 +++++++++++------- l10n/sl/files_external.po | 50 +++++++++++------- l10n/sq/files_external.po | 50 +++++++++++------- l10n/sr/files_external.po | 50 +++++++++++------- l10n/sr@latin/files_external.po | 50 +++++++++++------- l10n/sv/files_external.po | 50 +++++++++++------- l10n/ta_LK/files_external.po | 50 +++++++++++------- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 47 +++++++++++------ l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/files_external.po | 50 +++++++++++------- l10n/tr/files_external.po | 50 +++++++++++------- l10n/uk/files_external.po | 50 +++++++++++------- l10n/vi/files_external.po | 50 +++++++++++------- l10n/zh_CN.GB2312/files_external.po | 50 +++++++++++------- l10n/zh_CN/files_external.po | 50 +++++++++++------- l10n/zh_HK/core.po | 19 +++---- l10n/zh_HK/files_external.po | 50 +++++++++++------- l10n/zh_TW/files_external.po | 50 +++++++++++------- l10n/zu_ZA/files_external.po | 50 +++++++++++------- 79 files changed, 2120 insertions(+), 1235 deletions(-) create mode 100644 core/l10n/zh_HK.php diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 3989d19151..8073ee28da 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -1,5 +1,6 @@ "Datei fehlerfrei hochgeladen.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", "No file was uploaded" => "Es wurde keine Datei hochgeladen.", diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index fc8ce2f4ad..6a9730e94b 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -1,5 +1,6 @@ "Es sind keine Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", "No file was uploaded" => "Es wurde keine Datei hochgeladen.", diff --git a/core/l10n/zh_HK.php b/core/l10n/zh_HK.php new file mode 100644 index 0000000000..f55da4d3ef --- /dev/null +++ b/core/l10n/zh_HK.php @@ -0,0 +1,3 @@ + "你已登出。" +); diff --git a/l10n/ar/files_external.po b/l10n/ar/files_external.po index 3d3199bfb8..2a0ec9bd5e 100644 --- a/l10n/ar/files_external.po +++ b/l10n/ar/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/bg_BG/files_external.po b/l10n/bg_BG/files_external.po index adf4447b42..d0a0c22c21 100644 --- a/l10n/bg_BG/files_external.po +++ b/l10n/bg_BG/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/ca/files_external.po b/l10n/ca/files_external.po index 2b4c767cde..d1d086ad2d 100644 --- a/l10n/ca/files_external.po +++ b/l10n/ca/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 06:09+0000\n" -"Last-Translator: rogerc \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Proporcioneu una clau d'aplicació i secret vàlids per a Dropbox" msgid "Error configuring Google Drive storage" msgstr "Error en configurar l'emmagatzemament Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Emmagatzemament extern" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punt de muntatge" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Dorsal" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuració" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Options" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicable" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Afegeix punt de muntatge" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Cap d'establert" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Tots els usuaris" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grups" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Usuaris" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Elimina" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Habilita l'emmagatzemament extern d'usuari" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permet als usuaris muntar el seu emmagatzemament extern propi" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificats SSL root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importa certificat root" diff --git a/l10n/cs_CZ/files_external.po b/l10n/cs_CZ/files_external.po index 6fc4812bb0..6bc1bffb5c 100644 --- a/l10n/cs_CZ/files_external.po +++ b/l10n/cs_CZ/files_external.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-03 00:00+0100\n" -"PO-Revision-Date: 2012-11-02 10:04+0000\n" -"Last-Translator: Tomáš Chvátal \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -45,66 +45,80 @@ msgstr "Zadejte, prosím, platný klíč a bezpečnostní frázi aplikace Dropbo msgid "Error configuring Google Drive storage" msgstr "Chyba při nastavení úložiště Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Externí úložiště" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Přípojný bod" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Podpůrná vrstva" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Nastavení" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Možnosti" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Přístupný pro" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Přidat bod připojení" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nenastaveno" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Všichni uživatelé" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Skupiny" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Uživatelé" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Smazat" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Zapnout externí uživatelské úložiště" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Povolit uživatelům připojení jejich vlastních externích úložišť" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Kořenové certifikáty SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importovat kořenového certifikátu" diff --git a/l10n/da/files_external.po b/l10n/da/files_external.po index 24203a1e15..4e52e67330 100644 --- a/l10n/da/files_external.po +++ b/l10n/da/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-13 02:04+0200\n" -"PO-Revision-Date: 2012-10-12 17:53+0000\n" -"Last-Translator: Ole Holm Frandsen \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Angiv venligst en valid Dropbox app nøgle og hemmelighed" msgid "Error configuring Google Drive storage" msgstr "Fejl ved konfiguration af Google Drive plads" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Ekstern opbevaring" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Monteringspunkt" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Opsætning" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Valgmuligheder" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Kan anvendes" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Tilføj monteringspunkt" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ingen sat" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alle brugere" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupper" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Brugere" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Slet" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Aktiver ekstern opbevaring for brugere" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Tillad brugere at montere deres egne eksterne opbevaring" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL-rodcertifikater" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importer rodcertifikat" diff --git a/l10n/de/files.po b/l10n/de/files.po index c2615d7bf1..7dc41332e0 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -24,9 +24,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 09:27+0000\n" +"Last-Translator: Mirodin \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,7 +41,7 @@ msgstr "Datei fehlerfrei hochgeladen." #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini" #: ajax/upload.php:23 msgid "" @@ -69,11 +69,11 @@ msgstr "Fehler beim Schreiben auf die Festplatte" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "Löschen" @@ -81,39 +81,39 @@ msgstr "Löschen" msgid "Rename" msgstr "Umbenennen" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "{new_name} existiert bereits" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "ersetzen" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "Name vorschlagen" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "abbrechen" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "{new_name} wurde ersetzt" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "rückgängig machen" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr "{old_name} ersetzt durch {new_name}" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "Freigabe von {files} aufgehoben" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "{files} gelöscht" @@ -123,80 +123,80 @@ msgid "" "allowed." msgstr "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig." -#: js/files.js:183 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "Erstelle ZIP-Datei. Dies kann eine Weile dauern." -#: js/files.js:218 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Deine Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist." -#: js/files.js:218 +#: js/files.js:209 msgid "Upload Error" msgstr "Fehler beim Upload" -#: js/files.js:235 +#: js/files.js:226 msgid "Close" msgstr "Schließen" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "Ausstehend" -#: js/files.js:274 +#: js/files.js:265 msgid "1 file uploading" msgstr "Eine Datei wird hoch geladen" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "{count} Dateien werden hochgeladen" -#: js/files.js:349 js/files.js:382 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "Upload abgebrochen." -#: js/files.js:451 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen." -#: js/files.js:523 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten." -#: js/files.js:704 +#: js/files.js:693 msgid "{count} files scanned" msgstr "{count} Dateien wurden gescannt" -#: js/files.js:712 +#: js/files.js:701 msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "Name" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "Größe" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "Bearbeitet" -#: js/files.js:814 +#: js/files.js:803 msgid "1 folder" msgstr "1 Ordner" -#: js/files.js:816 +#: js/files.js:805 msgid "{count} folders" msgstr "{count} Ordner" -#: js/files.js:824 +#: js/files.js:813 msgid "1 file" msgstr "1 Datei" -#: js/files.js:826 +#: js/files.js:815 msgid "{count} files" msgstr "{count} Dateien" @@ -256,28 +256,28 @@ msgstr "Hochladen" msgid "Cancel upload" msgstr "Upload abbrechen" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "Alles leer. Lade etwas hoch!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "Herunterladen" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "Upload zu groß" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server." -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "Dateien werden gescannt, bitte warten." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "Scanne" diff --git a/l10n/de/files_external.po b/l10n/de/files_external.po index 4f400dc97c..dc9c4907b6 100644 --- a/l10n/de/files_external.po +++ b/l10n/de/files_external.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-13 02:04+0200\n" -"PO-Revision-Date: 2012-10-12 22:22+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -45,66 +45,80 @@ msgstr "Bitte trage einen gültigen Dropbox-App-Key mit Secret ein." msgid "Error configuring Google Drive storage" msgstr "Fehler beim Einrichten von Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Externer Speicher" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Mount-Point" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfiguration" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Optionen" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Zutreffend" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Mount-Point hinzufügen" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nicht definiert" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alle Benutzer" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Gruppen" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Benutzer" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Löschen" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Externen Speicher für Benutzer aktivieren" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL-Root-Zertifikate" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Root-Zertifikate importieren" diff --git a/l10n/de/lib.po b/l10n/de/lib.po index b09a71c057..d572145c29 100644 --- a/l10n/de/lib.po +++ b/l10n/de/lib.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" -"PO-Revision-Date: 2012-12-10 13:50+0000\n" +"POT-Creation-Date: 2012-12-12 00:13+0100\n" +"PO-Revision-Date: 2012-12-11 09:31+0000\n" "Last-Translator: Mirodin \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/de_DE/files.po b/l10n/de_DE/files.po index b991af5cb1..035e733deb 100644 --- a/l10n/de_DE/files.po +++ b/l10n/de_DE/files.po @@ -25,9 +25,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 09:27+0000\n" +"Last-Translator: Mirodin \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,7 +42,7 @@ msgstr "Es sind keine Fehler aufgetreten. Die Datei wurde erfolgreich hochgelade #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini" #: ajax/upload.php:23 msgid "" @@ -70,11 +70,11 @@ msgstr "Fehler beim Schreiben auf die Festplatte" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "Nicht mehr freigeben" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "Löschen" @@ -82,39 +82,39 @@ msgstr "Löschen" msgid "Rename" msgstr "Umbenennen" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "{new_name} existiert bereits" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "ersetzen" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "Name vorschlagen" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "abbrechen" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "{new_name} wurde ersetzt" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "rückgängig machen" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr "{old_name} wurde ersetzt durch {new_name}" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "Freigabe für {files} beendet" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "{files} gelöscht" @@ -124,80 +124,80 @@ msgid "" "allowed." msgstr "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig." -#: js/files.js:183 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "Erstelle ZIP-Datei. Dies kann eine Weile dauern." -#: js/files.js:218 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ihre Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist." -#: js/files.js:218 +#: js/files.js:209 msgid "Upload Error" msgstr "Fehler beim Upload" -#: js/files.js:235 +#: js/files.js:226 msgid "Close" msgstr "Schließen" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "Ausstehend" -#: js/files.js:274 +#: js/files.js:265 msgid "1 file uploading" msgstr "1 Datei wird hochgeladen" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "{count} Dateien wurden hochgeladen" -#: js/files.js:349 js/files.js:382 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "Upload abgebrochen." -#: js/files.js:451 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Der Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen." -#: js/files.js:523 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten." -#: js/files.js:704 +#: js/files.js:693 msgid "{count} files scanned" msgstr "{count} Dateien wurden gescannt" -#: js/files.js:712 +#: js/files.js:701 msgid "error while scanning" msgstr "Fehler beim Scannen" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "Name" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "Größe" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "Bearbeitet" -#: js/files.js:814 +#: js/files.js:803 msgid "1 folder" msgstr "1 Ordner" -#: js/files.js:816 +#: js/files.js:805 msgid "{count} folders" msgstr "{count} Ordner" -#: js/files.js:824 +#: js/files.js:813 msgid "1 file" msgstr "1 Datei" -#: js/files.js:826 +#: js/files.js:815 msgid "{count} files" msgstr "{count} Dateien" @@ -257,28 +257,28 @@ msgstr "Hochladen" msgid "Cancel upload" msgstr "Upload abbrechen" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "Alles leer. Bitte laden Sie etwas hoch!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "Herunterladen" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "Der Upload ist zu groß" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server." -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "Dateien werden gescannt, bitte warten." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "Scanne" diff --git a/l10n/de_DE/files_external.po b/l10n/de_DE/files_external.po index f17be8ed3d..415197254c 100644 --- a/l10n/de_DE/files_external.po +++ b/l10n/de_DE/files_external.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-20 02:02+0200\n" -"PO-Revision-Date: 2012-10-19 21:34+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -45,66 +45,80 @@ msgstr "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein." msgid "Error configuring Google Drive storage" msgstr "Fehler beim Einrichten von Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Externer Speicher" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Mount-Point" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfiguration" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Optionen" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Zutreffend" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Mount-Point hinzufügen" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nicht definiert" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alle Benutzer" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Gruppen" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Benutzer" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Löschen" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Externen Speicher für Benutzer aktivieren" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL-Root-Zertifikate" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Root-Zertifikate importieren" diff --git a/l10n/el/files_external.po b/l10n/el/files_external.po index 261b71a5b7..427a867f4a 100644 --- a/l10n/el/files_external.po +++ b/l10n/el/files_external.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-14 02:05+0200\n" -"PO-Revision-Date: 2012-10-13 20:42+0000\n" -"Last-Translator: Γιάννης Ανθυμίδης \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -46,66 +46,80 @@ msgstr "Παρακαλούμε δώστε έγκυρο κλειδί Dropbox κα msgid "Error configuring Google Drive storage" msgstr "Σφάλμα ρυθμίζωντας αποθήκευση Google Drive " +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Εξωτερικό Αποθηκευτικό Μέσο" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Σημείο προσάρτησης" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Σύστημα υποστήριξης" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Ρυθμίσεις" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Επιλογές" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Εφαρμόσιμο" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Προσθήκη σημείου προσάρτησης" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Κανένα επιλεγμένο" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Όλοι οι Χρήστες" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Ομάδες" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Χρήστες" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Διαγραφή" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Ενεργοποίηση Εξωτερικού Αποθηκευτικού Χώρου Χρήστη" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Να επιτρέπεται στους χρήστες να προσαρτούν δικό τους εξωτερικό αποθηκευτικό χώρο" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Πιστοποιητικά SSL root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Εισαγωγή Πιστοποιητικού Root" diff --git a/l10n/eo/files_external.po b/l10n/eo/files_external.po index ea8451b7f4..f0857b375b 100644 --- a/l10n/eo/files_external.po +++ b/l10n/eo/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-14 02:05+0200\n" -"PO-Revision-Date: 2012-10-13 05:00+0000\n" -"Last-Translator: Mariano \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Bonvolu provizi ŝlosilon de la aplikaĵo Dropbox validan kaj sekretan." msgid "Error configuring Google Drive storage" msgstr "Eraro dum agordado de la memorservo Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Malena memorilo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Surmetingo" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Motoro" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Agordo" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Malneproj" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplikebla" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Aldoni surmetingon" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nenio agordita" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Ĉiuj uzantoj" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupoj" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Uzantoj" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Forigi" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Kapabligi malenan memorilon de uzanto" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permesi al uzantoj surmeti siajn proprajn malenajn memorilojn" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Radikaj SSL-atestoj" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Enporti radikan ateston" diff --git a/l10n/es/files_external.po b/l10n/es/files_external.po index bd19aeabd7..04ce595ce9 100644 --- a/l10n/es/files_external.po +++ b/l10n/es/files_external.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-07 02:03+0200\n" -"PO-Revision-Date: 2012-10-06 14:33+0000\n" -"Last-Translator: Raul Fernandez Garcia \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,66 +44,80 @@ msgstr "Por favor , proporcione un secreto y una contraseña válida de la app D msgid "Error configuring Google Drive storage" msgstr "Error configurando el almacenamiento de Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Almacenamiento externo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punto de montaje" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Motor" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuración" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opciones" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicable" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Añadir punto de montaje" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "No se ha configurado" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Todos los usuarios" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupos" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Usuarios" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Eliiminar" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Habilitar almacenamiento de usuario externo" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permitir a los usuarios montar su propio almacenamiento externo" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Raíz de certificados SSL " -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importar certificado raíz" diff --git a/l10n/es_AR/files_external.po b/l10n/es_AR/files_external.po index 55fe0810c4..5090ecf75b 100644 --- a/l10n/es_AR/files_external.po +++ b/l10n/es_AR/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-11 02:04+0200\n" -"PO-Revision-Date: 2012-10-10 07:08+0000\n" -"Last-Translator: cjtess \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Por favor, proporcioná un secreto y una contraseña válida para la apl msgid "Error configuring Google Drive storage" msgstr "Error al configurar el almacenamiento de Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Almacenamiento externo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punto de montaje" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Motor" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuración" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opciones" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicable" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Añadir punto de montaje" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "No fue configurado" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Todos los usuarios" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupos" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Usuarios" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Borrar" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Habilitar almacenamiento de usuario externo" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permitir a los usuarios montar su propio almacenamiento externo" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "certificados SSL raíz" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importar certificado raíz" diff --git a/l10n/et_EE/files_external.po b/l10n/et_EE/files_external.po index bb927c8282..08b40c08b4 100644 --- a/l10n/et_EE/files_external.po +++ b/l10n/et_EE/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-21 02:03+0200\n" -"PO-Revision-Date: 2012-10-20 20:16+0000\n" -"Last-Translator: Rivo Zängov \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Palun sisesta korrektne Dropboxi rakenduse võti ja salasõna." msgid "Error configuring Google Drive storage" msgstr "Viga Google Drive'i salvestusruumi seadistamisel" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Väline salvestuskoht" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Ühenduspunkt" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Admin" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Seadistamine" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Valikud" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Rakendatav" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Lisa ühenduspunkt" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Pole määratud" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Kõik kasutajad" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupid" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Kasutajad" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Kustuta" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Luba kasutajatele väline salvestamine" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Luba kasutajatel ühendada külge nende enda välised salvestusseadmed" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL root sertifikaadid" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Impordi root sertifikaadid" diff --git a/l10n/eu/files_external.po b/l10n/eu/files_external.po index 8cfcabccf3..34c406e0b2 100644 --- a/l10n/eu/files_external.po +++ b/l10n/eu/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-07 02:03+0200\n" -"PO-Revision-Date: 2012-10-06 13:01+0000\n" -"Last-Translator: asieriko \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Mesedez eman baliozkoa den Dropbox app giltza eta sekretua" msgid "Error configuring Google Drive storage" msgstr "Errore bat egon da Google Drive biltegiratzea konfiguratzean" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Kanpoko Biltegiratzea" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Montatze puntua" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Motorra" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfigurazioa" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Aukerak" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplikagarria" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Gehitu muntatze puntua" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ezarri gabe" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Erabiltzaile guztiak" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Taldeak" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Erabiltzaileak" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Ezabatu" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Gaitu erabiltzaileentzako Kanpo Biltegiratzea" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Baimendu erabiltzaileak bere kanpo biltegiratzeak muntatzen" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL erro ziurtagiriak" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Inportatu Erro Ziurtagiria" diff --git a/l10n/fa/files_external.po b/l10n/fa/files_external.po index 90b7be97d2..13b8e5c47b 100644 --- a/l10n/fa/files_external.po +++ b/l10n/fa/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/fi_FI/files_external.po b/l10n/fi_FI/files_external.po index 54f2df01a0..e9d7e697e0 100644 --- a/l10n/fi_FI/files_external.po +++ b/l10n/fi_FI/files_external.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-12 02:03+0200\n" -"PO-Revision-Date: 2012-10-11 17:55+0000\n" -"Last-Translator: variaatiox \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,66 +44,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "Virhe Google Drive levyn asetuksia tehtäessä" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Erillinen tallennusväline" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Liitospiste" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Taustaosa" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Asetukset" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Valinnat" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Sovellettavissa" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Lisää liitospiste" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ei asetettu" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Kaikki käyttäjät" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Ryhmät" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Käyttäjät" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Poista" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Ota käyttöön ulkopuoliset tallennuspaikat" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Salli käyttäjien liittää omia erillisiä tallennusvälineitä" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL-juurivarmenteet" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Tuo juurivarmenne" diff --git a/l10n/fr/files_external.po b/l10n/fr/files_external.po index f7d30e969a..1618d64873 100644 --- a/l10n/fr/files_external.po +++ b/l10n/fr/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 19:39+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Veuillez fournir une clé d'application (app key) ainsi qu'un mot de pas msgid "Error configuring Google Drive storage" msgstr "Erreur lors de la configuration du support de stockage Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Stockage externe" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Point de montage" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Infrastructure" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuration" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Options" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Disponible" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Ajouter un point de montage" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Aucun spécifié" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Tous les utilisateurs" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Groupes" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Utilisateurs" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Supprimer" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Activer le stockage externe pour les utilisateurs" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Autoriser les utilisateurs à monter leur propre stockage externe" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificats racine SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importer un certificat racine" diff --git a/l10n/gl/files_external.po b/l10n/gl/files_external.po index 2f60b9cf9e..0ff6943895 100644 --- a/l10n/gl/files_external.po +++ b/l10n/gl/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-30 00:03+0100\n" -"PO-Revision-Date: 2012-11-29 16:06+0000\n" -"Last-Translator: mbouzada \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Dá o segredo e a chave correcta do aplicativo de Dropbox." msgid "Error configuring Google Drive storage" msgstr "Produciuse un erro ao configurar o almacenamento en Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Almacenamento externo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punto de montaxe" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Infraestrutura" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuración" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opcións" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicábel" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Engadir un punto de montaxe" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ningún definido" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Todos os usuarios" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupos" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Usuarios" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Eliminar" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Activar o almacenamento externo do usuario" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permitir aos usuarios montar os seus propios almacenamentos externos" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificados SSL root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importar o certificado root" diff --git a/l10n/he/files_external.po b/l10n/he/files_external.po index bf65ccc356..2b42ff706d 100644 --- a/l10n/he/files_external.po +++ b/l10n/he/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 07:19+0000\n" -"Last-Translator: Yaron Shahrabani \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "נא לספק קוד יישום וסוד תקניים של Dropbox." msgid "Error configuring Google Drive storage" msgstr "אירעה שגיאה בעת הגדרת אחסון ב־Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "אחסון חיצוני" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "נקודת עגינה" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "מנגנון" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "הגדרות" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "אפשרויות" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "ניתן ליישום" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "הוספת נקודת עגינה" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "לא הוגדרה" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "כל המשתמשים" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "קבוצות" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "משתמשים" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "מחיקה" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "הפעלת אחסון חיצוני למשתמשים" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "יאפשר למשתמשים לעגן את האחסון החיצוני שלהם" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "שורש אישורי אבטחת SSL " -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "ייבוא אישור אבטחת שורש" diff --git a/l10n/hi/files_external.po b/l10n/hi/files_external.po index ffd95d4096..f93e40c83d 100644 --- a/l10n/hi/files_external.po +++ b/l10n/hi/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/hr/files_external.po b/l10n/hr/files_external.po index 1fdf2d3810..0c806b0f1d 100644 --- a/l10n/hr/files_external.po +++ b/l10n/hr/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/hu_HU/files_external.po b/l10n/hu_HU/files_external.po index 8ba04f1084..15e23eff92 100644 --- a/l10n/hu_HU/files_external.po +++ b/l10n/hu_HU/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/ia/files_external.po b/l10n/ia/files_external.po index e8fbb159c3..de137eb4b1 100644 --- a/l10n/ia/files_external.po +++ b/l10n/ia/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/id/files_external.po b/l10n/id/files_external.po index 87060eb50f..022a94be89 100644 --- a/l10n/id/files_external.po +++ b/l10n/id/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-21 02:03+0200\n" -"PO-Revision-Date: 2012-10-20 23:34+0000\n" -"Last-Translator: elmakong \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "penyimpanan eksternal" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "konfigurasi" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "pilihan" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "berlaku" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "tidak satupun di set" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "semua pengguna" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "grup" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "pengguna" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "hapus" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/is/files_external.po b/l10n/is/files_external.po index 3789d361a1..0be8d4ee79 100644 --- a/l10n/is/files_external.po +++ b/l10n/is/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,67 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:21 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:26 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:84 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:85 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:86 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:94 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:107 templates/settings.php:108 -#: templates/settings.php:148 templates/settings.php:149 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:123 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:124 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:138 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:157 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/it/files_external.po b/l10n/it/files_external.po index bcae09b3e0..8b98af50d4 100644 --- a/l10n/it/files_external.po +++ b/l10n/it/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 05:50+0000\n" -"Last-Translator: Vincenzo Reale \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Fornisci chiave di applicazione e segreto di Dropbox validi." msgid "Error configuring Google Drive storage" msgstr "Errore durante la configurazione dell'archivio Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Archiviazione esterna" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punto di mount" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Motore" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configurazione" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opzioni" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Applicabile" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Aggiungi punto di mount" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nessuna impostazione" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Tutti gli utenti" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Gruppi" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Utenti" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Elimina" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Abilita la memoria esterna dell'utente" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Consenti agli utenti di montare la propria memoria esterna" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificati SSL radice" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importa certificato radice" diff --git a/l10n/ja_JP/files_external.po b/l10n/ja_JP/files_external.po index c857478540..7ddb01d4fa 100644 --- a/l10n/ja_JP/files_external.po +++ b/l10n/ja_JP/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 02:12+0000\n" -"Last-Translator: Daisuke Deguchi \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "有効なDropboxアプリのキーとパスワードを入力して下 msgid "Error configuring Google Drive storage" msgstr "Googleドライブストレージの設定エラー" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "外部ストレージ" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "マウントポイント" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "バックエンド" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "設定" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "オプション" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "適用範囲" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "マウントポイントを追加" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "未設定" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "すべてのユーザ" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "グループ" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "ユーザ" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "削除" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "ユーザの外部ストレージを有効にする" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "ユーザに外部ストレージのマウントを許可する" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSLルート証明書" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "ルート証明書をインポート" diff --git a/l10n/ka_GE/files_external.po b/l10n/ka_GE/files_external.po index 68ea705a40..e92df815c9 100644 --- a/l10n/ka_GE/files_external.po +++ b/l10n/ka_GE/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-22 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/ko/files_external.po b/l10n/ko/files_external.po index 8a9204f06a..88c2336d39 100644 --- a/l10n/ko/files_external.po +++ b/l10n/ko/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" -"PO-Revision-Date: 2012-12-09 06:12+0000\n" -"Last-Translator: Shinjo Park \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,67 +43,80 @@ msgstr "올바른 Dropbox 앱 키와 암호를 입력하십시오." msgid "Error configuring Google Drive storage" msgstr "Google 드라이브 저장소 설정 오류" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "외부 저장소" -#: templates/settings.php:7 templates/settings.php:21 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "마운트 지점" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "백엔드" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "설정" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "옵션" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "적용 가능" -#: templates/settings.php:26 +#: templates/settings.php:27 msgid "Add mount point" msgstr "마운트 지점 추가" -#: templates/settings.php:84 +#: templates/settings.php:85 msgid "None set" msgstr "설정되지 않음" -#: templates/settings.php:85 +#: templates/settings.php:86 msgid "All Users" msgstr "모든 사용자" -#: templates/settings.php:86 +#: templates/settings.php:87 msgid "Groups" msgstr "그룹" -#: templates/settings.php:94 +#: templates/settings.php:95 msgid "Users" msgstr "사용자" -#: templates/settings.php:107 templates/settings.php:108 -#: templates/settings.php:148 templates/settings.php:149 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "삭제" -#: templates/settings.php:123 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "사용자 외부 저장소 사용" -#: templates/settings.php:124 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "사용자별 외부 저장소 마운트 허용" -#: templates/settings.php:138 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL 루트 인증서" -#: templates/settings.php:157 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "루트 인증서 가져오기" diff --git a/l10n/ku_IQ/files_external.po b/l10n/ku_IQ/files_external.po index 4089687b03..19e1b53ebb 100644 --- a/l10n/ku_IQ/files_external.po +++ b/l10n/ku_IQ/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-07 02:03+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/lb/files_external.po b/l10n/lb/files_external.po index 4a00f6bb30..e0a2ceb1af 100644 --- a/l10n/lb/files_external.po +++ b/l10n/lb/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/lt_LT/files_external.po b/l10n/lt_LT/files_external.po index e1cfb8f097..baf294943a 100644 --- a/l10n/lt_LT/files_external.po +++ b/l10n/lt_LT/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-01 00:01+0100\n" -"PO-Revision-Date: 2012-10-31 14:42+0000\n" -"Last-Translator: Dr. ROX \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Prašome įvesti teisingus Dropbox \"app key\" ir \"secret\"." msgid "Error configuring Google Drive storage" msgstr "Klaida nustatinėjant Google Drive talpyklą" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Išorinės saugyklos" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Saugyklos pavadinimas" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Posistemės pavadinimas" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfigūracija" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Nustatymai" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Pritaikyti" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Pridėti išorinę saugyklą" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nieko nepasirinkta" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Visi vartotojai" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupės" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Vartotojai" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Ištrinti" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Įjungti vartotojų išorines saugyklas" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Leisti vartotojams pridėti savo išorines saugyklas" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL sertifikatas" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Įkelti pagrindinį sertifikatą" diff --git a/l10n/lv/files_external.po b/l10n/lv/files_external.po index 81da66c079..742960675b 100644 --- a/l10n/lv/files_external.po +++ b/l10n/lv/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/mk/files_external.po b/l10n/mk/files_external.po index 21928cfd6f..645256ddc1 100644 --- a/l10n/mk/files_external.po +++ b/l10n/mk/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/ms_MY/files_external.po b/l10n/ms_MY/files_external.po index 42da08f27e..7bca6897df 100644 --- a/l10n/ms_MY/files_external.po +++ b/l10n/ms_MY/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/nb_NO/files_external.po b/l10n/nb_NO/files_external.po index 95af4ebb24..f5a90c0da8 100644 --- a/l10n/nb_NO/files_external.po +++ b/l10n/nb_NO/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfigurasjon" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Innstillinger" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alle brukere" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupper" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Brukere" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Slett" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/nl/files_external.po b/l10n/nl/files_external.po index 98f19c36b8..316f4a7870 100644 --- a/l10n/nl/files_external.po +++ b/l10n/nl/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-28 00:01+0200\n" -"PO-Revision-Date: 2012-10-27 09:42+0000\n" -"Last-Translator: Richard Bos \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Geef een geldige Dropbox key en secret." msgid "Error configuring Google Drive storage" msgstr "Fout tijdens het configureren van Google Drive opslag" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Externe opslag" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Aankoppelpunt" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuratie" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opties" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Van toepassing" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Aankoppelpunt toevoegen" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Niets ingesteld" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alle gebruikers" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Groepen" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Gebruikers" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Verwijder" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Externe opslag voor gebruikers activeren" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Sta gebruikers toe om hun eigen externe opslag aan te koppelen" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL root certificaten" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importeer root certificaat" diff --git a/l10n/nn_NO/files_external.po b/l10n/nn_NO/files_external.po index ec4986c92e..5655e1ba16 100644 --- a/l10n/nn_NO/files_external.po +++ b/l10n/nn_NO/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/oc/files_external.po b/l10n/oc/files_external.po index 926c07eac6..9c12334dac 100644 --- a/l10n/oc/files_external.po +++ b/l10n/oc/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/pl/files_external.po b/l10n/pl/files_external.po index ae3676ade7..858bef67e1 100644 --- a/l10n/pl/files_external.po +++ b/l10n/pl/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-06 02:03+0200\n" -"PO-Revision-Date: 2012-10-05 20:54+0000\n" -"Last-Translator: Cyryl Sochacki \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Proszę podać prawidłowy klucz aplikacji Dropbox i klucz sekretny." msgid "Error configuring Google Drive storage" msgstr "Wystąpił błąd podczas konfigurowania zasobu Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Zewnętrzna zasoby dyskowe" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punkt montowania" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Zaplecze" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfiguracja" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opcje" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Zastosowanie" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Dodaj punkt montowania" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nie ustawione" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Wszyscy uzytkownicy" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupy" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Użytkownicy" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Usuń" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Włącz zewnętrzne zasoby dyskowe użytkownika" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Zezwalaj użytkownikom na montowanie ich własnych zewnętrznych zasobów dyskowych" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Główny certyfikat SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importuj główny certyfikat" diff --git a/l10n/pl_PL/files_external.po b/l10n/pl_PL/files_external.po index e6dff5b09a..49f56afb0b 100644 --- a/l10n/pl_PL/files_external.po +++ b/l10n/pl_PL/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/pt_BR/files_external.po b/l10n/pt_BR/files_external.po index bea354c7ac..573fe0165e 100644 --- a/l10n/pt_BR/files_external.po +++ b/l10n/pt_BR/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-07 02:03+0200\n" -"PO-Revision-Date: 2012-10-06 13:48+0000\n" -"Last-Translator: sedir \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Por favor forneça um app key e secret válido do Dropbox" msgid "Error configuring Google Drive storage" msgstr "Erro ao configurar armazenamento do Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Armazenamento Externo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Ponto de montagem" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuração" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opções" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicável" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Adicionar ponto de montagem" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nenhum definido" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Todos os Usuários" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupos" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Usuários" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Remover" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Habilitar Armazenamento Externo do Usuário" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permitir usuários a montar seus próprios armazenamentos externos" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificados SSL raíz" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importar Certificado Raíz" diff --git a/l10n/pt_PT/files_external.po b/l10n/pt_PT/files_external.po index 775748e5e5..bf65e8ef77 100644 --- a/l10n/pt_PT/files_external.po +++ b/l10n/pt_PT/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 12:53+0000\n" -"Last-Translator: Duarte Velez Grilo \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Por favor forneça uma \"app key\" e \"secret\" do Dropbox válidas." msgid "Error configuring Google Drive storage" msgstr "Erro ao configurar o armazenamento do Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Armazenamento Externo" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Ponto de montagem" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configuração" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opções" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicável" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Adicionar ponto de montagem" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Nenhum configurado" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Todos os utilizadores" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupos" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Utilizadores" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Apagar" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Activar Armazenamento Externo para o Utilizador" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permitir que os utilizadores montem o seu próprio armazenamento externo" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificados SSL de raiz" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importar Certificado Root" diff --git a/l10n/ro/files_external.po b/l10n/ro/files_external.po index a248d72af3..ac9c9b5877 100644 --- a/l10n/ro/files_external.po +++ b/l10n/ro/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Stocare externă" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Punctul de montare" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Configurație" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Opțiuni" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplicabil" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Adaugă punct de montare" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Niciunul" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Toți utilizatorii" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupuri" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Utilizatori" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Șterge" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Permite stocare externă pentru utilizatori" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Permite utilizatorilor să monteze stocare externă proprie" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Certificate SSL root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importă certificat root" diff --git a/l10n/ru/files_external.po b/l10n/ru/files_external.po index 7b43af9a27..664f6a3b49 100644 --- a/l10n/ru/files_external.po +++ b/l10n/ru/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-23 02:02+0200\n" -"PO-Revision-Date: 2012-10-22 10:18+0000\n" -"Last-Translator: skoptev \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Пожалуйста, предоставьте действующий к msgid "Error configuring Google Drive storage" msgstr "Ошибка при настройке хранилища Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Внешний носитель" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Точка монтирования" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Подсистема" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Конфигурация" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Опции" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Применимый" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Добавить точку монтирования" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Не установлено" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Все пользователи" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Группы" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Пользователи" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Удалить" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Включить пользовательские внешние носители" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Разрешить пользователям монтировать их собственные внешние носители" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Корневые сертификаты SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Импортировать корневые сертификаты" diff --git a/l10n/ru_RU/files_external.po b/l10n/ru_RU/files_external.po index e0902a2349..df9df7ab0c 100644 --- a/l10n/ru_RU/files_external.po +++ b/l10n/ru_RU/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-12 02:03+0200\n" -"PO-Revision-Date: 2012-10-11 08:45+0000\n" -"Last-Translator: AnnaSch \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Пожалуйста представьте допустимый клю msgid "Error configuring Google Drive storage" msgstr "Ошибка настройки хранилища Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Внешние системы хранения данных" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Точка монтирования" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Бэкэнд" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Конфигурация" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Опции" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Применимый" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Добавить точку монтирования" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Не задан" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Все пользователи" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Группы" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Пользователи" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Удалить" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Включить пользовательскую внешнюю систему хранения данных" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Разрешить пользователям монтировать их собственную внешнюю систему хранения данных" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Корневые сертификаты SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Импортировать корневые сертификаты" diff --git a/l10n/si_LK/files_external.po b/l10n/si_LK/files_external.po index 2a2835fc12..ae4a7f377f 100644 --- a/l10n/si_LK/files_external.po +++ b/l10n/si_LK/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-23 02:02+0200\n" -"PO-Revision-Date: 2012-10-22 10:28+0000\n" -"Last-Translator: Anushke Guneratne \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "කරුණාකර වලංගු Dropbox යෙදුම් යත msgid "Error configuring Google Drive storage" msgstr "Google Drive ගබඩාව වින්‍යාස කිරීමේ දෝශයක් ඇත" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "භාහිර ගබඩාව" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "මවුන්ට් කළ ස්ථානය" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "පසු පද්ධතිය" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "වින්‍යාසය" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "විකල්පයන්" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "අදාළ" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "මවුන්ට් කරන ස්ථානයක් එකතු කරන්න" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "කිසිවක් නැත" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "සියළු පරිශීලකයන්" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "කණ්ඩායම්" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "පරිශීලකයන්" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "මකා දමන්න" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "පරිශීලක භාහිර ගබඩාවන් සක්‍රිය කරන්න" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "පරිශීලකයන්ට තමාගේම භාහිර ගබඩාවන් මවුන්ට් කිරීමේ අයිතිය දෙන්න" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL මූල සහතිකයන්" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "මූල සහතිකය ආයාත කරන්න" diff --git a/l10n/sk_SK/files_external.po b/l10n/sk_SK/files_external.po index 81c509ecd5..258af33f03 100644 --- a/l10n/sk_SK/files_external.po +++ b/l10n/sk_SK/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-16 23:37+0200\n" -"PO-Revision-Date: 2012-10-16 18:49+0000\n" -"Last-Translator: martinb \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Zadajte platný kľúč aplikácie a heslo Dropbox" msgid "Error configuring Google Drive storage" msgstr "Chyba pri konfigurácii úložiska Google drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Externé úložisko" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Prípojný bod" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Nastavenia" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Možnosti" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Aplikovateľné" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Pridať prípojný bod" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Žiadne nastavené" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Všetci užívatelia" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Skupiny" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Užívatelia" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Odstrániť" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Povoliť externé úložisko" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Povoliť užívateľom pripojiť ich vlastné externé úložisko" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Koreňové SSL certifikáty" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importovať koreňový certifikát" diff --git a/l10n/sl/files_external.po b/l10n/sl/files_external.po index 36d7994f32..14900f7f88 100644 --- a/l10n/sl/files_external.po +++ b/l10n/sl/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-24 02:02+0200\n" -"PO-Revision-Date: 2012-10-23 12:29+0000\n" -"Last-Translator: mateju <>\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Vpišite veljaven ključ programa in kodo za Dropbox" msgid "Error configuring Google Drive storage" msgstr "Napaka nastavljanja shrambe Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Zunanja podatkovna shramba" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Priklopna točka" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Zaledje" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Nastavitve" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Možnosti" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Se uporablja" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Dodaj priklopno točko" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ni nastavljeno" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Vsi uporabniki" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Skupine" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Uporabniki" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Izbriši" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Omogoči uporabo zunanje podatkovne shrambe za uporabnike" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Dovoli uporabnikom priklop lastne zunanje podatkovne shrambe" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Korenska potrdila SSL" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Uvozi korensko potrdilo" diff --git a/l10n/sq/files_external.po b/l10n/sq/files_external.po index a677ece5f4..970b1cf680 100644 --- a/l10n/sq/files_external.po +++ b/l10n/sq/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/sr/files_external.po b/l10n/sr/files_external.po index e6b612a1bd..e11eca2dc5 100644 --- a/l10n/sr/files_external.po +++ b/l10n/sr/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/sr@latin/files_external.po b/l10n/sr@latin/files_external.po index f21d86b6b0..d23a68fce7 100644 --- a/l10n/sr@latin/files_external.po +++ b/l10n/sr@latin/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/sv/files_external.po b/l10n/sv/files_external.po index 74d585ed4b..1b6b3f2879 100644 --- a/l10n/sv/files_external.po +++ b/l10n/sv/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-05 02:02+0200\n" -"PO-Revision-Date: 2012-10-04 09:48+0000\n" -"Last-Translator: Magnus Höglund \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "Ange en giltig Dropbox nyckel och hemlighet." msgid "Error configuring Google Drive storage" msgstr "Fel vid konfigurering av Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Extern lagring" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Monteringspunkt" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Källa" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Konfiguration" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Alternativ" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Tillämplig" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Lägg till monteringspunkt" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Ingen angiven" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Alla användare" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Grupper" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Användare" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Radera" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Aktivera extern lagring för användare" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Tillåt användare att montera egen extern lagring" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL rotcertifikat" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Importera rotcertifikat" diff --git a/l10n/ta_LK/files_external.po b/l10n/ta_LK/files_external.po index 8bbabf7c15..9ecab2c360 100644 --- a/l10n/ta_LK/files_external.po +++ b/l10n/ta_LK/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 17:04+0000\n" -"Last-Translator: suganthi \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "தயவுசெய்து ஒரு செல்லுபடிய msgid "Error configuring Google Drive storage" msgstr "Google இயக்க சேமிப்பகத்தை தகமைப்பதில் வழு" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "வெளி சேமிப்பு" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "ஏற்றப்புள்ளி" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "பின்நிலை" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "தகவமைப்பு" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "தெரிவுகள்" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "பயன்படத்தக்க" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "ஏற்றப்புள்ளியை சேர்க்க" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "தொகுப்பில்லா" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "பயனாளர்கள் எல்லாம்" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "குழுக்கள்" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "பயனாளர்" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "நீக்குக" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "பயனாளர் அவர்களுடைய சொந்த வெளியக சேமிப்பை ஏற்ற அனுமதிக்க" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL வேர் சான்றிதழ்கள்" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "வேர் சான்றிதழை இறக்குமதி செய்க" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index de757f20d6..4a57f87cd1 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 29aabae972..776c8dc1ca 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index ee157c5a09..a7bf1b34f8 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index f9145fda2f..0f291829da 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,67 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting " +"of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:21 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:26 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:84 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:85 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:86 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:94 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:107 templates/settings.php:108 -#: templates/settings.php:148 templates/settings.php:149 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:123 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:124 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:138 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:157 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 740462f8b7..696968dc5f 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 4101d9e9bc..b8d633fcd8 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index e4ba32312d..64d7e1aea9 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 811ce5e2c5..7a3336fedb 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index ee7912484b..ff71625a05 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 61c2d797f4..cc6bf5674d 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-11 00:04+0100\n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/files_external.po b/l10n/th_TH/files_external.po index 352e137fc4..21a5b596fd 100644 --- a/l10n/th_TH/files_external.po +++ b/l10n/th_TH/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-04 02:04+0200\n" -"PO-Revision-Date: 2012-10-03 22:20+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "กรุณากรอกรหัส app key ของ Dropbox แล msgid "Error configuring Google Drive storage" msgstr "เกิดข้อผิดพลาดในการกำหนดค่าการจัดเก็บข้อมูลในพื้นที่ของ Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "พื้นทีจัดเก็บข้อมูลจากภายนอก" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "จุดชี้ตำแหน่ง" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "ด้านหลังระบบ" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "การกำหนดค่า" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "ตัวเลือก" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "สามารถใช้งานได้" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "เพิ่มจุดชี้ตำแหน่ง" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "ยังไม่มีการกำหนด" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "ผู้ใช้งานทั้งหมด" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "กลุ่ม" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "ผู้ใช้งาน" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "ลบ" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "เปิดให้มีการใช้พื้นที่จัดเก็บข้อมูลของผู้ใช้งานจากภายนอกได้" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "อนุญาตให้ผู้ใช้งานสามารถชี้ตำแหน่งไปที่พื้นที่จัดเก็บข้อมูลภายนอกของตนเองได้" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "ใบรับรองความปลอดภัยด้วยระบบ SSL จาก Root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "นำเข้าข้อมูลใบรับรองความปลอดภัยจาก Root" diff --git a/l10n/tr/files_external.po b/l10n/tr/files_external.po index e8236b8b4b..b545004333 100644 --- a/l10n/tr/files_external.po +++ b/l10n/tr/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-02 23:16+0200\n" -"PO-Revision-Date: 2012-10-02 21:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/uk/files_external.po b/l10n/uk/files_external.po index ce97ceed4c..be02b93b4e 100644 --- a/l10n/uk/files_external.po +++ b/l10n/uk/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:09+0100\n" -"PO-Revision-Date: 2012-11-26 15:31+0000\n" -"Last-Translator: skoptev \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Будь ласка, надайте дійсний ключ та пар msgid "Error configuring Google Drive storage" msgstr "Помилка при налаштуванні сховища Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Зовнішні сховища" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Точка монтування" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "Backend" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Налаштування" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Опції" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Придатний" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Додати точку монтування" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "Не встановлено" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Усі користувачі" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Групи" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Користувачі" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Видалити" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Активувати користувацькі зовнішні сховища" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Дозволити користувачам монтувати власні зовнішні сховища" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL корневі сертифікати" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Імпортувати корневі сертифікати" diff --git a/l10n/vi/files_external.po b/l10n/vi/files_external.po index 6a2d40fe7d..618214425b 100644 --- a/l10n/vi/files_external.po +++ b/l10n/vi/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-10 00:01+0100\n" -"PO-Revision-Date: 2012-11-09 11:30+0000\n" -"Last-Translator: Sơn Nguyễn \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,66 +43,80 @@ msgstr "Xin vui lòng cung cấp một ứng dụng Dropbox hợp lệ và mã b msgid "Error configuring Google Drive storage" msgstr "Lỗi cấu hình lưu trữ Google Drive" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "Lưu trữ ngoài" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "Điểm gắn" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "phụ trợ" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "Cấu hình" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "Tùy chọn" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "Áp dụng" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "Thêm điểm lắp" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "không" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "Tất cả người dùng" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "Nhóm" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "Người dùng" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "Xóa" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "Kích hoạt tính năng lưu trữ ngoài" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "Cho phép người dùng kết nối với lưu trữ riêng bên ngoài của họ" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "Chứng chỉ SSL root" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "Nhập Root Certificate" diff --git a/l10n/zh_CN.GB2312/files_external.po b/l10n/zh_CN.GB2312/files_external.po index 426e58b01a..5405371e71 100644 --- a/l10n/zh_CN.GB2312/files_external.po +++ b/l10n/zh_CN.GB2312/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-12 02:03+0200\n" -"PO-Revision-Date: 2012-10-11 23:47+0000\n" -"Last-Translator: marguerite su \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "请提供一个有效的 Dropbox app key 和 secret。" msgid "Error configuring Google Drive storage" msgstr "配置 Google Drive 存储失败" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "外部存储" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "挂载点" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "后端" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "配置" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "选项" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "可应用" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "添加挂载点" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "未设置" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "所有用户" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "群组" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "用户" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "删除" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "启用用户外部存储" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "允许用户挂载他们的外部存储" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL 根证书" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "导入根证书" diff --git a/l10n/zh_CN/files_external.po b/l10n/zh_CN/files_external.po index bcf873d163..bea3d10635 100644 --- a/l10n/zh_CN/files_external.po +++ b/l10n/zh_CN/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-10-25 02:07+0200\n" -"PO-Revision-Date: 2012-10-24 05:14+0000\n" -"Last-Translator: hanfeng \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "请提供有效的Dropbox应用key和secret" msgid "Error configuring Google Drive storage" msgstr "配置Google Drive存储时出错" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "外部存储" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "挂载点" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "后端" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "配置" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "选项" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "适用的" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "增加挂载点" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "未设置" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "所有用户" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "组" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "用户" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "删除" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "启用用户外部存储" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "允许用户挂载自有外部存储" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "SSL根证书" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "导入根证书" diff --git a/l10n/zh_HK/core.po b/l10n/zh_HK/core.po index cf8c42a059..5c659dbbe4 100644 --- a/l10n/zh_HK/core.po +++ b/l10n/zh_HK/core.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-19 00:01+0100\n" -"PO-Revision-Date: 2011-07-25 16:05+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:13+0100\n" +"PO-Revision-Date: 2012-12-11 07:28+0000\n" +"Last-Translator: amanda.shuuemura \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -137,8 +138,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 +#: js/share.js:545 msgid "Error" msgstr "" @@ -239,15 +240,15 @@ msgstr "" msgid "share" msgstr "" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:349 js/share.js:520 js/share.js:522 msgid "Password protected" msgstr "" -#: js/share.js:527 +#: js/share.js:533 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:539 +#: js/share.js:545 msgid "Error setting expiration date" msgstr "" @@ -514,7 +515,7 @@ msgstr "" #: templates/logout.php:1 msgid "You are logged out." -msgstr "" +msgstr "你已登出。" #: templates/part.pagenavi.php:3 msgid "prev" diff --git a/l10n/zh_HK/files_external.po b/l10n/zh_HK/files_external.po index 3264c27fca..c794bc276f 100644 --- a/l10n/zh_HK/files_external.po +++ b/l10n/zh_HK/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-19 00:01+0100\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" diff --git a/l10n/zh_TW/files_external.po b/l10n/zh_TW/files_external.po index ceb2a6c363..02bac3c88d 100644 --- a/l10n/zh_TW/files_external.po +++ b/l10n/zh_TW/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 14:30+0000\n" -"Last-Translator: dw4dev \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,66 +42,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "外部儲存裝置" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "掛載點" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "尚未設定" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "所有使用者" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "群組" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "使用者" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "刪除" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "匯入根憑證" diff --git a/l10n/zu_ZA/files_external.po b/l10n/zu_ZA/files_external.po index a049eb976d..c65140aefb 100644 --- a/l10n/zu_ZA/files_external.po +++ b/l10n/zu_ZA/files_external.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-06 00:00+0100\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,66 +41,80 @@ msgstr "" msgid "Error configuring Google Drive storage" msgstr "" +#: lib/config.php:434 +msgid "" +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " +"is not possible. Please ask your system administrator to install it." +msgstr "" + +#: lib/config.php:435 +msgid "" +"Warning: The FTP support in PHP is not enabled or installed. Mounting" +" of FTP shares is not possible. Please ask your system administrator to " +"install it." +msgstr "" + #: templates/settings.php:3 msgid "External Storage" msgstr "" -#: templates/settings.php:7 templates/settings.php:19 +#: templates/settings.php:8 templates/settings.php:22 msgid "Mount point" msgstr "" -#: templates/settings.php:8 +#: templates/settings.php:9 msgid "Backend" msgstr "" -#: templates/settings.php:9 +#: templates/settings.php:10 msgid "Configuration" msgstr "" -#: templates/settings.php:10 +#: templates/settings.php:11 msgid "Options" msgstr "" -#: templates/settings.php:11 +#: templates/settings.php:12 msgid "Applicable" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:27 msgid "Add mount point" msgstr "" -#: templates/settings.php:54 templates/settings.php:62 +#: templates/settings.php:85 msgid "None set" msgstr "" -#: templates/settings.php:63 +#: templates/settings.php:86 msgid "All Users" msgstr "" -#: templates/settings.php:64 +#: templates/settings.php:87 msgid "Groups" msgstr "" -#: templates/settings.php:69 +#: templates/settings.php:95 msgid "Users" msgstr "" -#: templates/settings.php:77 templates/settings.php:107 +#: templates/settings.php:108 templates/settings.php:109 +#: templates/settings.php:149 templates/settings.php:150 msgid "Delete" msgstr "" -#: templates/settings.php:87 +#: templates/settings.php:124 msgid "Enable User External Storage" msgstr "" -#: templates/settings.php:88 +#: templates/settings.php:125 msgid "Allow users to mount their own external storage" msgstr "" -#: templates/settings.php:99 +#: templates/settings.php:139 msgid "SSL root certificates" msgstr "" -#: templates/settings.php:113 +#: templates/settings.php:158 msgid "Import Root Certificate" msgstr "" From c938a4f791182d86045a45bcffda37c1b6e651f8 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Wed, 12 Dec 2012 12:34:28 +0100 Subject: [PATCH 466/481] feedback to the user while request is being processed --- core/js/share.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/js/share.js b/core/js/share.js index 9f71f1bb66..df5ebf008b 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -170,7 +170,7 @@ OC.Share={ html += ''; html += ''; html += ''; - html += ''; + html += ''; html += ''; } html += '
    '; @@ -564,7 +564,14 @@ $(document).ready(function() { var file = $('tr').filterAttr('data-id', String(itemSource)).data('file'); var email = $('#email').val(); if (email != '') { - $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'email', toaddress: email, link: link, itemType: itemType, itemSource: itemSource, file: file}, function(result) { + $('#email').attr('disabled', "disabled"); + $('#email').val(t('core', 'Sending ...')); + $('#emailButton').attr('disabled', "disabled"); + + $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'email', toaddress: email, link: link, itemType: itemType, itemSource: itemSource, file: file}, + function(result) { + $('#email').attr('disabled', "false"); + $('#emailButton').attr('disabled', "false"); if (result && result.status == 'success') { $('#email').css('font-weight', 'bold'); $('#email').animate({ fontWeight: 'normal' }, 2000, function() { From b8b64d6ffc0645f5806d7120e337c2652e49c2e7 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Wed, 12 Dec 2012 11:46:43 +0100 Subject: [PATCH 467/481] set the session name to the instance id - which is unique Conflicts: lib/base.php --- lib/base.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/base.php b/lib/base.php index 8862845261..0b75f6f085 100644 --- a/lib/base.php +++ b/lib/base.php @@ -289,6 +289,9 @@ class OC{ // prevents javascript from accessing php session cookies ini_set('session.cookie_httponly', '1;'); + // set the session name to the instance id - which is unique + session_name(OC_Util::getInstanceId()); + // (re)-initialize session session_start(); From 84420035dfa1176a156b837e55bc3ac4ca946840 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Wed, 12 Dec 2012 20:09:57 +0100 Subject: [PATCH 468/481] throwing InsufficientStorage in case the quota is reached --- lib/connector/sabre/quotaplugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/connector/sabre/quotaplugin.php b/lib/connector/sabre/quotaplugin.php index a56a65ad86..fbbb4a3cf6 100644 --- a/lib/connector/sabre/quotaplugin.php +++ b/lib/connector/sabre/quotaplugin.php @@ -51,7 +51,7 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin { } list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri); if ($length > OC_Filesystem::free_space($parentUri)) { - throw new Sabre_DAV_Exception('Quota exceeded. File is too big.'); + throw new Sabre_DAV_Exception_InsufficientStorage(); } } return true; From 9d8bdff51b25544bacda1ec13e3e41871547b091 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 12 Dec 2012 22:40:08 +0100 Subject: [PATCH 469/481] =?UTF-8?q?tweak=20icons=20for=20username=20and=20?= =?UTF-8?q?password=20fields,=20now=20it=E2=80=99s=20good?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/css/styles.css | 12 ++++++++---- core/img/actions/password.svg | 34 ++++----------------------------- core/img/actions/user.svg | 8 ++++---- core/templates/installation.php | 2 ++ core/templates/login.php | 2 ++ 5 files changed, 20 insertions(+), 38 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 01ae5f1f06..c85fa74df8 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -121,10 +121,14 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b /* Icons for username and password fields to better recognize them */ -#adminlogin, #adminpass, #user, #password { padding-left:1.6em; background-repeat:no-repeat; background-position:.4em .75em; } -#adminlogin+label, #adminpass+label, #user+label, #password+label { left:2em; } -#adminlogin, #user { background-image:url('../img/actions/user.svg'); } -#adminpass, #password { background-image:url('../img/actions/password.svg'); } +#adminlogin, #adminpass, #user, #password { width:11.7em!important; padding-left:1.8em; } +#adminlogin+label, #adminpass+label, #user+label, #password+label { left:2.2em; } +#adminlogin+label+img, #adminpass+label+img, #user+label+img, #password+label+img { + position:absolute; left:1.25em; top:1.65em; + opacity:.3; +} +#adminpass+label+img, #password+label+img { top:1.1em; } + /* Nicely grouping input field sets */ .grouptop input { diff --git a/core/img/actions/password.svg b/core/img/actions/password.svg index 4369a8cfa5..ee6a9fe018 100644 --- a/core/img/actions/password.svg +++ b/core/img/actions/password.svg @@ -27,7 +27,7 @@ image/svg+xml - + @@ -2141,34 +2141,8 @@ - - + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:1" + d="M 3 6 C 1.8954305 6 1 6.8954305 1 8 C 1 9.1045695 1.8954305 10 3 10 C 4.1045695 10 5 9.1045695 5 8 C 5 6.8954305 4.1045695 6 3 6 z M 8 6 C 6.8954305 6 6 6.8954305 6 8 C 6 9.1045695 6.8954305 10 8 10 C 9.1045695 10 10 9.1045695 10 8 C 10 6.8954305 9.1045695 6 8 6 z M 13 6 C 11.895431 6 11 6.8954305 11 8 C 11 9.1045695 11.895431 10 13 10 C 14.104569 10 15 9.1045695 15 8 C 15 6.8954305 14.104569 6 13 6 z " + id="path3750" /> diff --git a/core/img/actions/user.svg b/core/img/actions/user.svg index f5ac9088c6..6d0dc714ce 100644 --- a/core/img/actions/user.svg +++ b/core/img/actions/user.svg @@ -27,7 +27,7 @@ image/svg+xml - + @@ -47,8 +47,8 @@ showguides="true" inkscape:guide-bbox="true" inkscape:zoom="16" - inkscape:cx="7.0131695" - inkscape:cy="5.1911759" + inkscape:cx="6.2464037" + inkscape:cy="5.7411894" inkscape:window-x="0" inkscape:window-y="27" inkscape:window-maximized="1" @@ -1690,7 +1690,7 @@ id="g4146"> diff --git a/core/templates/installation.php b/core/templates/installation.php index 6e36cd3dc2..28fbf29b54 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -37,10 +37,12 @@

    +

    +

    diff --git a/core/templates/login.php b/core/templates/login.php index 53e2e9da2c..153d1b50a3 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -19,10 +19,12 @@

    autocomplete="on" required /> +

    /> +

    From e7c4a2c8e14b1b52114d16fe9756131f007aaddf Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 13 Dec 2012 00:12:21 +0100 Subject: [PATCH 470/481] ungreenify new & upload buttons --- apps/files/css/files.css | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 9bd92c9258..afc72916e0 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -8,15 +8,9 @@ #new { height:17px; margin:0 0 0 1em; z-index:1010; float:left; - background-color:#5bb75b; - border:1px solid; border-color:#51a351 #419341 #387038; - -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; - -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; - box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } -#new:hover, #upload:hover { background-color:#4b964b; } #new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } -#new>a { padding:.5em 1.2em .3em; color:#fff; text-shadow:0 1px 0 #51a351; } +#new>a { padding:.5em 1.2em .3em; } #new>ul { display:none; position:fixed; min-width:7em; z-index:-1; padding:.5em; margin-top:0.075em; margin-left:-.5em; @@ -31,15 +25,11 @@ #upload { height:27px; padding:0; margin-left:0.2em; overflow:hidden; - color:#fff; text-shadow:0 1px 0 #51a351; - border-color:#51a351 #419341 #387038; - box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; - background-color:#5bb75b; } #upload a { position:relative; display:block; width:100%; height:27px; cursor:pointer; z-index:1000; - background-image:url('%webroot%/core/img/actions/upload-white.svg'); + background-image:url('%webroot%/core/img/actions/upload.svg'); background-repeat:no-repeat; background-position:7px 6px; } From 8686a448c738bf7b2b0264d79557b976b2dca478 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 13 Dec 2012 00:18:20 +0100 Subject: [PATCH 471/481] [tx-robot] updated from transifex --- apps/files_external/l10n/ar.php | 5 + apps/files_external/l10n/bg_BG.php | 4 + apps/files_external/l10n/es.php | 2 + apps/files_external/l10n/es_AR.php | 2 + apps/files_external/l10n/fa.php | 5 + apps/files_external/l10n/hr.php | 5 + apps/files_external/l10n/hu_HU.php | 5 + apps/files_external/l10n/ia.php | 5 + apps/files_external/l10n/it.php | 2 + apps/files_external/l10n/ja_JP.php | 2 + apps/files_external/l10n/ka_GE.php | 5 + apps/files_external/l10n/ku_IQ.php | 3 + apps/files_external/l10n/lb.php | 4 + apps/files_external/l10n/lv.php | 5 + apps/files_external/l10n/mk.php | 5 + apps/files_external/l10n/ms_MY.php | 5 + apps/files_external/l10n/nn_NO.php | 5 + apps/files_external/l10n/oc.php | 5 + apps/files_external/l10n/pl.php | 2 + apps/files_external/l10n/sr.php | 5 + apps/files_external/l10n/sr@latin.php | 5 + apps/files_external/l10n/tr.php | 5 + apps/files_external/l10n/uk.php | 2 + l10n/ar/core.po | 150 +++++++++++++++---------- l10n/ar/files_external.po | 10 +- l10n/bg_BG/core.po | 150 +++++++++++++++---------- l10n/bg_BG/files_external.po | 8 +- l10n/ca/core.po | 82 ++++++++++---- l10n/ca/files_external.po | 4 +- l10n/cs_CZ/core.po | 152 ++++++++++++++++---------- l10n/cs_CZ/files_external.po | 4 +- l10n/da/core.po | 150 +++++++++++++++---------- l10n/da/files_external.po | 4 +- l10n/de/core.po | 82 ++++++++++---- l10n/de/files_external.po | 4 +- l10n/de_DE/core.po | 82 ++++++++++---- l10n/de_DE/files_external.po | 4 +- l10n/el/core.po | 82 ++++++++++---- l10n/el/files_external.po | 4 +- l10n/eo/core.po | 82 ++++++++++---- l10n/eo/files_external.po | 4 +- l10n/es/core.po | 82 ++++++++++---- l10n/es/files_external.po | 11 +- l10n/es_AR/core.po | 82 ++++++++++---- l10n/es_AR/files_external.po | 11 +- l10n/et_EE/core.po | 150 +++++++++++++++---------- l10n/et_EE/files_external.po | 4 +- l10n/eu/core.po | 82 ++++++++++---- l10n/eu/files_external.po | 4 +- l10n/fa/core.po | 150 +++++++++++++++---------- l10n/fa/files_external.po | 10 +- l10n/fi_FI/core.po | 152 ++++++++++++++++---------- l10n/fi_FI/files_external.po | 4 +- l10n/fr/core.po | 82 ++++++++++---- l10n/fr/files_external.po | 4 +- l10n/gl/core.po | 82 ++++++++++---- l10n/gl/files_external.po | 4 +- l10n/he/core.po | 82 ++++++++++---- l10n/he/files_external.po | 4 +- l10n/hi/core.po | 150 +++++++++++++++---------- l10n/hi/files_external.po | 4 +- l10n/hr/core.po | 150 +++++++++++++++---------- l10n/hr/files_external.po | 10 +- l10n/hu_HU/core.po | 150 +++++++++++++++---------- l10n/hu_HU/files_external.po | 10 +- l10n/ia/core.po | 150 +++++++++++++++---------- l10n/ia/files_external.po | 10 +- l10n/id/core.po | 150 +++++++++++++++---------- l10n/id/files_external.po | 4 +- l10n/is/core.po | 82 ++++++++++---- l10n/is/files_external.po | 4 +- l10n/it/core.po | 82 ++++++++++---- l10n/it/files_external.po | 10 +- l10n/ja_JP/core.po | 82 ++++++++++---- l10n/ja_JP/files_external.po | 11 +- l10n/ka_GE/core.po | 150 +++++++++++++++---------- l10n/ka_GE/files_external.po | 10 +- l10n/ko/core.po | 82 ++++++++++---- l10n/ko/files_external.po | 4 +- l10n/ku_IQ/core.po | 150 +++++++++++++++---------- l10n/ku_IQ/files_external.po | 6 +- l10n/lb/core.po | 150 +++++++++++++++---------- l10n/lb/files_external.po | 8 +- l10n/lt_LT/core.po | 150 +++++++++++++++---------- l10n/lt_LT/files_external.po | 4 +- l10n/lv/core.po | 150 +++++++++++++++---------- l10n/lv/files_external.po | 10 +- l10n/mk/core.po | 150 +++++++++++++++---------- l10n/mk/files_external.po | 10 +- l10n/ms_MY/core.po | 150 +++++++++++++++---------- l10n/ms_MY/files_external.po | 10 +- l10n/nb_NO/core.po | 150 +++++++++++++++---------- l10n/nb_NO/files_external.po | 4 +- l10n/nl/core.po | 82 ++++++++++---- l10n/nl/files_external.po | 4 +- l10n/nn_NO/core.po | 150 +++++++++++++++---------- l10n/nn_NO/files_external.po | 10 +- l10n/oc/core.po | 150 +++++++++++++++---------- l10n/oc/files_external.po | 10 +- l10n/pl/core.po | 82 ++++++++++---- l10n/pl/files_external.po | 11 +- l10n/pl_PL/core.po | 150 +++++++++++++++---------- l10n/pl_PL/files_external.po | 4 +- l10n/pt_BR/core.po | 82 ++++++++++---- l10n/pt_BR/files_external.po | 4 +- l10n/pt_PT/core.po | 82 ++++++++++---- l10n/pt_PT/files_external.po | 4 +- l10n/ro/core.po | 150 +++++++++++++++---------- l10n/ro/files_external.po | 4 +- l10n/ru/core.po | 82 ++++++++++---- l10n/ru/files_external.po | 4 +- l10n/ru_RU/core.po | 152 ++++++++++++++++---------- l10n/ru_RU/files_external.po | 4 +- l10n/si_LK/core.po | 150 +++++++++++++++---------- l10n/si_LK/files_external.po | 4 +- l10n/sk_SK/core.po | 82 ++++++++++---- l10n/sk_SK/files_external.po | 4 +- l10n/sl/core.po | 82 ++++++++++---- l10n/sl/files_external.po | 4 +- l10n/sq/core.po | 82 ++++++++++---- l10n/sq/files_external.po | 4 +- l10n/sr/core.po | 82 ++++++++++---- l10n/sr/files_external.po | 10 +- l10n/sr@latin/core.po | 150 +++++++++++++++---------- l10n/sr@latin/files_external.po | 10 +- l10n/sv/core.po | 152 ++++++++++++++++---------- l10n/sv/files_external.po | 4 +- l10n/ta_LK/core.po | 152 ++++++++++++++++---------- l10n/ta_LK/files_external.po | 4 +- l10n/templates/core.pot | 78 +++++++++---- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/th_TH/core.po | 82 ++++++++++---- l10n/th_TH/files_external.po | 4 +- l10n/tr/core.po | 82 ++++++++++---- l10n/tr/files_external.po | 10 +- l10n/uk/core.po | 82 ++++++++++---- l10n/uk/files_external.po | 10 +- l10n/vi/core.po | 82 ++++++++++---- l10n/vi/files_external.po | 4 +- l10n/zh_CN.GB2312/core.po | 150 +++++++++++++++---------- l10n/zh_CN.GB2312/files_external.po | 4 +- l10n/zh_CN/core.po | 82 ++++++++++---- l10n/zh_CN/files_external.po | 4 +- l10n/zh_HK/core.po | 82 ++++++++++---- l10n/zh_HK/files_external.po | 4 +- l10n/zh_TW/core.po | 82 ++++++++++---- l10n/zh_TW/files_external.po | 4 +- l10n/zu_ZA/core.po | 150 +++++++++++++++---------- l10n/zu_ZA/files_external.po | 4 +- 157 files changed, 5195 insertions(+), 2578 deletions(-) create mode 100644 apps/files_external/l10n/ar.php create mode 100644 apps/files_external/l10n/bg_BG.php create mode 100644 apps/files_external/l10n/fa.php create mode 100644 apps/files_external/l10n/hr.php create mode 100644 apps/files_external/l10n/hu_HU.php create mode 100644 apps/files_external/l10n/ia.php create mode 100644 apps/files_external/l10n/ka_GE.php create mode 100644 apps/files_external/l10n/ku_IQ.php create mode 100644 apps/files_external/l10n/lb.php create mode 100644 apps/files_external/l10n/lv.php create mode 100644 apps/files_external/l10n/mk.php create mode 100644 apps/files_external/l10n/ms_MY.php create mode 100644 apps/files_external/l10n/nn_NO.php create mode 100644 apps/files_external/l10n/oc.php create mode 100644 apps/files_external/l10n/sr.php create mode 100644 apps/files_external/l10n/sr@latin.php create mode 100644 apps/files_external/l10n/tr.php diff --git a/apps/files_external/l10n/ar.php b/apps/files_external/l10n/ar.php new file mode 100644 index 0000000000..06837d5085 --- /dev/null +++ b/apps/files_external/l10n/ar.php @@ -0,0 +1,5 @@ + "مجموعات", +"Users" => "المستخدمين", +"Delete" => "حذف" +); diff --git a/apps/files_external/l10n/bg_BG.php b/apps/files_external/l10n/bg_BG.php new file mode 100644 index 0000000000..4877958184 --- /dev/null +++ b/apps/files_external/l10n/bg_BG.php @@ -0,0 +1,4 @@ + "Групи", +"Delete" => "Изтриване" +); diff --git a/apps/files_external/l10n/es.php b/apps/files_external/l10n/es.php index 32a0d89687..d4e5662764 100644 --- a/apps/files_external/l10n/es.php +++ b/apps/files_external/l10n/es.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Rellenar todos los campos requeridos", "Please provide a valid Dropbox app key and secret." => "Por favor , proporcione un secreto y una contraseña válida de la app Dropbox.", "Error configuring Google Drive storage" => "Error configurando el almacenamiento de Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.", "External Storage" => "Almacenamiento externo", "Mount point" => "Punto de montaje", "Backend" => "Motor", diff --git a/apps/files_external/l10n/es_AR.php b/apps/files_external/l10n/es_AR.php index 055fbe782e..aa117e8027 100644 --- a/apps/files_external/l10n/es_AR.php +++ b/apps/files_external/l10n/es_AR.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Rellenar todos los campos requeridos", "Please provide a valid Dropbox app key and secret." => "Por favor, proporcioná un secreto y una contraseña válida para la aplicación Dropbox.", "Error configuring Google Drive storage" => "Error al configurar el almacenamiento de Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.", "External Storage" => "Almacenamiento externo", "Mount point" => "Punto de montaje", "Backend" => "Motor", diff --git a/apps/files_external/l10n/fa.php b/apps/files_external/l10n/fa.php new file mode 100644 index 0000000000..b866201361 --- /dev/null +++ b/apps/files_external/l10n/fa.php @@ -0,0 +1,5 @@ + "گروه ها", +"Users" => "کاربران", +"Delete" => "حذف" +); diff --git a/apps/files_external/l10n/hr.php b/apps/files_external/l10n/hr.php new file mode 100644 index 0000000000..24f27ddf81 --- /dev/null +++ b/apps/files_external/l10n/hr.php @@ -0,0 +1,5 @@ + "Grupe", +"Users" => "Korisnici", +"Delete" => "Obriši" +); diff --git a/apps/files_external/l10n/hu_HU.php b/apps/files_external/l10n/hu_HU.php new file mode 100644 index 0000000000..e915c34b95 --- /dev/null +++ b/apps/files_external/l10n/hu_HU.php @@ -0,0 +1,5 @@ + "Csoportok", +"Users" => "Felhasználók", +"Delete" => "Törlés" +); diff --git a/apps/files_external/l10n/ia.php b/apps/files_external/l10n/ia.php new file mode 100644 index 0000000000..f57f96688b --- /dev/null +++ b/apps/files_external/l10n/ia.php @@ -0,0 +1,5 @@ + "Gruppos", +"Users" => "Usatores", +"Delete" => "Deler" +); diff --git a/apps/files_external/l10n/it.php b/apps/files_external/l10n/it.php index 49effebdfc..98c83146d4 100644 --- a/apps/files_external/l10n/it.php +++ b/apps/files_external/l10n/it.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Compila tutti i campi richiesti", "Please provide a valid Dropbox app key and secret." => "Fornisci chiave di applicazione e segreto di Dropbox validi.", "Error configuring Google Drive storage" => "Errore durante la configurazione dell'archivio Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Avviso: \"smbclient\" non è installato. Impossibile montare condivisioni CIFS/SMB. Chiedi all'amministratore di sistema di installarlo.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Avviso: il supporto FTP di PHP non è abilitato o non è installato. Impossibile montare condivisioni FTP. Chiedi all'amministratore di sistema di installarlo.", "External Storage" => "Archiviazione esterna", "Mount point" => "Punto di mount", "Backend" => "Motore", diff --git a/apps/files_external/l10n/ja_JP.php b/apps/files_external/l10n/ja_JP.php index 92f74ce9f7..cd09bb43db 100644 --- a/apps/files_external/l10n/ja_JP.php +++ b/apps/files_external/l10n/ja_JP.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "すべての必須フィールドを埋めて下さい", "Please provide a valid Dropbox app key and secret." => "有効なDropboxアプリのキーとパスワードを入力して下さい。", "Error configuring Google Drive storage" => "Googleドライブストレージの設定エラー", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "警告: \"smbclient\" はインストールされていません。CIFS/SMB 共有のマウントはできません。システム管理者にインストールをお願いして下さい。", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "警告: PHPのFTPサポートは無効もしくはインストールされていません。FTP共有のマウントはできません。システム管理者にインストールをお願いして下さい。", "External Storage" => "外部ストレージ", "Mount point" => "マウントポイント", "Backend" => "バックエンド", diff --git a/apps/files_external/l10n/ka_GE.php b/apps/files_external/l10n/ka_GE.php new file mode 100644 index 0000000000..efccca9fd7 --- /dev/null +++ b/apps/files_external/l10n/ka_GE.php @@ -0,0 +1,5 @@ + "ჯგუფები", +"Users" => "მომხმარებელი", +"Delete" => "წაშლა" +); diff --git a/apps/files_external/l10n/ku_IQ.php b/apps/files_external/l10n/ku_IQ.php new file mode 100644 index 0000000000..c614168d77 --- /dev/null +++ b/apps/files_external/l10n/ku_IQ.php @@ -0,0 +1,3 @@ + "به‌كارهێنه‌ر" +); diff --git a/apps/files_external/l10n/lb.php b/apps/files_external/l10n/lb.php new file mode 100644 index 0000000000..7cbfaea6a5 --- /dev/null +++ b/apps/files_external/l10n/lb.php @@ -0,0 +1,4 @@ + "Gruppen", +"Delete" => "Läschen" +); diff --git a/apps/files_external/l10n/lv.php b/apps/files_external/l10n/lv.php new file mode 100644 index 0000000000..26452f98b0 --- /dev/null +++ b/apps/files_external/l10n/lv.php @@ -0,0 +1,5 @@ + "Grupas", +"Users" => "Lietotāji", +"Delete" => "Izdzēst" +); diff --git a/apps/files_external/l10n/mk.php b/apps/files_external/l10n/mk.php new file mode 100644 index 0000000000..8fde4fcde0 --- /dev/null +++ b/apps/files_external/l10n/mk.php @@ -0,0 +1,5 @@ + "Групи", +"Users" => "Корисници", +"Delete" => "Избриши" +); diff --git a/apps/files_external/l10n/ms_MY.php b/apps/files_external/l10n/ms_MY.php new file mode 100644 index 0000000000..2fdb089ebc --- /dev/null +++ b/apps/files_external/l10n/ms_MY.php @@ -0,0 +1,5 @@ + "Kumpulan", +"Users" => "Pengguna", +"Delete" => "Padam" +); diff --git a/apps/files_external/l10n/nn_NO.php b/apps/files_external/l10n/nn_NO.php new file mode 100644 index 0000000000..4b4b6167d8 --- /dev/null +++ b/apps/files_external/l10n/nn_NO.php @@ -0,0 +1,5 @@ + "Grupper", +"Users" => "Brukarar", +"Delete" => "Slett" +); diff --git a/apps/files_external/l10n/oc.php b/apps/files_external/l10n/oc.php new file mode 100644 index 0000000000..47db011473 --- /dev/null +++ b/apps/files_external/l10n/oc.php @@ -0,0 +1,5 @@ + "Grops", +"Users" => "Usancièrs", +"Delete" => "Escafa" +); diff --git a/apps/files_external/l10n/pl.php b/apps/files_external/l10n/pl.php index 00514e59a5..0da31bb6b4 100644 --- a/apps/files_external/l10n/pl.php +++ b/apps/files_external/l10n/pl.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Wypełnij wszystkie wymagane pola", "Please provide a valid Dropbox app key and secret." => "Proszę podać prawidłowy klucz aplikacji Dropbox i klucz sekretny.", "Error configuring Google Drive storage" => "Wystąpił błąd podczas konfigurowania zasobu Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Ostrzeżenie: \"smbclient\" nie jest zainstalowany. Zamontowanie katalogów CIFS/SMB nie jest możliwe. Skontaktuj sie z administratorem w celu zainstalowania.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Ostrzeżenie: Wsparcie dla FTP w PHP nie jest zainstalowane lub włączone. Skontaktuj sie z administratorem w celu zainstalowania lub włączenia go.", "External Storage" => "Zewnętrzna zasoby dyskowe", "Mount point" => "Punkt montowania", "Backend" => "Zaplecze", diff --git a/apps/files_external/l10n/sr.php b/apps/files_external/l10n/sr.php new file mode 100644 index 0000000000..2554c498dd --- /dev/null +++ b/apps/files_external/l10n/sr.php @@ -0,0 +1,5 @@ + "Групе", +"Users" => "Корисници", +"Delete" => "Обриши" +); diff --git a/apps/files_external/l10n/sr@latin.php b/apps/files_external/l10n/sr@latin.php new file mode 100644 index 0000000000..24f27ddf81 --- /dev/null +++ b/apps/files_external/l10n/sr@latin.php @@ -0,0 +1,5 @@ + "Grupe", +"Users" => "Korisnici", +"Delete" => "Obriši" +); diff --git a/apps/files_external/l10n/tr.php b/apps/files_external/l10n/tr.php new file mode 100644 index 0000000000..c5e9f8f892 --- /dev/null +++ b/apps/files_external/l10n/tr.php @@ -0,0 +1,5 @@ + "Gruplar", +"Users" => "Kullanıcılar", +"Delete" => "Sil" +); diff --git a/apps/files_external/l10n/uk.php b/apps/files_external/l10n/uk.php index 478342380e..56169171f6 100644 --- a/apps/files_external/l10n/uk.php +++ b/apps/files_external/l10n/uk.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Заповніть всі обов'язкові поля", "Please provide a valid Dropbox app key and secret." => "Будь ласка, надайте дійсний ключ та пароль Dropbox.", "Error configuring Google Drive storage" => "Помилка при налаштуванні сховища Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Попередження: Клієнт \"smbclient\" не встановлено. Під'єднанатися до CIFS/SMB тек неможливо. Попрохайте системного адміністратора встановити його.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Попередження: Підтримка FTP в PHP не увімкнута чи не встановлена. Під'єднанатися до FTP тек неможливо. Попрохайте системного адміністратора встановити її.", "External Storage" => "Зовнішні сховища", "Mount point" => "Точка монтування", "Backend" => "Backend", diff --git a/l10n/ar/core.po b/l10n/ar/core.po index 06b34280ef..4671747f75 100644 --- a/l10n/ar/core.po +++ b/l10n/ar/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "تعديلات" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "كلمة السر" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "إلغاء مشاركة" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -403,87 +443,87 @@ msgstr "خادم قاعدة البيانات" msgid "Finish setup" msgstr "انهاء التعديلات" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "الاحد" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "الأثنين" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "الثلاثاء" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "الاربعاء" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "الخميس" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "الجمعه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "السبت" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "كانون الثاني" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "شباط" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "آذار" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "نيسان" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "أيار" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "حزيران" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "تموز" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "آب" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "أيلول" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "تشرين الاول" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "تشرين الثاني" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "كانون الاول" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "خدمات الوب تحت تصرفك" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "الخروج" diff --git a/l10n/ar/files_external.po b/l10n/ar/files_external.po index 2a0ec9bd5e..a4a00601d1 100644 --- a/l10n/ar/files_external.po +++ b/l10n/ar/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "مجموعات" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "المستخدمين" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "حذف" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/bg_BG/core.po b/l10n/bg_BG/core.po index 1bb3279a2d..f40f16cbec 100644 --- a/l10n/bg_BG/core.po +++ b/l10n/bg_BG/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -21,6 +21,30 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -59,59 +83,59 @@ msgstr "Няма избрани категории за изтриване" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Настройки" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Грешка" @@ -154,7 +178,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -191,70 +215,86 @@ msgstr "" msgid "Password" msgstr "Парола" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -406,87 +446,87 @@ msgstr "Хост за базата" msgid "Finish setup" msgstr "Завършване на настройките" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Неделя" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Понеделник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Сряда" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Четвъртък" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Петък" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Събота" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Януари" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Февруари" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Май" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Юни" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Юли" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Септември" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Октомври" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Ноември" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Декември" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Изход" diff --git a/l10n/bg_BG/files_external.po b/l10n/bg_BG/files_external.po index d0a0c22c21..d4483eadff 100644 --- a/l10n/bg_BG/files_external.po +++ b/l10n/bg_BG/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" @@ -92,7 +92,7 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Групи" #: templates/settings.php:95 msgid "Users" @@ -101,7 +101,7 @@ msgstr "" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Изтриване" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/ca/core.po b/l10n/ca/core.po index 010ddb24cb..16f02963fd 100644 --- a/l10n/ca/core.po +++ b/l10n/ca/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-17 00:01+0100\n" -"PO-Revision-Date: 2012-11-16 08:21+0000\n" -"Last-Translator: rogerc \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "No s'ha especificat el tipus de categoria." @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "No s'ha especificat el tipus d'objecte." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Error" @@ -152,7 +176,7 @@ msgstr "No s'ha especificat el nom de l'aplicació." msgid "The required file {file} is not installed!" msgstr "El figtxer requerit {file} no està instal·lat!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Error en compartir" @@ -189,70 +213,86 @@ msgstr "Protegir amb contrasenya" msgid "Password" msgstr "Contrasenya" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Estableix la data d'expiració" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data d'expiració" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Comparteix per correu electrònic" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "No s'ha trobat ningú" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "No es permet compartir de nou" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Compartit en {item} amb {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Deixa de compartir" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "pot editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "control d'accés" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "crea" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "actualitza" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "elimina" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "comparteix" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protegeix amb contrasenya" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Error en eliminar la data d'expiració" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Error en establir la data d'expiració" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "estableix de nou la contrasenya Owncloud" diff --git a/l10n/ca/files_external.po b/l10n/ca/files_external.po index d1d086ad2d..3a881bba47 100644 --- a/l10n/ca/files_external.po +++ b/l10n/ca/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po index 2f47e270ac..4d68bbb03c 100644 --- a/l10n/cs_CZ/core.po +++ b/l10n/cs_CZ/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-15 10:10+0000\n" -"Last-Translator: Tomáš Chvátal \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Nezadán typ kategorie." @@ -59,59 +83,59 @@ msgstr "Žádné kategorie nebyly vybrány ke smazání." msgid "Error removing %s from favorites." msgstr "Chyba při odebírání %s z oblíbených." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Nastavení" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "před pár vteřinami" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "před minutou" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "před {minutes} minutami" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "před hodinou" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "před {hours} hodinami" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "dnes" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "včera" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "před {days} dny" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "minulý mesíc" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "před {months} měsíci" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "před měsíci" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "minulý rok" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "před lety" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "Není určen typ objektu." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Chyba" @@ -154,7 +178,7 @@ msgstr "Není určen název aplikace." msgid "The required file {file} is not installed!" msgstr "Požadovaný soubor {file} není nainstalován." -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Chyba při sdílení" @@ -191,70 +215,86 @@ msgstr "Chránit heslem" msgid "Password" msgstr "Heslo" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Nastavit datum vypršení platnosti" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Datum vypršení platnosti" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Sdílet e-mailem:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Žádní lidé nenalezeni" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Sdílení již sdílené položky není povoleno" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Sdíleno v {item} s {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Zrušit sdílení" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "lze upravovat" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "řízení přístupu" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "vytvořit" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "aktualizovat" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "smazat" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "sdílet" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Chráněno heslem" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Chyba při odstraňování data vypršení platnosti" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Chyba při nastavení data vypršení platnosti" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Obnovení hesla pro ownCloud" @@ -406,87 +446,87 @@ msgstr "Hostitel databáze" msgid "Finish setup" msgstr "Dokončit nastavení" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Neděle" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Pondělí" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Úterý" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Středa" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Čtvrtek" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Pátek" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sobota" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Leden" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Únor" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Březen" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Duben" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Květen" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Červen" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Červenec" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Srpen" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Září" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Říjen" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Listopad" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Prosinec" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "webové služby pod Vaší kontrolou" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Odhlásit se" diff --git a/l10n/cs_CZ/files_external.po b/l10n/cs_CZ/files_external.po index 6bc1bffb5c..92aafaa297 100644 --- a/l10n/cs_CZ/files_external.po +++ b/l10n/cs_CZ/files_external.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/da/core.po b/l10n/da/core.po index bfb971646b..01fdc7642c 100644 --- a/l10n/da/core.po +++ b/l10n/da/core.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" @@ -24,6 +24,30 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -62,59 +86,59 @@ msgstr "Ingen kategorier valgt" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Indstillinger" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekunder siden" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minut siden" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minutter siden" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "i dag" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "i går" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} dage siden" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "sidste måned" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "måneder siden" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "sidste år" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "år siden" @@ -144,8 +168,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fejl" @@ -157,7 +181,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Fejl under deling" @@ -194,70 +218,86 @@ msgstr "Beskyt med adgangskode" msgid "Password" msgstr "Kodeord" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Vælg udløbsdato" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Udløbsdato" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Del via email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ingen personer fundet" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Videredeling ikke tilladt" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Delt i {item} med {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Fjern deling" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kan redigere" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Adgangskontrol" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "opret" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "opdater" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "slet" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "del" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Beskyttet med adgangskode" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Fejl ved fjernelse af udløbsdato" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Fejl under sætning af udløbsdato" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Nulstil ownCloud kodeord" @@ -409,87 +449,87 @@ msgstr "Databasehost" msgid "Finish setup" msgstr "Afslut opsætning" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Mandag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tirsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Lørdag" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Marts" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "December" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "Webtjenester under din kontrol" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Log ud" diff --git a/l10n/da/files_external.po b/l10n/da/files_external.po index 4e52e67330..804a2489d0 100644 --- a/l10n/da/files_external.po +++ b/l10n/da/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/de/core.po b/l10n/de/core.po index 5171950e1a..fa82ef3b2e 100644 --- a/l10n/de/core.po +++ b/l10n/de/core.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 09:33+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,6 +31,30 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Kategorie nicht angegeben." @@ -151,8 +175,8 @@ msgid "The object type is not specified." msgstr "Der Objekttyp ist nicht angegeben." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fehler" @@ -164,7 +188,7 @@ msgstr "Der App-Name ist nicht angegeben." msgid "The required file {file} is not installed!" msgstr "Die benötigte Datei {file} ist nicht installiert." -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Fehler beim Freigeben" @@ -201,70 +225,86 @@ msgstr "Passwortschutz" msgid "Password" msgstr "Passwort" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Setze ein Ablaufdatum" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Ablaufdatum" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Über eine E-Mail freigeben:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Niemand gefunden" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Weiterverteilen ist nicht erlaubt" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Für {user} in {item} freigegeben" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Freigabe aufheben" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kann bearbeiten" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Zugriffskontrolle" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "erstellen" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "aktualisieren" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "löschen" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "freigeben" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Durch ein Passwort geschützt" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Fehler beim entfernen des Ablaufdatums" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Fehler beim Setzen des Ablaufdatums" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-Passwort zurücksetzen" diff --git a/l10n/de/files_external.po b/l10n/de/files_external.po index dc9c4907b6..1d52174a22 100644 --- a/l10n/de/files_external.po +++ b/l10n/de/files_external.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/de_DE/core.po b/l10n/de_DE/core.po index 5f55bdc4b1..f106dc2fb2 100644 --- a/l10n/de_DE/core.po +++ b/l10n/de_DE/core.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 09:33+0000\n" -"Last-Translator: Mirodin \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,6 +31,30 @@ msgstr "" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Kategorie nicht angegeben." @@ -151,8 +175,8 @@ msgid "The object type is not specified." msgstr "Der Objekttyp ist nicht angegeben." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fehler" @@ -164,7 +188,7 @@ msgstr "Der App-Name ist nicht angegeben." msgid "The required file {file} is not installed!" msgstr "Die benötigte Datei {file} ist nicht installiert." -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Fehler bei der Freigabe" @@ -201,70 +225,86 @@ msgstr "Passwortschutz" msgid "Password" msgstr "Passwort" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Setze ein Ablaufdatum" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Ablaufdatum" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Mittels einer E-Mail freigeben:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Niemand gefunden" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Das Weiterverteilen ist nicht erlaubt" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Freigegeben in {item} von {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Freigabe aufheben" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kann bearbeiten" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Zugriffskontrolle" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "erstellen" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "aktualisieren" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "löschen" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "freigeben" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Durch ein Passwort geschützt" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Fehler beim Entfernen des Ablaufdatums" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Fehler beim Setzen des Ablaufdatums" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-Passwort zurücksetzen" diff --git a/l10n/de_DE/files_external.po b/l10n/de_DE/files_external.po index 415197254c..321c2a78ef 100644 --- a/l10n/de_DE/files_external.po +++ b/l10n/de_DE/files_external.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/owncloud/language/de_DE/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/el/core.po b/l10n/el/core.po index a7902cb5ae..29a4a7ee03 100644 --- a/l10n/el/core.po +++ b/l10n/el/core.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 23:56+0000\n" -"Last-Translator: Efstathios Iosifidis \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,6 +24,30 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Δεν δώθηκε τύπος κατηγορίας." @@ -144,8 +168,8 @@ msgid "The object type is not specified." msgstr "Δεν καθορίστηκε ο τύπος του αντικειμένου." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Σφάλμα" @@ -157,7 +181,7 @@ msgstr "Δεν καθορίστηκε το όνομα της εφαρμογής. msgid "The required file {file} is not installed!" msgstr "Το απαιτούμενο αρχείο {file} δεν εγκαταστάθηκε!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Σφάλμα κατά τον διαμοιρασμό" @@ -194,70 +218,86 @@ msgstr "Προστασία συνθηματικού" msgid "Password" msgstr "Συνθηματικό" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Ορισμός ημ. λήξης" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Ημερομηνία λήξης" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Διαμοιρασμός μέσω email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Δεν βρέθηκε άνθρωπος" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Ξαναμοιρασμός δεν επιτρέπεται" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Διαμοιρασμός του {item} με τον {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Σταμάτημα διαμοιρασμού" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "δυνατότητα αλλαγής" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "έλεγχος πρόσβασης" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "δημιουργία" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "ενημέρωση" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "διαγραφή" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "διαμοιρασμός" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Προστασία με συνθηματικό" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Σφάλμα κατά την διαγραφή της ημ. λήξης" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Σφάλμα κατά τον ορισμό ημ. λήξης" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Επαναφορά συνθηματικού ownCloud" diff --git a/l10n/el/files_external.po b/l10n/el/files_external.po index 427a867f4a..c1705152ae 100644 --- a/l10n/el/files_external.po +++ b/l10n/el/files_external.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/eo/core.po b/l10n/eo/core.po index 517787299a..03095412f6 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-04 00:06+0100\n" -"PO-Revision-Date: 2012-12-02 23:10+0000\n" -"Last-Translator: Mariano \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,30 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Ne proviziĝis tipon de kategorio." @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "Ne indikiĝis tipo de la objekto." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Eraro" @@ -153,7 +177,7 @@ msgstr "Ne indikiĝis nomo de la aplikaĵo." msgid "The required file {file} is not installed!" msgstr "La necesa dosiero {file} ne instaliĝis!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Eraro dum kunhavigo" @@ -190,70 +214,86 @@ msgstr "Protekti per pasvorto" msgid "Password" msgstr "Pasvorto" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Agordi limdaton" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Limdato" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Kunhavigi per retpoŝto:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ne troviĝis gento" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Rekunhavigo ne permesatas" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Kunhavigita en {item} kun {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Malkunhavigi" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "povas redakti" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "alirkontrolo" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "krei" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "ĝisdatigi" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "forigi" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "kunhavigi" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protektita per pasvorto" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Eraro dum malagordado de limdato" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Eraro dum agordado de limdato" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "La pasvorto de ownCloud restariĝis." diff --git a/l10n/eo/files_external.po b/l10n/eo/files_external.po index f0857b375b..5d494ccfa3 100644 --- a/l10n/eo/files_external.po +++ b/l10n/eo/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/es/core.po b/l10n/es/core.po index 034d5efe2b..c4ac4a0538 100644 --- a/l10n/es/core.po +++ b/l10n/es/core.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-18 00:01+0100\n" -"PO-Revision-Date: 2012-11-17 08:47+0000\n" -"Last-Translator: Raul Fernandez Garcia \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,6 +27,30 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Tipo de categoria no proporcionado." @@ -147,8 +171,8 @@ msgid "The object type is not specified." msgstr "El tipo de objeto no se ha especificado." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fallo" @@ -160,7 +184,7 @@ msgstr "El nombre de la app no se ha especificado." msgid "The required file {file} is not installed!" msgstr "El fichero {file} requerido, no está instalado." -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Error compartiendo" @@ -197,70 +221,86 @@ msgstr "Protegido por contraseña" msgid "Password" msgstr "Contraseña" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Establecer fecha de caducidad" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Fecha de caducidad" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "compartido via e-mail:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "No se encontró gente" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "No se permite compartir de nuevo" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Compartido en {item} con {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "No compartir" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "puede editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "control de acceso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "crear" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "modificar" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "eliminar" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "compartir" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protegido por contraseña" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Error al eliminar la fecha de caducidad" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Error estableciendo fecha de caducidad" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reiniciar contraseña de ownCloud" diff --git a/l10n/es/files_external.po b/l10n/es/files_external.po index 04ce595ce9..6d0ea098b1 100644 --- a/l10n/es/files_external.po +++ b/l10n/es/files_external.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Agustin Ferrario , 2012. # Javier Llorente , 2012. # , 2012. # Raul Fernandez Garcia , 2012. @@ -10,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:44+0000\n" +"Last-Translator: Agustin Ferrario \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -48,14 +49,14 @@ msgstr "Error configurando el almacenamiento de Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/es_AR/core.po b/l10n/es_AR/core.po index 0db84f4454..f00739d659 100644 --- a/l10n/es_AR/core.po +++ b/l10n/es_AR/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 09:55+0000\n" -"Last-Translator: cjtess \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Tipo de categoría no provisto. " @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "El tipo de objeto no esta especificado. " #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Error" @@ -152,7 +176,7 @@ msgstr "El nombre de la aplicación no esta especificado." msgid "The required file {file} is not installed!" msgstr "¡El archivo requerido {file} no está instalado!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Error al compartir" @@ -189,70 +213,86 @@ msgstr "Proteger con contraseña " msgid "Password" msgstr "Contraseña" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Asignar fecha de vencimiento" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Fecha de vencimiento" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "compartido a través de e-mail:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "No se encontraron usuarios" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "No se permite volver a compartir" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Compartido en {item} con {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Remover compartir" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "puede editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "control de acceso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "crear" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "actualizar" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "borrar" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "compartir" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protegido por contraseña" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Error al remover la fecha de caducidad" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Error al asignar fecha de vencimiento" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Restablecer contraseña de ownCloud" diff --git a/l10n/es_AR/files_external.po b/l10n/es_AR/files_external.po index 5090ecf75b..591c481a64 100644 --- a/l10n/es_AR/files_external.po +++ b/l10n/es_AR/files_external.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Agustin Ferrario , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:47+0000\n" +"Last-Translator: Agustin Ferrario \n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/owncloud/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -46,14 +47,14 @@ msgstr "Error al configurar el almacenamiento de Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/et_EE/core.po b/l10n/et_EE/core.po index 016395b949..3d6dcf500f 100644 --- a/l10n/et_EE/core.po +++ b/l10n/et_EE/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "Kustutamiseks pole kategooriat valitud." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Seaded" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekundit tagasi" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minut tagasi" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minutit tagasi" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "täna" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "eile" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} päeva tagasi" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "viimasel kuul" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "kuu tagasi" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "viimasel aastal" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "aastat tagasi" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Viga" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Viga jagamisel" @@ -188,70 +212,86 @@ msgstr "Parooliga kaitstud" msgid "Password" msgstr "Parool" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Määra aegumise kuupäev" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Aegumise kuupäev" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Jaga e-postiga:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ühtegi inimest ei leitud" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Edasijagamine pole lubatud" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Lõpeta jagamine" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "saab muuta" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "ligipääsukontroll" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "loo" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "uuenda" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "kustuta" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "jaga" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Parooliga kaitstud" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Viga aegumise kuupäeva eemaldamisel" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Viga aegumise kuupäeva määramisel" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud parooli taastamine" @@ -403,87 +443,87 @@ msgstr "Andmebaasi host" msgid "Finish setup" msgstr "Lõpeta seadistamine" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Pühapäev" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Esmaspäev" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Teisipäev" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Kolmapäev" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Neljapäev" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Reede" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Laupäev" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Jaanuar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Veebruar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Märts" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Aprill" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juuni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juuli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktoober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Detsember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "veebiteenused sinu kontrolli all" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Logi välja" diff --git a/l10n/et_EE/files_external.po b/l10n/et_EE/files_external.po index 08b40c08b4..c290d3f914 100644 --- a/l10n/et_EE/files_external.po +++ b/l10n/et_EE/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/eu/core.po b/l10n/eu/core.po index 0aa8ffd8d1..d163c81b50 100644 --- a/l10n/eu/core.po +++ b/l10n/eu/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:10+0100\n" -"PO-Revision-Date: 2012-11-25 23:09+0000\n" -"Last-Translator: asieriko \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Kategoria mota ez da zehaztu." @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "Objetu mota ez dago zehaztuta." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Errorea" @@ -152,7 +176,7 @@ msgstr "App izena ez dago zehaztuta." msgid "The required file {file} is not installed!" msgstr "Beharrezkoa den {file} fitxategia ez dago instalatuta!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Errore bat egon da elkarbanatzean" @@ -189,70 +213,86 @@ msgstr "Babestu pasahitzarekin" msgid "Password" msgstr "Pasahitza" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Ezarri muga data" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Muga data" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Elkarbanatu eposta bidez:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ez da inor aurkitu" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Berriz elkarbanatzea ez dago baimendua" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "{user}ekin {item}-n partekatuta" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Ez elkarbanatu" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "editatu dezake" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "sarrera kontrola" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "sortu" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "eguneratu" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "ezabatu" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "elkarbanatu" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Pasahitzarekin babestuta" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Errorea izan da muga data kentzean" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Errore bat egon da muga data ezartzean" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-en pasahitza berrezarri" diff --git a/l10n/eu/files_external.po b/l10n/eu/files_external.po index 34c406e0b2..70742445f5 100644 --- a/l10n/eu/files_external.po +++ b/l10n/eu/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fa/core.po b/l10n/fa/core.po index aaf10805b2..8b2531f874 100644 --- a/l10n/fa/core.po +++ b/l10n/fa/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "هیج دسته ای برای پاک شدن انتخاب نشده است msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "تنظیمات" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "ثانیه‌ها پیش" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 دقیقه پیش" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "امروز" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "دیروز" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "ماه قبل" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "ماه‌های قبل" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "سال قبل" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "سال‌های قبل" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "خطا" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "گذرواژه" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "ایجاد" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "پسورد ابرهای شما تغییرکرد" @@ -403,87 +443,87 @@ msgstr "هاست پایگاه داده" msgid "Finish setup" msgstr "اتمام نصب" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "یکشنبه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "دوشنبه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "سه شنبه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "چهارشنبه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "پنجشنبه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "جمعه" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "شنبه" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "ژانویه" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "فبریه" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "مارس" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "آوریل" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "می" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "ژوئن" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "جولای" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "آگوست" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "سپتامبر" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "اکتبر" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "نوامبر" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "دسامبر" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "سرویس وب تحت کنترل شما" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "خروج" diff --git a/l10n/fa/files_external.po b/l10n/fa/files_external.po index 13b8e5c47b..76d4d5289b 100644 --- a/l10n/fa/files_external.po +++ b/l10n/fa/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "گروه ها" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "کاربران" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "حذف" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/fi_FI/core.po b/l10n/fi_FI/core.po index a5d1642b01..e57ca7e117 100644 --- a/l10n/fi_FI/core.po +++ b/l10n/fi_FI/core.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-15 20:59+0000\n" -"Last-Translator: Jiri Grönroos \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,6 +24,30 @@ msgstr "" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -62,59 +86,59 @@ msgstr "Luokkia ei valittu poistettavaksi." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Asetukset" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekuntia sitten" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minuutti sitten" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minuuttia sitten" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "1 tunti sitten" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "{hours} tuntia sitten" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "tänään" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "eilen" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} päivää sitten" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "viime kuussa" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "{months} kuukautta sitten" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "kuukautta sitten" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "viime vuonna" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "vuotta sitten" @@ -144,8 +168,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Virhe" @@ -157,7 +181,7 @@ msgstr "Sovelluksen nimeä ei ole määritelty." msgid "The required file {file} is not installed!" msgstr "Vaadittua tiedostoa {file} ei ole asennettu!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Virhe jaettaessa" @@ -194,70 +218,86 @@ msgstr "Suojaa salasanalla" msgid "Password" msgstr "Salasana" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Aseta päättymispäivä" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Päättymispäivä" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Jaa sähköpostilla:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Henkilöitä ei löytynyt" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Jakaminen uudelleen ei ole salittu" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Peru jakaminen" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "voi muokata" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Pääsyn hallinta" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "luo" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "päivitä" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "poista" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "jaa" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Salasanasuojattu" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Virhe purettaessa eräpäivää" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Virhe päättymispäivää asettaessa" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud-salasanan nollaus" @@ -409,87 +449,87 @@ msgstr "Tietokantapalvelin" msgid "Finish setup" msgstr "Viimeistele asennus" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Sunnuntai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Maanantai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tiistai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Keskiviikko" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Torstai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Perjantai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Lauantai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Tammikuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Helmikuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Maaliskuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Huhtikuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Toukokuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Kesäkuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Heinäkuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Elokuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Syyskuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Lokakuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Marraskuu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Joulukuu" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "verkkopalvelut hallinnassasi" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Kirjaudu ulos" diff --git a/l10n/fi_FI/files_external.po b/l10n/fi_FI/files_external.po index e9d7e697e0..c40ca82338 100644 --- a/l10n/fi_FI/files_external.po +++ b/l10n/fi_FI/files_external.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fr/core.po b/l10n/fr/core.po index 28f66a6fa2..3630d49e78 100644 --- a/l10n/fr/core.po +++ b/l10n/fr/core.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-26 00:01+0100\n" -"PO-Revision-Date: 2012-11-25 00:59+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +25,30 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Type de catégorie non spécifié." @@ -145,8 +169,8 @@ msgid "The object type is not specified." msgstr "Le type d'objet n'est pas spécifié." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Erreur" @@ -158,7 +182,7 @@ msgstr "Le nom de l'application n'est pas spécifié." msgid "The required file {file} is not installed!" msgstr "Le fichier requis {file} n'est pas installé !" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Erreur lors de la mise en partage" @@ -195,70 +219,86 @@ msgstr "Protéger par un mot de passe" msgid "Password" msgstr "Mot de passe" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Spécifier la date d'expiration" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Date d'expiration" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Partager via e-mail :" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Aucun utilisateur trouvé" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Le repartage n'est pas autorisé" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Partagé dans {item} avec {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Ne plus partager" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "édition autorisée" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "contrôle des accès" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "créer" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "mettre à jour" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "supprimer" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "partager" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protégé par un mot de passe" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Un erreur est survenue pendant la suppression de la date d'expiration" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Erreur lors de la spécification de la date d'expiration" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Réinitialisation de votre mot de passe Owncloud" diff --git a/l10n/fr/files_external.po b/l10n/fr/files_external.po index 1618d64873..5484aa3b4c 100644 --- a/l10n/fr/files_external.po +++ b/l10n/fr/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/gl/core.po b/l10n/gl/core.po index fa4fed8860..22c6634339 100644 --- a/l10n/gl/core.po +++ b/l10n/gl/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 22:35+0000\n" -"Last-Translator: Miguel Branco \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Non se indicou o tipo de categoría" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "Non se especificou o tipo de obxecto." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Erro" @@ -152,7 +176,7 @@ msgstr "Non se especificou o nome do aplicativo." msgid "The required file {file} is not installed!" msgstr "Non está instalado o ficheiro {file} que se precisa" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Erro compartindo" @@ -189,70 +213,86 @@ msgstr "Protexido con contrasinais" msgid "Password" msgstr "Contrasinal" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Definir a data de caducidade" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data de caducidade" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Compartir por correo electrónico:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Non se atopou xente" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Non se acepta volver a compartir" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Compartido en {item} con {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Deixar de compartir" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "pode editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "control de acceso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "crear" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "actualizar" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "borrar" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "compartir" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protexido con contrasinal" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Erro ao quitar a data de caducidade" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Erro ao definir a data de caducidade" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Restablecer contrasinal de ownCloud" diff --git a/l10n/gl/files_external.po b/l10n/gl/files_external.po index 0ff6943895..775152bbea 100644 --- a/l10n/gl/files_external.po +++ b/l10n/gl/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/he/core.po b/l10n/he/core.po index 7595b43248..376b0ebf7f 100644 --- a/l10n/he/core.po +++ b/l10n/he/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 06:47+0000\n" -"Last-Translator: Yaron Shahrabani \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "סוג הקטגוריה לא סופק." @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "סוג הפריט לא צוין." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "שגיאה" @@ -154,7 +178,7 @@ msgstr "שם היישום לא צוין." msgid "The required file {file} is not installed!" msgstr "הקובץ הנדרש {file} אינו מותקן!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "שגיאה במהלך השיתוף" @@ -191,70 +215,86 @@ msgstr "הגנה בססמה" msgid "Password" msgstr "ססמה" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "הגדרת תאריך תפוגה" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "תאריך התפוגה" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "שיתוף באמצעות דוא״ל:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "לא נמצאו אנשים" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "אסור לעשות שיתוף מחדש" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "שותף תחת {item} עם {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "הסר שיתוף" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "ניתן לערוך" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "בקרת גישה" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "יצירה" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "עדכון" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "מחיקה" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "שיתוף" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "מוגן בססמה" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "אירעה שגיאה בביטול תאריך התפוגה" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "אירעה שגיאה בעת הגדרת תאריך התפוגה" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "איפוס הססמה של ownCloud" diff --git a/l10n/he/files_external.po b/l10n/he/files_external.po index 2b42ff706d..091bf89892 100644 --- a/l10n/he/files_external.po +++ b/l10n/he/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/hi/core.po b/l10n/hi/core.po index 70a515c309..ad1e340700 100644 --- a/l10n/hi/core.po +++ b/l10n/hi/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" @@ -19,6 +19,30 @@ msgstr "" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -57,59 +81,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -152,7 +176,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -189,70 +213,86 @@ msgstr "" msgid "Password" msgstr "पासवर्ड" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -404,87 +444,87 @@ msgstr "" msgid "Finish setup" msgstr "सेटअप समाप्त करे" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "" diff --git a/l10n/hi/files_external.po b/l10n/hi/files_external.po index f93e40c83d..acf75ea681 100644 --- a/l10n/hi/files_external.po +++ b/l10n/hi/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/owncloud/language/hi/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/hr/core.po b/l10n/hr/core.po index 981e11e0d1..3b78e7b8fd 100644 --- a/l10n/hr/core.po +++ b/l10n/hr/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -21,6 +21,30 @@ msgstr "" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -59,59 +83,59 @@ msgstr "Nema odabranih kategorija za brisanje." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Postavke" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekundi prije" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "danas" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "jučer" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "prošli mjesec" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "mjeseci" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "prošlu godinu" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "godina" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Pogreška" @@ -154,7 +178,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Greška prilikom djeljenja" @@ -191,70 +215,86 @@ msgstr "Zaštiti lozinkom" msgid "Password" msgstr "Lozinka" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Postavi datum isteka" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Datum isteka" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Dijeli preko email-a:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Osobe nisu pronađene" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Ponovo dijeljenje nije dopušteno" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Makni djeljenje" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "može mjenjat" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "kontrola pristupa" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "kreiraj" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "ažuriraj" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "izbriši" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "djeli" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Zaštita lozinkom" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Greška prilikom brisanja datuma isteka" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Greška prilikom postavljanja datuma isteka" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud resetiranje lozinke" @@ -406,87 +446,87 @@ msgstr "Poslužitelj baze podataka" msgid "Finish setup" msgstr "Završi postavljanje" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "nedelja" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "ponedeljak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "utorak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "srijeda" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "četvrtak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "petak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "subota" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Siječanj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Veljača" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Ožujak" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Travanj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Svibanj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Lipanj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Srpanj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Kolovoz" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Rujan" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Listopad" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Studeni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Prosinac" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "web usluge pod vašom kontrolom" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Odjava" diff --git a/l10n/hr/files_external.po b/l10n/hr/files_external.po index 0c806b0f1d..c221796fa0 100644 --- a/l10n/hr/files_external.po +++ b/l10n/hr/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Grupe" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Korisnici" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Obriši" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/hu_HU/core.po b/l10n/hu_HU/core.po index 7f656a4ac7..be9005b337 100644 --- a/l10n/hu_HU/core.po +++ b/l10n/hu_HU/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,30 @@ msgstr "" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -58,59 +82,59 @@ msgstr "Nincs törlésre jelölt kategória" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Beállítások" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "másodperccel ezelőtt" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 perccel ezelőtt" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "ma" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "tegnap" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "múlt hónapban" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "hónappal ezelőtt" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "tavaly" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "évvel ezelőtt" @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Hiba" @@ -153,7 +177,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -190,70 +214,86 @@ msgstr "" msgid "Password" msgstr "Jelszó" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Nem oszt meg" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "létrehozás" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud jelszó-visszaállítás" @@ -405,87 +445,87 @@ msgstr "Adatbázis szerver" msgid "Finish setup" msgstr "Beállítás befejezése" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Vasárnap" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Hétfő" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Kedd" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Szerda" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Csütörtök" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Péntek" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Szombat" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Január" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Február" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Március" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Április" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Május" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Június" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Július" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Augusztus" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Szeptember" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Október" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "December" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "webszolgáltatások az irányításod alatt" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Kilépés" diff --git a/l10n/hu_HU/files_external.po b/l10n/hu_HU/files_external.po index 15e23eff92..b77194ab26 100644 --- a/l10n/hu_HU/files_external.po +++ b/l10n/hu_HU/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Csoportok" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Felhasználók" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Törlés" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/ia/core.po b/l10n/ia/core.po index f068f3fb58..cf1e1c8105 100644 --- a/l10n/ia/core.po +++ b/l10n/ia/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Configurationes" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "Contrasigno" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reinitialisation del contrasigno de ownCLoud" @@ -403,87 +443,87 @@ msgstr "Hospite de base de datos" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Dominica" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Lunedi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Martedi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mercuridi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Jovedi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Venerdi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sabbato" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "januario" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februario" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Martio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Junio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Julio" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Augusto" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Septembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Octobre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Decembre" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "servicios web sub tu controlo" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Clauder le session" diff --git a/l10n/ia/files_external.po b/l10n/ia/files_external.po index de137eb4b1..7fa22302eb 100644 --- a/l10n/ia/files_external.po +++ b/l10n/ia/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Gruppos" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Usatores" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Deler" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/id/core.po b/l10n/id/core.po index f6cf57fdff..20b68e9ecf 100644 --- a/l10n/id/core.po +++ b/l10n/id/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -21,6 +21,30 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -59,59 +83,59 @@ msgstr "Tidak ada kategori terpilih untuk penghapusan." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Setelan" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "beberapa detik yang lalu" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 menit lalu" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "hari ini" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "kemarin" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "bulan kemarin" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "beberapa bulan lalu" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "tahun kemarin" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "beberapa tahun lalu" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "gagal" @@ -154,7 +178,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "gagal ketika membagikan" @@ -191,70 +215,86 @@ msgstr "lindungi dengan kata kunci" msgid "Password" msgstr "Password" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "set tanggal kadaluarsa" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "tanggal kadaluarsa" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "berbagi memlalui surel:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "tidak ada orang ditemukan" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "berbagi ulang tidak diperbolehkan" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "dibagikan dalam {item} dengan {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "batalkan berbagi" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "dapat merubah" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "kontrol akses" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "buat baru" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "baharui" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "hapus" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "bagikan" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "dilindungi kata kunci" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "gagal melepas tanggal kadaluarsa" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "gagal memasang tanggal kadaluarsa" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "reset password ownCloud" @@ -406,87 +446,87 @@ msgstr "Host database" msgid "Finish setup" msgstr "Selesaikan instalasi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "minggu" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "senin" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "selasa" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "rabu" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "kamis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "jumat" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "sabtu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Maret" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mei" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Agustus" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Nopember" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Desember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "web service dibawah kontrol anda" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Keluar" diff --git a/l10n/id/files_external.po b/l10n/id/files_external.po index 022a94be89..cdec2730ac 100644 --- a/l10n/id/files_external.po +++ b/l10n/id/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/is/core.po b/l10n/is/core.po index cb50d8be88..4432000b3c 100644 --- a/l10n/is/core.po +++ b/l10n/is/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-06 00:11+0100\n" -"PO-Revision-Date: 2012-12-05 14:23+0000\n" -"Last-Translator: kaztraz \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,30 @@ msgstr "" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Flokkur ekki gefin" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "Lykilorð" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" diff --git a/l10n/is/files_external.po b/l10n/is/files_external.po index 0be8d4ee79..a62f4ed1e0 100644 --- a/l10n/is/files_external.po +++ b/l10n/is/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Icelandic (http://www.transifex.com/projects/p/owncloud/language/is/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/it/core.po b/l10n/it/core.po index 9dc57ce2ea..b77481c589 100644 --- a/l10n/it/core.po +++ b/l10n/it/core.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-17 00:01+0100\n" -"PO-Revision-Date: 2012-11-15 23:19+0000\n" -"Last-Translator: Vincenzo Reale \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +22,30 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Tipo di categoria non fornito." @@ -142,8 +166,8 @@ msgid "The object type is not specified." msgstr "Il tipo di oggetto non è specificato." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Errore" @@ -155,7 +179,7 @@ msgstr "Il nome dell'applicazione non è specificato." msgid "The required file {file} is not installed!" msgstr "Il file richiesto {file} non è installato!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Errore durante la condivisione" @@ -192,70 +216,86 @@ msgstr "Proteggi con password" msgid "Password" msgstr "Password" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Imposta data di scadenza" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data di scadenza" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Condividi tramite email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Non sono state trovate altre persone" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "La ri-condivisione non è consentita" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Condiviso in {item} con {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Rimuovi condivisione" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "può modificare" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "controllo d'accesso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "creare" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "aggiornare" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "eliminare" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "condividere" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protetta da password" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Errore durante la rimozione della data di scadenza" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Errore durante l'impostazione della data di scadenza" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Ripristino password di ownCloud" diff --git a/l10n/it/files_external.po b/l10n/it/files_external.po index 8b98af50d4..970dad99d8 100644 --- a/l10n/it/files_external.po +++ b/l10n/it/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:42+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,14 +47,14 @@ msgstr "Errore durante la configurazione dell'archivio Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Avviso: \"smbclient\" non è installato. Impossibile montare condivisioni CIFS/SMB. Chiedi all'amministratore di sistema di installarlo." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Avviso: il supporto FTP di PHP non è abilitato o non è installato. Impossibile montare condivisioni FTP. Chiedi all'amministratore di sistema di installarlo." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/ja_JP/core.po b/l10n/ja_JP/core.po index 571d8a38dc..a60188539a 100644 --- a/l10n/ja_JP/core.po +++ b/l10n/ja_JP/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 08:03+0000\n" -"Last-Translator: Daisuke Deguchi \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: ja_JP\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "カテゴリタイプは提供されていません。" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "オブジェクタイプが指定されていません。" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "エラー" @@ -152,7 +176,7 @@ msgstr "アプリ名がしていされていません。" msgid "The required file {file} is not installed!" msgstr "必要なファイル {file} がインストールされていません!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "共有でエラー発生" @@ -189,70 +213,86 @@ msgstr "パスワード保護" msgid "Password" msgstr "パスワード" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "有効期限を設定" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "有効期限" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "メール経由で共有:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "ユーザーが見つかりません" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "再共有は許可されていません" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "{item} 内で {user} と共有中" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "共有解除" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "編集可能" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "アクセス権限" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "作成" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "更新" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "削除" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "共有" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "パスワード保護" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "有効期限の未設定エラー" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "有効期限の設定でエラー発生" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloudのパスワードをリセットします" diff --git a/l10n/ja_JP/files_external.po b/l10n/ja_JP/files_external.po index 7ddb01d4fa..6e0b94a6f3 100644 --- a/l10n/ja_JP/files_external.po +++ b/l10n/ja_JP/files_external.po @@ -4,13 +4,14 @@ # # Translators: # Daisuke Deguchi , 2012. +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 12:24+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -46,14 +47,14 @@ msgstr "Googleドライブストレージの設定エラー" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "警告: \"smbclient\" はインストールされていません。CIFS/SMB 共有のマウントはできません。システム管理者にインストールをお願いして下さい。" #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "警告: PHPのFTPサポートは無効もしくはインストールされていません。FTP共有のマウントはできません。システム管理者にインストールをお願いして下さい。" #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/ka_GE/core.po b/l10n/ka_GE/core.po index 3e4540171a..49ad2e0194 100644 --- a/l10n/ka_GE/core.po +++ b/l10n/ka_GE/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ka_GE\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "სარედაქტირებელი კატეგორი msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "პარამეტრები" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "წამის წინ" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 წუთის წინ" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} წუთის წინ" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "დღეს" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "გუშინ" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} დღის წინ" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "გასულ თვეში" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "თვის წინ" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "ბოლო წელს" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "წლის წინ" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "შეცდომა" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "შეცდომა გაზიარების დროს" @@ -188,70 +212,86 @@ msgstr "პაროლით დაცვა" msgid "Password" msgstr "პაროლი" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "მიუთითე ვადის გასვლის დრო" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "ვადის გასვლის დრო" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "გააზიარე მეილზე" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "გვერდი არ არის ნაპოვნი" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "მეორეჯერ გაზიარება არ არის დაშვებული" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "გაზიარების მოხსნა" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "შეგიძლია შეცვლა" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "დაშვების კონტროლი" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "შექმნა" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "განახლება" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "წაშლა" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "გაზიარება" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "პაროლით დაცული" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "შეცდომა ვადის გასვლის მოხსნის დროს" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "შეცდომა ვადის გასვლის მითითების დროს" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud პაროლის შეცვლა" @@ -403,87 +443,87 @@ msgstr "ბაზის ჰოსტი" msgid "Finish setup" msgstr "კონფიგურაციის დასრულება" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "კვირა" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "ორშაბათი" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "სამშაბათი" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "ოთხშაბათი" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "ხუთშაბათი" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "პარასკევი" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "შაბათი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "იანვარი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "თებერვალი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "მარტი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "აპრილი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "მაისი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "ივნისი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "ივლისი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "აგვისტო" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "სექტემბერი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "ოქტომბერი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "ნოემბერი" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "დეკემბერი" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "თქვენი კონტროლის ქვეშ მყოფი ვებ სერვისები" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "გამოსვლა" diff --git a/l10n/ka_GE/files_external.po b/l10n/ka_GE/files_external.po index e92df815c9..eb5eb8256c 100644 --- a/l10n/ka_GE/files_external.po +++ b/l10n/ka_GE/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/owncloud/language/ka_GE/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "ჯგუფები" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "მომხმარებელი" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "წაშლა" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/ko/core.po b/l10n/ko/core.po index 11331b588a..1f24c97277 100644 --- a/l10n/ko/core.po +++ b/l10n/ko/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-10 00:11+0100\n" -"PO-Revision-Date: 2012-12-09 06:08+0000\n" -"Last-Translator: Shinjo Park \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,30 @@ msgstr "" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "분류 형식이 제공되지 않았습니다." @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "객체 유형이 지정되지 않았습니다." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "오류" @@ -153,7 +177,7 @@ msgstr "앱 이름이 지정되지 않았습니다." msgid "The required file {file} is not installed!" msgstr "필요한 파일 {file}이(가) 설치되지 않았습니다!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "공유하는 중 오류 발생" @@ -190,70 +214,86 @@ msgstr "암호 보호" msgid "Password" msgstr "암호" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "만료 날짜 설정" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "만료 날짜" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "이메일로 공유:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "발견된 사람 없음" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "다시 공유할 수 없습니다" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "{user} 님과 {item}에서 공유 중" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "공유 해제" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "편집 가능" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "접근 제어" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "만들기" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "업데이트" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "삭제" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "공유" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "암호로 보호됨" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "만료 날짜 해제 오류" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "만료 날짜 설정 오류" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud 암호 재설정" diff --git a/l10n/ko/files_external.po b/l10n/ko/files_external.po index 88c2336d39..70d697575d 100644 --- a/l10n/ko/files_external.po +++ b/l10n/ko/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ku_IQ/core.po b/l10n/ku_IQ/core.po index 158446fd52..3917e9409c 100644 --- a/l10n/ku_IQ/core.po +++ b/l10n/ku_IQ/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ku_IQ\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "ده‌ستكاری" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "هه‌ڵه" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "وشەی تێپەربو" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -403,87 +443,87 @@ msgstr "هۆستی داتابه‌یس" msgid "Finish setup" msgstr "كۆتایی هات ده‌ستكاریه‌كان" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "چوونەدەرەوە" diff --git a/l10n/ku_IQ/files_external.po b/l10n/ku_IQ/files_external.po index 19e1b53ebb..78687b146f 100644 --- a/l10n/ku_IQ/files_external.po +++ b/l10n/ku_IQ/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Kurdish (Iraq) (http://www.transifex.com/projects/p/owncloud/language/ku_IQ/)\n" "MIME-Version: 1.0\n" @@ -96,7 +96,7 @@ msgstr "" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "به‌كارهێنه‌ر" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 diff --git a/l10n/lb/core.po b/l10n/lb/core.po index 89fe2cfec9..eacbddee62 100644 --- a/l10n/lb/core.po +++ b/l10n/lb/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "Keng Kategorien ausgewielt fir ze läschen." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Astellungen" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fehler" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "Passwuert" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "erstellen" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud Passwuert reset" @@ -403,87 +443,87 @@ msgstr "Datebank Server" msgid "Finish setup" msgstr "Installatioun ofschléissen" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Sonndes" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Méindes" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dënschdes" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Mëttwoch" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Donneschdes" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Freides" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Samschdes" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mäerz" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Abrëll" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mee" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Dezember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "Web Servicer ënnert denger Kontroll" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Ausloggen" diff --git a/l10n/lb/files_external.po b/l10n/lb/files_external.po index e0a2ceb1af..42ed0ce33d 100644 --- a/l10n/lb/files_external.po +++ b/l10n/lb/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" @@ -92,7 +92,7 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Gruppen" #: templates/settings.php:95 msgid "Users" @@ -101,7 +101,7 @@ msgstr "" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Läschen" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/lt_LT/core.po b/l10n/lt_LT/core.po index 6354588982..ecc372bdfe 100644 --- a/l10n/lt_LT/core.po +++ b/l10n/lt_LT/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -19,6 +19,30 @@ msgstr "" "Language: lt_LT\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -57,59 +81,59 @@ msgstr "Trynimui nepasirinkta jokia kategorija." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Nustatymai" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "prieš sekundę" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "Prieš 1 minutę" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "Prieš {count} minutes" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "šiandien" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "vakar" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "Prieš {days} dienas" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "praeitą mėnesį" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "prieš mėnesį" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "praeitais metais" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "prieš metus" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Klaida" @@ -152,7 +176,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Klaida, dalijimosi metu" @@ -189,70 +213,86 @@ msgstr "Apsaugotas slaptažodžiu" msgid "Password" msgstr "Slaptažodis" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Nustatykite galiojimo laiką" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Galiojimo laikas" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Dalintis per el. paštą:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Žmonių nerasta" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Dalijinasis išnaujo negalimas" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Pasidalino {item} su {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Nesidalinti" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "gali redaguoti" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "priėjimo kontrolė" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "sukurti" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "atnaujinti" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "ištrinti" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "dalintis" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Apsaugota slaptažodžiu" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Klaida nuimant galiojimo laiką" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Klaida nustatant galiojimo laiką" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud slaptažodžio atkūrimas" @@ -404,87 +444,87 @@ msgstr "Duomenų bazės serveris" msgid "Finish setup" msgstr "Baigti diegimą" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Sekmadienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Pirmadienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Antradienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Trečiadienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Ketvirtadienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Penktadienis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Šeštadienis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Sausis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Vasaris" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Kovas" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Balandis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Gegužė" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Birželis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Liepa" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Rugpjūtis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Rugsėjis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Spalis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Lapkritis" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Gruodis" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "jūsų valdomos web paslaugos" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Atsijungti" diff --git a/l10n/lt_LT/files_external.po b/l10n/lt_LT/files_external.po index baf294943a..6e6e944d5a 100644 --- a/l10n/lt_LT/files_external.po +++ b/l10n/lt_LT/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/lv/core.po b/l10n/lv/core.po index 673a73d1da..404800bf2b 100644 --- a/l10n/lv/core.po +++ b/l10n/lv/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Iestatījumi" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Kļūme" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "Parole" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Pārtraukt līdzdalīšanu" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -403,87 +443,87 @@ msgstr "Datubāzes mājvieta" msgid "Finish setup" msgstr "Pabeigt uzstādījumus" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Izlogoties" diff --git a/l10n/lv/files_external.po b/l10n/lv/files_external.po index 742960675b..07979d9b1c 100644 --- a/l10n/lv/files_external.po +++ b/l10n/lv/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Grupas" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Lietotāji" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Izdzēst" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/mk/core.po b/l10n/mk/core.po index d2948b19cf..e758197590 100644 --- a/l10n/mk/core.po +++ b/l10n/mk/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,30 @@ msgstr "" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -58,59 +82,59 @@ msgstr "Не е одбрана категорија за бришење." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Поставки" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Грешка" @@ -153,7 +177,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -190,70 +214,86 @@ msgstr "" msgid "Password" msgstr "Лозинка" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "креирај" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ресетирање на лозинка за ownCloud" @@ -405,87 +445,87 @@ msgstr "Сервер со база" msgid "Finish setup" msgstr "Заврши го подесувањето" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Недела" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Понеделник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Четврток" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Петок" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Сабота" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Јануари" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Февруари" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Април" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Мај" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Јуни" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Јули" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Септември" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Октомври" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Ноември" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Декември" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "веб сервиси под Ваша контрола" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Одјава" diff --git a/l10n/mk/files_external.po b/l10n/mk/files_external.po index 645256ddc1..0505c9e2d8 100644 --- a/l10n/mk/files_external.po +++ b/l10n/mk/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Групи" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Корисници" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Избриши" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/ms_MY/core.po b/l10n/ms_MY/core.po index d333a37937..8c3a71a020 100644 --- a/l10n/ms_MY/core.po +++ b/l10n/ms_MY/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,30 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -58,59 +82,59 @@ msgstr "tiada kategori dipilih untuk penghapusan" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Tetapan" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Ralat" @@ -153,7 +177,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -190,70 +214,86 @@ msgstr "" msgid "Password" msgstr "Kata laluan" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Set semula kata lalaun ownCloud" @@ -405,87 +445,87 @@ msgstr "Hos pangkalan data" msgid "Finish setup" msgstr "Setup selesai" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Ahad" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Isnin" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Selasa" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Rabu" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Khamis" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Jumaat" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sabtu" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mac" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mei" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Jun" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Julai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Ogos" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Disember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "Perkhidmatan web di bawah kawalan anda" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Log keluar" diff --git a/l10n/ms_MY/files_external.po b/l10n/ms_MY/files_external.po index 7bca6897df..5e943b19f6 100644 --- a/l10n/ms_MY/files_external.po +++ b/l10n/ms_MY/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Kumpulan" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Pengguna" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Padam" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/nb_NO/core.po b/l10n/nb_NO/core.po index 97332c4a8a..7354a7de4c 100644 --- a/l10n/nb_NO/core.po +++ b/l10n/nb_NO/core.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -23,6 +23,30 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -61,59 +85,59 @@ msgstr "Ingen kategorier merket for sletting." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Innstillinger" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekunder siden" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minutt siden" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minutter siden" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "i dag" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "i går" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} dager siden" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "forrige måned" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "måneder siden" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "forrige år" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "år siden" @@ -143,8 +167,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Feil" @@ -156,7 +180,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Feil under deling" @@ -193,70 +217,86 @@ msgstr "Passordbeskyttet" msgid "Password" msgstr "Passord" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Set utløpsdato" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Utløpsdato" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Del på epost" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ingen personer funnet" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Avslutt deling" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kan endre" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "tilgangskontroll" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "opprett" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "oppdater" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "slett" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "del" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Passordbeskyttet" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Kan ikke sette utløpsdato" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Tilbakestill ownCloud passord" @@ -408,87 +448,87 @@ msgstr "Databasevert" msgid "Finish setup" msgstr "Fullfør oppsetting" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Mandag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tirsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Lørdag" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Desember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "nettjenester under din kontroll" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Logg ut" diff --git a/l10n/nb_NO/files_external.po b/l10n/nb_NO/files_external.po index f5a90c0da8..1888463488 100644 --- a/l10n/nb_NO/files_external.po +++ b/l10n/nb_NO/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/nl/core.po b/l10n/nl/core.po index 5eeb0f021c..4dd97cac61 100644 --- a/l10n/nl/core.po +++ b/l10n/nl/core.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-19 00:01+0100\n" -"PO-Revision-Date: 2012-11-18 13:25+0000\n" -"Last-Translator: Len \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,6 +31,30 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Categorie type niet opgegeven." @@ -151,8 +175,8 @@ msgid "The object type is not specified." msgstr "Het object type is niet gespecificeerd." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fout" @@ -164,7 +188,7 @@ msgstr "De app naam is niet gespecificeerd." msgid "The required file {file} is not installed!" msgstr "Het vereiste bestand {file} is niet geïnstalleerd!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Fout tijdens het delen" @@ -201,70 +225,86 @@ msgstr "Wachtwoord beveiliging" msgid "Password" msgstr "Wachtwoord" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Stel vervaldatum in" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Vervaldatum" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Deel via email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Geen mensen gevonden" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Verder delen is niet toegestaan" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Gedeeld in {item} met {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Stop met delen" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kan wijzigen" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "toegangscontrole" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "maak" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "bijwerken" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "verwijderen" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "deel" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Wachtwoord beveiligd" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Fout tijdens het verwijderen van de verval datum" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Fout tijdens het instellen van de vervaldatum" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud wachtwoord herstellen" diff --git a/l10n/nl/files_external.po b/l10n/nl/files_external.po index 316f4a7870..dcc92f2a2c 100644 --- a/l10n/nl/files_external.po +++ b/l10n/nl/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/nn_NO/core.po b/l10n/nn_NO/core.po index 9102a6e6a3..dad899207e 100644 --- a/l10n/nn_NO/core.po +++ b/l10n/nn_NO/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -19,6 +19,30 @@ msgstr "" "Language: nn_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -57,59 +81,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Innstillingar" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Feil" @@ -152,7 +176,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -189,70 +213,86 @@ msgstr "" msgid "Password" msgstr "Passord" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -404,87 +444,87 @@ msgstr "Databasetenar" msgid "Finish setup" msgstr "Fullfør oppsettet" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Søndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Måndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tysdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Laurdag" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Desember" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "Vev tjenester under din kontroll" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Logg ut" diff --git a/l10n/nn_NO/files_external.po b/l10n/nn_NO/files_external.po index 5655e1ba16..eb83e9d2a1 100644 --- a/l10n/nn_NO/files_external.po +++ b/l10n/nn_NO/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Grupper" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Brukarar" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Slett" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/oc/core.po b/l10n/oc/core.po index 47c795e20b..696e6808a5 100644 --- a/l10n/oc/core.po +++ b/l10n/oc/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: oc\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "Pas de categorias seleccionadas per escafar." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Configuracion" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "segonda a" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minuta a" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "uèi" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "ièr" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "mes passat" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "meses a" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "an passat" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "ans a" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Error" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Error al partejar" @@ -188,70 +212,86 @@ msgstr "Parat per senhal" msgid "Password" msgstr "Senhal" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Met la data d'expiracion" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data d'expiracion" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Parteja tras corrièl :" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Deguns trobat" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Tornar partejar es pas permis" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Non parteje" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "pòt modificar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Contraròtle d'acces" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "crea" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "met a jorn" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "escafa" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "parteja" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Parat per senhal" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Error al metre de la data d'expiracion" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Error setting expiration date" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "senhal d'ownCloud tornat botar" @@ -403,87 +443,87 @@ msgstr "Òste de basa de donadas" msgid "Finish setup" msgstr "Configuracion acabada" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Dimenge" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Diluns" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Dimarç" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Dimecres" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Dijòus" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Divendres" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Dissabte" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Genièr" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Febrièr" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Març" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Abril" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Junh" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Julhet" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Agost" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Septembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Octobre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Novembre" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Decembre" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "Services web jos ton contraròtle" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Sortida" diff --git a/l10n/oc/files_external.po b/l10n/oc/files_external.po index 9c12334dac..fcf2b75be3 100644 --- a/l10n/oc/files_external.po +++ b/l10n/oc/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/owncloud/language/oc/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Grops" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Usancièrs" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Escafa" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/pl/core.po b/l10n/pl/core.po index d4a3154242..4c8fee0e91 100644 --- a/l10n/pl/core.po +++ b/l10n/pl/core.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-28 00:10+0100\n" -"PO-Revision-Date: 2012-11-27 08:53+0000\n" -"Last-Translator: Cyryl Sochacki \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,6 +27,30 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Typ kategorii nie podany." @@ -147,8 +171,8 @@ msgid "The object type is not specified." msgstr "Typ obiektu nie jest określony." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Błąd" @@ -160,7 +184,7 @@ msgstr "Nazwa aplikacji nie jest określona." msgid "The required file {file} is not installed!" msgstr "Żądany plik {file} nie jest zainstalowany!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Błąd podczas współdzielenia" @@ -197,70 +221,86 @@ msgstr "Zabezpieczone hasłem" msgid "Password" msgstr "Hasło" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Ustaw datę wygaśnięcia" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data wygaśnięcia" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Współdziel poprzez maila" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Nie znaleziono ludzi" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Współdzielenie nie jest możliwe" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Współdzielone w {item} z {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Zatrzymaj współdzielenie" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "można edytować" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "kontrola dostępu" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "utwórz" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "uaktualnij" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "usuń" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "współdziel" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Zabezpieczone hasłem" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Błąd niszczenie daty wygaśnięcia" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Błąd podczas ustawiania daty wygaśnięcia" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "restart hasła" diff --git a/l10n/pl/files_external.po b/l10n/pl/files_external.po index 858bef67e1..a6a1c7b548 100644 --- a/l10n/pl/files_external.po +++ b/l10n/pl/files_external.po @@ -5,13 +5,14 @@ # Translators: # Cyryl Sochacki <>, 2012. # Cyryl Sochacki , 2012. +# Marcin Małecki , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 11:26+0000\n" +"Last-Translator: Marcin Małecki \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,14 +48,14 @@ msgstr "Wystąpił błąd podczas konfigurowania zasobu Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Ostrzeżenie: \"smbclient\" nie jest zainstalowany. Zamontowanie katalogów CIFS/SMB nie jest możliwe. Skontaktuj sie z administratorem w celu zainstalowania." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Ostrzeżenie: Wsparcie dla FTP w PHP nie jest zainstalowane lub włączone. Skontaktuj sie z administratorem w celu zainstalowania lub włączenia go." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/pl_PL/core.po b/l10n/pl_PL/core.po index 020d06551d..fece08d3db 100644 --- a/l10n/pl_PL/core.po +++ b/l10n/pl_PL/core.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" @@ -17,6 +17,30 @@ msgstr "" "Language: pl_PL\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -55,59 +79,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Ustawienia" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -137,8 +161,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -150,7 +174,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -187,70 +211,86 @@ msgstr "" msgid "Password" msgstr "" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -402,87 +442,87 @@ msgstr "" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "" diff --git a/l10n/pl_PL/files_external.po b/l10n/pl_PL/files_external.po index 49f56afb0b..f5c11983aa 100644 --- a/l10n/pl_PL/files_external.po +++ b/l10n/pl_PL/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/owncloud/language/pl_PL/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po index 58cb66c321..3930ee5623 100644 --- a/l10n/pt_BR/core.po +++ b/l10n/pt_BR/core.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-01 23:28+0000\n" -"Last-Translator: FredMaranhao \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,6 +27,30 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Tipo de categoria não fornecido." @@ -147,8 +171,8 @@ msgid "The object type is not specified." msgstr "O tipo de objeto não foi especificado." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Erro" @@ -160,7 +184,7 @@ msgstr "O nome do app não foi especificado." msgid "The required file {file} is not installed!" msgstr "O arquivo {file} necessário não está instalado!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Erro ao compartilhar" @@ -197,70 +221,86 @@ msgstr "Proteger com senha" msgid "Password" msgstr "Senha" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Definir data de expiração" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data de expiração" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Compartilhar via e-mail:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Nenhuma pessoa encontrada" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Não é permitido re-compartilhar" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Compartilhado em {item} com {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Descompartilhar" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "pode editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "controle de acesso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "criar" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "atualizar" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "remover" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "compartilhar" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protegido com senha" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Erro ao remover data de expiração" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Erro ao definir data de expiração" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Redefinir senha ownCloud" diff --git a/l10n/pt_BR/files_external.po b/l10n/pt_BR/files_external.po index 573fe0165e..cb39401817 100644 --- a/l10n/pt_BR/files_external.po +++ b/l10n/pt_BR/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/pt_PT/core.po b/l10n/pt_PT/core.po index 7798c921db..2a05167e0d 100644 --- a/l10n/pt_PT/core.po +++ b/l10n/pt_PT/core.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-17 00:01+0100\n" -"PO-Revision-Date: 2012-11-16 00:32+0000\n" -"Last-Translator: Mouxy \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,6 +23,30 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Tipo de categoria não fornecido" @@ -143,8 +167,8 @@ msgid "The object type is not specified." msgstr "O tipo de objecto não foi especificado" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Erro" @@ -156,7 +180,7 @@ msgstr "O nome da aplicação não foi especificado" msgid "The required file {file} is not installed!" msgstr "O ficheiro necessário {file} não está instalado!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Erro ao partilhar" @@ -193,70 +217,86 @@ msgstr "Proteger com palavra-passe" msgid "Password" msgstr "Palavra chave" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Especificar data de expiração" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data de expiração" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Partilhar via email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Não foi encontrado ninguém" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Não é permitido partilhar de novo" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Partilhado em {item} com {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Deixar de partilhar" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "pode editar" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "Controlo de acesso" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "criar" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "actualizar" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "apagar" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "partilhar" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protegido com palavra-passe" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Erro ao retirar a data de expiração" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Erro ao aplicar a data de expiração" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Reposição da password ownCloud" diff --git a/l10n/pt_PT/files_external.po b/l10n/pt_PT/files_external.po index bf65e8ef77..1f14f0cbdf 100644 --- a/l10n/pt_PT/files_external.po +++ b/l10n/pt_PT/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ro/core.po b/l10n/ro/core.po index 499ac25ab5..1e11f35b49 100644 --- a/l10n/ro/core.po +++ b/l10n/ro/core.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" @@ -21,6 +21,30 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -59,59 +83,59 @@ msgstr "Nici o categorie selectată pentru ștergere." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Configurări" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "secunde în urmă" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minut în urmă" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "astăzi" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "ieri" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "ultima lună" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "luni în urmă" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "ultimul an" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "ani în urmă" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Eroare" @@ -154,7 +178,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Eroare la partajare" @@ -191,70 +215,86 @@ msgstr "Protejare cu parolă" msgid "Password" msgstr "Parola" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Specifică data expirării" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Data expirării" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Nici o persoană găsită" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Repartajarea nu este permisă" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Anulare partajare" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "poate edita" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "control acces" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "creare" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "actualizare" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "ștergere" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "partajare" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Protejare cu parolă" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Eroare la anularea datei de expirare" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Eroare la specificarea datei de expirare" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Resetarea parolei ownCloud " @@ -406,87 +446,87 @@ msgstr "Bază date" msgid "Finish setup" msgstr "Finalizează instalarea" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Duminică" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Luni" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Marți" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Miercuri" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Joi" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Vineri" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Sâmbătă" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Ianuarie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februarie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Martie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Aprilie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Mai" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Iunie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Iulie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "August" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Septembrie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Octombrie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Noiembrie" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Decembrie" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "servicii web controlate de tine" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Ieșire" diff --git a/l10n/ro/files_external.po b/l10n/ro/files_external.po index ac9c9b5877..a2cf379cc4 100644 --- a/l10n/ro/files_external.po +++ b/l10n/ro/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ru/core.po b/l10n/ru/core.po index 5003706734..1575b0d931 100644 --- a/l10n/ru/core.po +++ b/l10n/ru/core.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-22 00:01+0100\n" -"PO-Revision-Date: 2012-11-21 12:18+0000\n" -"Last-Translator: Mihail Vasiliev \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +25,30 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Тип категории не предоставлен" @@ -145,8 +169,8 @@ msgid "The object type is not specified." msgstr "Тип объекта не указан" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Ошибка" @@ -158,7 +182,7 @@ msgstr "Имя приложения не указано" msgid "The required file {file} is not installed!" msgstr "Необходимый файл {file} не установлен!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Ошибка при открытии доступа" @@ -195,70 +219,86 @@ msgstr "Защитить паролем" msgid "Password" msgstr "Пароль" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Установить срок доступа" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Дата окончания" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Поделится через электронную почту:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ни один человек не найден" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Общий доступ не разрешен" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Общий доступ к {item} с {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Закрыть общий доступ" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "может редактировать" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "контроль доступа" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "создать" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "обновить" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "удалить" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "открыть доступ" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Защищено паролем" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Ошибка при отмене срока доступа" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Ошибка при установке срока доступа" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Сброс пароля " diff --git a/l10n/ru/files_external.po b/l10n/ru/files_external.po index 664f6a3b49..5873f93dc6 100644 --- a/l10n/ru/files_external.po +++ b/l10n/ru/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ru_RU/core.po b/l10n/ru_RU/core.po index 329ea8e6df..ede57ac4db 100644 --- a/l10n/ru_RU/core.po +++ b/l10n/ru_RU/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-15 11:29+0000\n" -"Last-Translator: AnnaSch \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ru_RU\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Тип категории не предоставлен." @@ -56,59 +80,59 @@ msgstr "Нет категорий, выбранных для удаления." msgid "Error removing %s from favorites." msgstr "Ошибка удаления %s из избранного." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Настройки" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "секунд назад" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr " 1 минуту назад" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{минуты} минут назад" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "1 час назад" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "{часы} часов назад" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "сегодня" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "вчера" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{дни} дней назад" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "в прошлом месяце" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "{месяцы} месяцев назад" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "месяц назад" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "в прошлом году" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "лет назад" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "Тип объекта не указан." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Ошибка" @@ -151,7 +175,7 @@ msgstr "Имя приложения не указано." msgid "The required file {file} is not installed!" msgstr "Требуемый файл {файл} не установлен!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Ошибка создания общего доступа" @@ -188,70 +212,86 @@ msgstr "Защитить паролем" msgid "Password" msgstr "Пароль" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Установить срок действия" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Дата истечения срока действия" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Сделать общедоступным посредством email:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Не найдено людей" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Рекурсивный общий доступ не разрешен" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Совместное использование в {объект} с {пользователь}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Отключить общий доступ" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "возможно редактирование" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "контроль доступа" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "создать" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "обновить" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "удалить" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "сделать общим" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Пароль защищен" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Ошибка при отключении даты истечения срока действия" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Ошибка при установке даты истечения срока действия" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Переназначение пароля" @@ -403,87 +443,87 @@ msgstr "Сервер базы данных" msgid "Finish setup" msgstr "Завершение настройки" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Воскресенье" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Понедельник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Вторник" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Среда" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Четверг" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Пятница" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Суббота" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Январь" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Февраль" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Март" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "Апрель" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Май" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Июнь" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Июль" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Август" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Сентябрь" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Октябрь" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Ноябрь" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Декабрь" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "веб-сервисы под Вашим контролем" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Выйти" diff --git a/l10n/ru_RU/files_external.po b/l10n/ru_RU/files_external.po index df9df7ab0c..f82e872da9 100644 --- a/l10n/ru_RU/files_external.po +++ b/l10n/ru_RU/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/si_LK/core.po b/l10n/si_LK/core.po index d6d9ac72ef..34d894bfea 100644 --- a/l10n/si_LK/core.po +++ b/l10n/si_LK/core.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,30 @@ msgstr "" "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -58,59 +82,59 @@ msgstr "මකා දැමීම සඳහා ප්‍රවර්ගයන් msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "සැකසුම්" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "තත්පරයන්ට පෙර" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 මිනිත්තුවකට පෙර" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "අද" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "ඊයේ" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "පෙර මාසයේ" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "මාස කීපයකට පෙර" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "පෙර අවුරුද්දේ" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "අවුරුදු කීපයකට පෙර" @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "දෝෂයක්" @@ -153,7 +177,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -190,70 +214,86 @@ msgstr "මුර පදයකින් ආරක්ශාකරන්න" msgid "Password" msgstr "මුර පදය " +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "කල් ඉකුත් විමේ දිනය දමන්න" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "කල් ඉකුත් විමේ දිනය" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "විද්‍යුත් තැපෑල මඟින් බෙදාගන්න: " -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "නොබෙදු" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "සංස්කරණය කළ හැක" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "ප්‍රවේශ පාලනය" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "සදන්න" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "යාවත්කාලීන කරන්න" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "මකන්න" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "බෙදාහදාගන්න" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "මුර පදයකින් ආරක්ශාකර ඇත" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "කල් ඉකුත් දිනය ඉවත් කිරීමේ දෝෂයක්" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "කල් ඉකුත් දිනය ස්ථාපනය කිරීමේ දෝෂයක්" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud මුරපදය ප්‍රත්‍යාරම්භ කරන්න" @@ -405,87 +445,87 @@ msgstr "දත්තගබඩා සේවාදායකයා" msgid "Finish setup" msgstr "ස්ථාපනය කිරීම අවසන් කරන්න" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "ඉරිදා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "සඳුදා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "අඟහරුවාදා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "බදාදා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "බ්‍රහස්පතින්දා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "සිකුරාදා" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "සෙනසුරාදා" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "ජනවාරි" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "පෙබරවාරි" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "මාර්තු" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "අප්‍රේල්" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "මැයි" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "ජූනි" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "ජූලි" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "අගෝස්තු" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "සැප්තැම්බර්" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "ඔක්තෝබර්" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "නොවැම්බර්" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "දෙසැම්බර්" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "නික්මීම" diff --git a/l10n/si_LK/files_external.po b/l10n/si_LK/files_external.po index ae4a7f377f..1c63e48b42 100644 --- a/l10n/si_LK/files_external.po +++ b/l10n/si_LK/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/owncloud/language/si_LK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sk_SK/core.po b/l10n/sk_SK/core.po index 711f713379..b227585630 100644 --- a/l10n/sk_SK/core.po +++ b/l10n/sk_SK/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-02 00:02+0100\n" -"PO-Revision-Date: 2012-12-01 16:24+0000\n" -"Last-Translator: martin \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Neposkytnutý kategorický typ." @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "Nešpecifikovaný typ objektu." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Chyba" @@ -154,7 +178,7 @@ msgstr "Nešpecifikované meno aplikácie." msgid "The required file {file} is not installed!" msgstr "Požadovaný súbor {file} nie je inštalovaný!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Chyba počas zdieľania" @@ -191,70 +215,86 @@ msgstr "Chrániť heslom" msgid "Password" msgstr "Heslo" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Nastaviť dátum expirácie" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Dátum expirácie" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Zdieľať cez e-mail:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Užívateľ nenájdený" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Zdieľanie už zdieľanej položky nie je povolené" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Zdieľané v {item} s {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Zrušiť zdieľanie" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "môže upraviť" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "riadenie prístupu" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "vytvoriť" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "aktualizácia" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "zmazať" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "zdieľať" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Chránené heslom" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Chyba pri odstraňovaní dátumu vypršania platnosti" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Chyba pri nastavení dátumu vypršania platnosti" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Obnovenie hesla pre ownCloud" diff --git a/l10n/sk_SK/files_external.po b/l10n/sk_SK/files_external.po index 258af33f03..7a081bb7aa 100644 --- a/l10n/sk_SK/files_external.po +++ b/l10n/sk_SK/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sl/core.po b/l10n/sl/core.po index 105221ef81..c792cfeb4b 100644 --- a/l10n/sl/core.po +++ b/l10n/sl/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-20 00:01+0100\n" -"PO-Revision-Date: 2012-11-19 19:48+0000\n" -"Last-Translator: Peter Peroša \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Vrsta kategorije ni podana." @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "Vrsta predmeta ni podana." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Napaka" @@ -154,7 +178,7 @@ msgstr "Ime aplikacije ni podano." msgid "The required file {file} is not installed!" msgstr "Zahtevana datoteka {file} ni nameščena!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Napaka med souporabo" @@ -191,70 +215,86 @@ msgstr "Zaščiti z geslom" msgid "Password" msgstr "Geslo" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Nastavi datum preteka" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Datum preteka" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Souporaba preko elektronske pošte:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Ni najdenih uporabnikov" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Ponovna souporaba ni omogočena" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "V souporabi v {item} z {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Odstrani souporabo" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "lahko ureja" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "nadzor dostopa" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "ustvari" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "posodobi" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "izbriše" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "določi souporabo" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Zaščiteno z geslom" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Napaka brisanja datuma preteka" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Napaka med nastavljanjem datuma preteka" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Ponastavitev gesla ownCloud" diff --git a/l10n/sl/files_external.po b/l10n/sl/files_external.po index 14900f7f88..850dcb0542 100644 --- a/l10n/sl/files_external.po +++ b/l10n/sl/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sq/core.po b/l10n/sq/core.po index 57c778722b..994085414f 100644 --- a/l10n/sq/core.po +++ b/l10n/sq/core.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:10+0100\n" -"PO-Revision-Date: 2011-07-25 16:05+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +17,30 @@ msgstr "" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -137,8 +161,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -150,7 +174,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -187,70 +211,86 @@ msgstr "" msgid "Password" msgstr "" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" diff --git a/l10n/sq/files_external.po b/l10n/sq/files_external.po index 970b1cf680..e48f1229d3 100644 --- a/l10n/sq/files_external.po +++ b/l10n/sq/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/owncloud/language/sq/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/sr/core.po b/l10n/sr/core.po index 2aa7514268..9bf9f33c5e 100644 --- a/l10n/sr/core.po +++ b/l10n/sr/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" -"PO-Revision-Date: 2012-12-04 15:04+0000\n" -"Last-Translator: Kostic \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,30 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Врста категорије није унет." @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "Врста објекта није подешена." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Грешка" @@ -153,7 +177,7 @@ msgstr "Име програма није унето." msgid "The required file {file} is not installed!" msgstr "Потребна датотека {file} није инсталирана." -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Грешка у дељењу" @@ -190,70 +214,86 @@ msgstr "Заштићено лозинком" msgid "Password" msgstr "Лозинка" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Постави датум истека" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Датум истека" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Подели поштом:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Особе нису пронађене." -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Поновно дељење није дозвољено" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Подељено унутар {item} са {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Не дели" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "може да мења" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "права приступа" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "направи" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "ажурирај" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "обриши" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "подели" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Заштићено лозинком" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Грешка код поништавања датума истека" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Грешка код постављања датума истека" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Поништавање лозинке за ownCloud" diff --git a/l10n/sr/files_external.po b/l10n/sr/files_external.po index e11eca2dc5..867ac5a97a 100644 --- a/l10n/sr/files_external.po +++ b/l10n/sr/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Групе" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Корисници" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Обриши" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/sr@latin/core.po b/l10n/sr@latin/core.po index c90c97d167..d005ce3076 100644 --- a/l10n/sr@latin/core.po +++ b/l10n/sr@latin/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,30 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -56,59 +80,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Podešavanja" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "Lozinka" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -403,87 +443,87 @@ msgstr "Domaćin baze" msgid "Finish setup" msgstr "Završi podešavanje" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Nedelja" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Ponedeljak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Utorak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Sreda" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Četvrtak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Petak" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Subota" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mart" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Jun" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Jul" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Avgust" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "Septembar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktobar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "Novembar" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "Decembar" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Odjava" diff --git a/l10n/sr@latin/files_external.po b/l10n/sr@latin/files_external.po index d23a68fce7..1952c7f947 100644 --- a/l10n/sr@latin/files_external.po +++ b/l10n/sr@latin/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Grupe" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Korisnici" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Obriši" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/sv/core.po b/l10n/sv/core.po index e1789e690c..31c51f8afe 100644 --- a/l10n/sv/core.po +++ b/l10n/sv/core.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-15 07:19+0000\n" -"Last-Translator: Magnus Höglund \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,6 +23,30 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Kategorityp inte angiven." @@ -61,59 +85,59 @@ msgstr "Inga kategorier valda för radering." msgid "Error removing %s from favorites." msgstr "Fel vid borttagning av %s från favoriter." -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "Inställningar" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "sekunder sedan" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 minut sedan" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} minuter sedan" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "1 timme sedan" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "{hours} timmar sedan" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "i dag" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "i går" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} dagar sedan" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "förra månaden" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "{months} månader sedan" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "månader sedan" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "förra året" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "år sedan" @@ -143,8 +167,8 @@ msgid "The object type is not specified." msgstr "Objekttypen är inte specificerad." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Fel" @@ -156,7 +180,7 @@ msgstr " Namnet på appen är inte specificerad." msgid "The required file {file} is not installed!" msgstr "Den nödvändiga filen {file} är inte installerad!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Fel vid delning" @@ -193,70 +217,86 @@ msgstr "Lösenordsskydda" msgid "Password" msgstr "Lösenord" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Sätt utgångsdatum" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Utgångsdatum" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Dela via e-post:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Hittar inga användare" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Dela vidare är inte tillåtet" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Delad i {item} med {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Sluta dela" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "kan redigera" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "åtkomstkontroll" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "skapa" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "uppdatera" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "radera" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "dela" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Lösenordsskyddad" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Fel vid borttagning av utgångsdatum" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Fel vid sättning av utgångsdatum" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud lösenordsåterställning" @@ -408,87 +448,87 @@ msgstr "Databasserver" msgid "Finish setup" msgstr "Avsluta installation" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "Söndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "Måndag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "Tisdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "Onsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "Torsdag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "Fredag" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "Lördag" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "Januari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "Februari" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "Mars" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "April" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "Maj" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "Juni" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "Juli" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "Augusti" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "September" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "Oktober" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "November" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "December" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "webbtjänster under din kontroll" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "Logga ut" diff --git a/l10n/sv/files_external.po b/l10n/sv/files_external.po index 1b6b3f2879..e35ac8ae60 100644 --- a/l10n/sv/files_external.po +++ b/l10n/sv/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/ta_LK/core.po b/l10n/ta_LK/core.po index a64466dbd5..454448de31 100644 --- a/l10n/ta_LK/core.po +++ b/l10n/ta_LK/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-15 10:19+0000\n" -"Last-Translator: suganthi \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,30 @@ msgstr "" "Language: ta_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "பிரிவு வகைகள் வழங்கப்படவில்லை" @@ -56,59 +80,59 @@ msgstr "நீக்குவதற்கு எந்தப் பிரிவ msgid "Error removing %s from favorites." msgstr "விருப்பத்திலிருந்து %s ஐ அகற்றுவதில் வழு.உஇஇ" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "அமைப்புகள்" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "செக்கன்களுக்கு முன்" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 நிமிடத்திற்கு முன் " -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{நிமிடங்கள்} நிமிடங்களுக்கு முன் " -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "1 மணித்தியாலத்திற்கு முன்" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "{மணித்தியாலங்கள்} மணித்தியாலங்களிற்கு முன்" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "இன்று" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "நேற்று" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{நாட்கள்} நாட்களுக்கு முன்" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "கடந்த மாதம்" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "{மாதங்கள்} மாதங்களிற்கு முன்" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "மாதங்களுக்கு முன்" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "கடந்த வருடம்" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "வருடங்களுக்கு முன்" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "பொருள் வகை குறிப்பிடப்படவில்லை." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "வழு" @@ -151,7 +175,7 @@ msgstr "செயலி பெயர் குறிப்பிடப்பட msgid "The required file {file} is not installed!" msgstr "தேவைப்பட்ட கோப்பு {கோப்பு} நிறுவப்படவில்லை!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "பகிரும் போதான வழு" @@ -188,70 +212,86 @@ msgstr "கடவுச்சொல்லை பாதுகாத்தல்" msgid "Password" msgstr "கடவுச்சொல்" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "காலாவதி தேதியை குறிப்பிடுக" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "காலவதியாகும் திகதி" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "மின்னஞ்சலினூடான பகிர்வு: " -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "நபர்கள் யாரும் இல்லை" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "மீள்பகிர்வதற்கு அனுமதி இல்லை " -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "{பயனாளர்} உடன் {உருப்படி} பகிரப்பட்டுள்ளது" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "பகிரமுடியாது" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "தொகுக்க முடியும்" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "கட்டுப்பாடான அணுகல்" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "படைத்தல்" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "இற்றைப்படுத்தல்" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "நீக்குக" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "பகிர்தல்" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "கடவுச்சொல் பாதுகாக்கப்பட்டது" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "காலாவதியாகும் திகதியை குறிப்பிடாமைக்கான வழு" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "காலாவதியாகும் திகதியை குறிப்பிடுவதில் வழு" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud இன் கடவுச்சொல் மீளமைப்பு" @@ -403,87 +443,87 @@ msgstr "தரவுத்தள ஓம்புனர்" msgid "Finish setup" msgstr "அமைப்பை முடிக்க" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "ஞாயிற்றுக்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "திங்கட்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "செவ்வாய்க்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "புதன்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "வியாழக்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "வெள்ளிக்கிழமை" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "சனிக்கிழமை" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "தை" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "மாசி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "பங்குனி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "சித்திரை" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "வைகாசி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "ஆனி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "ஆடி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "ஆவணி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "புரட்டாசி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "ஐப்பசி" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "கார்த்திகை" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "மார்கழி" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "உங்கள் கட்டுப்பாட்டின் கீழ் இணைய சேவைகள்" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "விடுபதிகை செய்க" diff --git a/l10n/ta_LK/files_external.po b/l10n/ta_LK/files_external.po index 9ecab2c360..196376b86f 100644 --- a/l10n/ta_LK/files_external.po +++ b/l10n/ta_LK/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Tamil (Sri-Lanka) (http://www.transifex.com/projects/p/owncloud/language/ta_LK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 4a57f87cd1..b804e0b90f 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:13+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,30 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -137,8 +161,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -150,7 +174,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -187,70 +211,86 @@ msgstr "" msgid "Password" msgstr "" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 776c8dc1ca..fc7d3c606b 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index a7bf1b34f8..7eefeaead5 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 0f291829da..409cef6405 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 696968dc5f..96202f6876 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index b8d633fcd8..8fc23dcb84 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 64d7e1aea9..35957a41cf 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:13+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 7a3336fedb..cc3f110a8e 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:13+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index ff71625a05..2e67007735 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index cc6bf5674d..352ed49cac 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/core.po b/l10n/th_TH/core.po index 2476f610e9..0138e60fb8 100644 --- a/l10n/th_TH/core.po +++ b/l10n/th_TH/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-23 00:01+0100\n" -"PO-Revision-Date: 2012-11-22 10:55+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,30 @@ msgstr "" "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "ยังไม่ได้ระบุชนิดของหมวดหมู่" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "ชนิดของวัตถุยังไม่ได้รับการระบุ" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "พบข้อผิดพลาด" @@ -152,7 +176,7 @@ msgstr "ชื่อของแอปยังไม่ได้รับกา msgid "The required file {file} is not installed!" msgstr "ไฟล์ {file} ซึ่งเป็นไฟล์ที่จำเป็นต้องได้รับการติดตั้งไว้ก่อน ยังไม่ได้ถูกติดตั้ง" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "เกิดข้อผิดพลาดในระหว่างการแชร์ข้อมูล" @@ -189,70 +213,86 @@ msgstr "ใส่รหัสผ่านไว้" msgid "Password" msgstr "รหัสผ่าน" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "กำหนดวันที่หมดอายุ" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "วันที่หมดอายุ" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "แชร์ผ่านทางอีเมล" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "ไม่พบบุคคลที่ต้องการ" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "ไม่อนุญาตให้แชร์ข้อมูลซ้ำได้" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "ได้แชร์ {item} ให้กับ {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "ยกเลิกการแชร์" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "สามารถแก้ไข" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "ระดับควบคุมการเข้าใช้งาน" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "สร้าง" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "อัพเดท" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "ลบ" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "แชร์" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "ใส่รหัสผ่านไว้" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "เกิดข้อผิดพลาดในการยกเลิกการตั้งค่าวันที่หมดอายุ" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "เกิดข้อผิดพลาดในการตั้งค่าวันที่หมดอายุ" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "รีเซ็ตรหัสผ่าน ownCloud" diff --git a/l10n/th_TH/files_external.po b/l10n/th_TH/files_external.po index 21a5b596fd..efca59c6be 100644 --- a/l10n/th_TH/files_external.po +++ b/l10n/th_TH/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/tr/core.po b/l10n/tr/core.po index 83b9a8bcbf..7c575fd5a3 100644 --- a/l10n/tr/core.po +++ b/l10n/tr/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-05 00:04+0100\n" -"PO-Revision-Date: 2012-12-04 12:02+0000\n" -"Last-Translator: alpere \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Hata" @@ -154,7 +178,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Paylaşım sırasında hata " @@ -191,70 +215,86 @@ msgstr "Şifre korunması" msgid "Password" msgstr "Parola" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Son kullanma tarihini ayarla" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Paylaşılmayan" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "oluştur" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud parola sıfırlama" diff --git a/l10n/tr/files_external.po b/l10n/tr/files_external.po index b545004333..b9f7d56aeb 100644 --- a/l10n/tr/files_external.po +++ b/l10n/tr/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" @@ -92,16 +92,16 @@ msgstr "" #: templates/settings.php:87 msgid "Groups" -msgstr "" +msgstr "Gruplar" #: templates/settings.php:95 msgid "Users" -msgstr "" +msgstr "Kullanıcılar" #: templates/settings.php:108 templates/settings.php:109 #: templates/settings.php:149 templates/settings.php:150 msgid "Delete" -msgstr "" +msgstr "Sil" #: templates/settings.php:124 msgid "Enable User External Storage" diff --git a/l10n/uk/core.po b/l10n/uk/core.po index c10c7fcfba..004b502564 100644 --- a/l10n/uk/core.po +++ b/l10n/uk/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-27 00:10+0100\n" -"PO-Revision-Date: 2012-11-26 15:28+0000\n" -"Last-Translator: skoptev \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Не вказано тип категорії." @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "Не визначено тип об'єкту." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Помилка" @@ -154,7 +178,7 @@ msgstr "Не визначено ім'я програми." msgid "The required file {file} is not installed!" msgstr "Необхідний файл {file} не встановлено!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Помилка під час публікації" @@ -191,70 +215,86 @@ msgstr "Захистити паролем" msgid "Password" msgstr "Пароль" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Встановити термін дії" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Термін дії" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Опублікувати через електронну пошту:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Жодної людини не знайдено" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Пере-публікація не дозволяється" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Опубліковано {item} для {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Заборонити доступ" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "може редагувати" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "контроль доступу" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "створити" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "оновити" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "видалити" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "опублікувати" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Захищено паролем" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Помилка при відміні терміна дії" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Помилка при встановленні терміна дії" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "скидання пароля ownCloud" diff --git a/l10n/uk/files_external.po b/l10n/uk/files_external.po index be02b93b4e..dc8a158618 100644 --- a/l10n/uk/files_external.po +++ b/l10n/uk/files_external.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 15:37+0000\n" +"Last-Translator: volodya327 \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,14 +47,14 @@ msgstr "Помилка при налаштуванні сховища Google Dri msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Попередження: Клієнт \"smbclient\" не встановлено. Під'єднанатися до CIFS/SMB тек неможливо. Попрохайте системного адміністратора встановити його." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Попередження: Підтримка FTP в PHP не увімкнута чи не встановлена. Під'єднанатися до FTP тек неможливо. Попрохайте системного адміністратора встановити її." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/vi/core.po b/l10n/vi/core.po index 6c220328a1..bb3bb8b48d 100644 --- a/l10n/vi/core.po +++ b/l10n/vi/core.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-21 00:01+0100\n" -"PO-Revision-Date: 2012-11-20 05:31+0000\n" -"Last-Translator: mattheu_9x \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +22,30 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "Kiểu hạng mục không được cung cấp." @@ -142,8 +166,8 @@ msgid "The object type is not specified." msgstr "Loại đối tượng không được chỉ định." #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "Lỗi" @@ -155,7 +179,7 @@ msgstr "Tên ứng dụng không được chỉ định." msgid "The required file {file} is not installed!" msgstr "Tập tin cần thiết {file} không được cài đặt!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "Lỗi trong quá trình chia sẻ" @@ -192,70 +216,86 @@ msgstr "Mật khẩu bảo vệ" msgid "Password" msgstr "Mật khẩu" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "Đặt ngày kết thúc" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "Ngày kết thúc" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "Chia sẻ thông qua email" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "Không tìm thấy người nào" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "Chia sẻ lại không được cho phép" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "Đã được chia sẽ trong {item} với {user}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "Gỡ bỏ chia sẻ" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "có thể chỉnh sửa" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "quản lý truy cập" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "tạo" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "cập nhật" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "xóa" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "chia sẻ" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "Mật khẩu bảo vệ" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "Lỗi không thiết lập ngày kết thúc" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "Lỗi cấu hình ngày kết thúc" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "Khôi phục mật khẩu Owncloud " diff --git a/l10n/vi/files_external.po b/l10n/vi/files_external.po index 618214425b..72b1138b2b 100644 --- a/l10n/vi/files_external.po +++ b/l10n/vi/files_external.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_CN.GB2312/core.po b/l10n/zh_CN.GB2312/core.po index 333806c038..ad918d8e01 100644 --- a/l10n/zh_CN.GB2312/core.po +++ b/l10n/zh_CN.GB2312/core.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" @@ -19,6 +19,30 @@ msgstr "" "Language: zh_CN.GB2312\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -57,59 +81,59 @@ msgstr "没有选者要删除的分类." msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "设置" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "秒前" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "1 分钟前" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "{minutes} 分钟前" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "今天" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "昨天" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "{days} 天前" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "上个月" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "月前" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "去年" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "年前" @@ -139,8 +163,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "错误" @@ -152,7 +176,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "分享出错" @@ -189,70 +213,86 @@ msgstr "密码保护" msgid "Password" msgstr "密码" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "设置失效日期" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "失效日期" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "通过电子邮件分享:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "查无此人" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "不允许重复分享" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "已经与 {user} 在 {item} 中分享" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "取消分享" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "可编辑" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "访问控制" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "创建" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "更新" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "删除" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "分享" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "密码保护" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "取消设置失效日期出错" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "设置失效日期出错" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "私有云密码重置" @@ -404,87 +444,87 @@ msgstr "数据库主机" msgid "Finish setup" msgstr "完成安装" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "星期天" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "星期一" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "星期二" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "星期三" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "星期四" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "星期五" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "星期六" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "一月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "二月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "三月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "四月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "五月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "六月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "七月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "八月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "九月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "十月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "十一月" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "十二月" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "你控制下的网络服务" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "注销" diff --git a/l10n/zh_CN.GB2312/files_external.po b/l10n/zh_CN.GB2312/files_external.po index 5405371e71..066da805d3 100644 --- a/l10n/zh_CN.GB2312/files_external.po +++ b/l10n/zh_CN.GB2312/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_CN/core.po b/l10n/zh_CN/core.po index 3c6eebe26f..118d37c13f 100644 --- a/l10n/zh_CN/core.po +++ b/l10n/zh_CN/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-19 00:01+0100\n" -"PO-Revision-Date: 2012-11-18 16:16+0000\n" -"Last-Translator: hanfeng \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,30 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "未提供分类类型。" @@ -141,8 +165,8 @@ msgid "The object type is not specified." msgstr "未指定对象类型。" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:527 -#: js/share.js:539 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "错误" @@ -154,7 +178,7 @@ msgstr "未指定App名称。" msgid "The required file {file} is not installed!" msgstr "所需文件{file}未安装!" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "共享时出错" @@ -191,70 +215,86 @@ msgstr "密码保护" msgid "Password" msgstr "密码" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "设置过期日期" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "过期日期" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "通过Email共享" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "未找到此人" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "不允许二次共享" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "在{item} 与 {user}共享。" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "取消共享" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "可以修改" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "访问控制" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "创建" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "更新" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "删除" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "共享" -#: js/share.js:343 js/share.js:514 js/share.js:516 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "密码已受保护" -#: js/share.js:527 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "取消设置过期日期时出错" -#: js/share.js:539 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "设置过期日期时出错" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "重置 ownCloud 密码" diff --git a/l10n/zh_CN/files_external.po b/l10n/zh_CN/files_external.po index bea3d10635..fda4fc5073 100644 --- a/l10n/zh_CN/files_external.po +++ b/l10n/zh_CN/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_HK/core.po b/l10n/zh_HK/core.po index 5c659dbbe4..27fcd9c0a1 100644 --- a/l10n/zh_HK/core.po +++ b/l10n/zh_HK/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:13+0100\n" -"PO-Revision-Date: 2012-12-11 07:28+0000\n" -"Last-Translator: amanda.shuuemura \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,30 @@ msgstr "" "Language: zh_HK\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -138,8 +162,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -151,7 +175,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -188,70 +212,86 @@ msgstr "" msgid "Password" msgstr "" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" diff --git a/l10n/zh_HK/files_external.po b/l10n/zh_HK/files_external.po index c794bc276f..0b9d4d015c 100644 --- a/l10n/zh_HK/files_external.po +++ b/l10n/zh_HK/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/owncloud/language/zh_HK/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zh_TW/core.po b/l10n/zh_TW/core.po index 104f616766..9e9cb51587 100644 --- a/l10n/zh_TW/core.po +++ b/l10n/zh_TW/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-08 00:09+0100\n" -"PO-Revision-Date: 2012-12-06 01:24+0000\n" -"Last-Translator: dw4dev \n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,30 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -140,8 +164,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:533 -#: js/share.js:545 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "錯誤" @@ -153,7 +177,7 @@ msgstr "沒有詳述APP名稱." msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "分享時發生錯誤" @@ -190,70 +214,86 @@ msgstr "密碼保護" msgid "Password" msgstr "密碼" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "設置到期日" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "到期日" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "透過email分享:" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "已和 {user} 分享 {item}" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "取消共享" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "可編輯" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "存取控制" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "建立" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "更新" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "刪除" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "分享" -#: js/share.js:349 js/share.js:520 js/share.js:522 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "密碼保護" -#: js/share.js:533 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:545 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "錯誤的到期日設定" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "ownCloud 密碼重設" diff --git a/l10n/zh_TW/files_external.po b/l10n/zh_TW/files_external.po index 02bac3c88d..88c257062d 100644 --- a/l10n/zh_TW/files_external.po +++ b/l10n/zh_TW/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/zu_ZA/core.po b/l10n/zu_ZA/core.po index f754fe7ccd..57a6cff989 100644 --- a/l10n/zu_ZA/core.po +++ b/l10n/zu_ZA/core.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-11-16 00:02+0100\n" -"PO-Revision-Date: 2012-11-14 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-12 23:17+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" @@ -17,6 +17,30 @@ msgstr "" "Language: zu_ZA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ajax/share.php:84 +#, php-format +msgid "User %s shared a file with you" +msgstr "" + +#: ajax/share.php:86 +#, php-format +msgid "User %s shared a folder with you" +msgstr "" + +#: ajax/share.php:88 +#, php-format +msgid "" +"User %s shared the file \"%s\" with you. It is available for download here: " +"%s" +msgstr "" + +#: ajax/share.php:90 +#, php-format +msgid "" +"User %s shared the folder \"%s\" with you. It is available for download " +"here: %s" +msgstr "" + #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." msgstr "" @@ -55,59 +79,59 @@ msgstr "" msgid "Error removing %s from favorites." msgstr "" -#: js/js.js:243 templates/layout.user.php:59 templates/layout.user.php:60 +#: js/js.js:259 templates/layout.user.php:60 templates/layout.user.php:61 msgid "Settings" msgstr "" -#: js/js.js:688 +#: js/js.js:704 msgid "seconds ago" msgstr "" -#: js/js.js:689 +#: js/js.js:705 msgid "1 minute ago" msgstr "" -#: js/js.js:690 +#: js/js.js:706 msgid "{minutes} minutes ago" msgstr "" -#: js/js.js:691 +#: js/js.js:707 msgid "1 hour ago" msgstr "" -#: js/js.js:692 +#: js/js.js:708 msgid "{hours} hours ago" msgstr "" -#: js/js.js:693 +#: js/js.js:709 msgid "today" msgstr "" -#: js/js.js:694 +#: js/js.js:710 msgid "yesterday" msgstr "" -#: js/js.js:695 +#: js/js.js:711 msgid "{days} days ago" msgstr "" -#: js/js.js:696 +#: js/js.js:712 msgid "last month" msgstr "" -#: js/js.js:697 +#: js/js.js:713 msgid "{months} months ago" msgstr "" -#: js/js.js:698 +#: js/js.js:714 msgid "months ago" msgstr "" -#: js/js.js:699 +#: js/js.js:715 msgid "last year" msgstr "" -#: js/js.js:700 +#: js/js.js:716 msgid "years ago" msgstr "" @@ -137,8 +161,8 @@ msgid "The object type is not specified." msgstr "" #: js/oc-vcategories.js:95 js/oc-vcategories.js:125 js/oc-vcategories.js:136 -#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:525 -#: js/share.js:537 +#: js/oc-vcategories.js:195 js/share.js:135 js/share.js:142 js/share.js:541 +#: js/share.js:553 msgid "Error" msgstr "" @@ -150,7 +174,7 @@ msgstr "" msgid "The required file {file} is not installed!" msgstr "" -#: js/share.js:124 +#: js/share.js:124 js/share.js:581 msgid "Error while sharing" msgstr "" @@ -187,70 +211,86 @@ msgstr "" msgid "Password" msgstr "" +#: js/share.js:172 +msgid "Email link to person" +msgstr "" + #: js/share.js:173 +msgid "Send" +msgstr "" + +#: js/share.js:177 msgid "Set expiration date" msgstr "" -#: js/share.js:174 +#: js/share.js:178 msgid "Expiration date" msgstr "" -#: js/share.js:206 +#: js/share.js:210 msgid "Share via email:" msgstr "" -#: js/share.js:208 +#: js/share.js:212 msgid "No people found" msgstr "" -#: js/share.js:235 +#: js/share.js:239 msgid "Resharing is not allowed" msgstr "" -#: js/share.js:271 +#: js/share.js:275 msgid "Shared in {item} with {user}" msgstr "" -#: js/share.js:292 +#: js/share.js:296 msgid "Unshare" msgstr "" -#: js/share.js:304 +#: js/share.js:308 msgid "can edit" msgstr "" -#: js/share.js:306 +#: js/share.js:310 msgid "access control" msgstr "" -#: js/share.js:309 +#: js/share.js:313 msgid "create" msgstr "" -#: js/share.js:312 +#: js/share.js:316 msgid "update" msgstr "" -#: js/share.js:315 +#: js/share.js:319 msgid "delete" msgstr "" -#: js/share.js:318 +#: js/share.js:322 msgid "share" msgstr "" -#: js/share.js:343 js/share.js:512 js/share.js:514 +#: js/share.js:353 js/share.js:528 js/share.js:530 msgid "Password protected" msgstr "" -#: js/share.js:525 +#: js/share.js:541 msgid "Error unsetting expiration date" msgstr "" -#: js/share.js:537 +#: js/share.js:553 msgid "Error setting expiration date" msgstr "" +#: js/share.js:568 +msgid "Sending ..." +msgstr "" + +#: js/share.js:579 +msgid "Email sent" +msgstr "" + #: lostpassword/controller.php:47 msgid "ownCloud password reset" msgstr "" @@ -402,87 +442,87 @@ msgstr "" msgid "Finish setup" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Sunday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Monday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Tuesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Wednesday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Thursday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Friday" msgstr "" -#: templates/layout.guest.php:15 templates/layout.user.php:16 +#: templates/layout.guest.php:16 templates/layout.user.php:17 msgid "Saturday" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "January" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "February" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "March" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "April" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "May" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "June" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "July" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "August" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "September" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "October" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "November" msgstr "" -#: templates/layout.guest.php:16 templates/layout.user.php:17 +#: templates/layout.guest.php:17 templates/layout.user.php:18 msgid "December" msgstr "" -#: templates/layout.guest.php:41 +#: templates/layout.guest.php:42 msgid "web services under your control" msgstr "" -#: templates/layout.user.php:44 +#: templates/layout.user.php:45 msgid "Log out" msgstr "" diff --git a/l10n/zu_ZA/files_external.po b/l10n/zu_ZA/files_external.po index c65140aefb..7d61433206 100644 --- a/l10n/zu_ZA/files_external.po +++ b/l10n/zu_ZA/files_external.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-12 00:12+0100\n" -"PO-Revision-Date: 2012-12-11 23:13+0000\n" +"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"PO-Revision-Date: 2012-12-11 23:22+0000\n" "Last-Translator: I Robot \n" "Language-Team: Zulu (South Africa) (http://www.transifex.com/projects/p/owncloud/language/zu_ZA/)\n" "MIME-Version: 1.0\n" From 7881bf1d4d792f23353d84de1df05c540c31c201 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 13 Dec 2012 12:49:59 +0100 Subject: [PATCH 472/481] improve general button coloring --- core/css/styles.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index d5b0a348ee..a790fa296b 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -51,11 +51,13 @@ textarea:hover, textarea:focus, textarea:active { background-color:#fff; color:# input[type="submit"], input[type="button"], button, .button, #quota, div.jp-progress, select, .pager li a { width:auto; padding:.4em; - background:#f8f8f8; font-weight:bold; color:#555; text-shadow:#fff 0 1px 0; border:1px solid #ddd; cursor:pointer; + background-color:rgba(230,230,230,.5); font-weight:bold; color:#555; text-shadow:#fff 0 1px 0; border:1px solid rgba(180,180,180,.5); cursor:pointer; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } -input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, select:hover, select:focus, select:active, input[type="button"]:focus, .button:hover { background:#fff; color:#333; } +input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, select:hover, select:focus, select:active, input[type="button"]:focus, .button:hover { + background:rgba(255,255,255,.5); color:#333; +} input[type="submit"] img, input[type="button"] img, button img, .button img { cursor:pointer; } input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; } input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } From 2c41ae437287a2f151936916f942f5447e5015b4 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 13 Dec 2012 12:51:45 +0100 Subject: [PATCH 473/481] small code reordering of inputs and buttons --- core/css/styles.css | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index a790fa296b..032556cbb5 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -48,7 +48,12 @@ input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active, input[type="password"]:hover, input[type="password"]:focus, input[type="password"]:active, .searchbox input[type="search"]:hover, .searchbox input[type="search"]:focus, .searchbox input[type="search"]:active, textarea:hover, textarea:focus, textarea:active { background-color:#fff; color:#333; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } +input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; } +input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } +#quota { cursor:default; } + +/* BUTTONS */ input[type="submit"], input[type="button"], button, .button, #quota, div.jp-progress, select, .pager li a { width:auto; padding:.4em; background-color:rgba(230,230,230,.5); font-weight:bold; color:#555; text-shadow:#fff 0 1px 0; border:1px solid rgba(180,180,180,.5); cursor:pointer; @@ -59,12 +64,8 @@ input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hov background:rgba(255,255,255,.5); color:#333; } input[type="submit"] img, input[type="button"] img, button img, .button img { cursor:pointer; } -input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; } -input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } -#quota { cursor:default; } - -/* PRIMARY ACTION BUTTON, use sparingly */ +/* Primary action button, use sparingly */ .primary, input[type="submit"].primary, input[type="button"].primary, button.primary, .button.primary { border:1px solid #1d2d44; background:#35537a; color:#ddd; text-shadow:#000 0 -1px 0; From 1443d6c3ef51128f8c9ec3c3c0773586d349a196 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 13 Dec 2012 22:31:43 +0100 Subject: [PATCH 474/481] fix mimetype icons for new files --- apps/files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/js/files.js b/apps/files/js/files.js index ece0b29ae1..33c775fc8e 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -853,7 +853,7 @@ function getMimeIcon(mime, ready){ if(getMimeIcon.cache[mime]){ ready(getMimeIcon.cache[mime]); }else{ - $.get( OC.filePath('files','ajax','mimeicon.php')+'&mime='+mime, function(path){ + $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path){ getMimeIcon.cache[mime]=path; ready(getMimeIcon.cache[mime]); }); From 6d7ae463df7c010d9bc024d9a15e88957f3f1da7 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 14 Dec 2012 00:17:42 +0100 Subject: [PATCH 475/481] [tx-robot] updated from transifex --- apps/files/l10n/eu.php | 1 + apps/files/l10n/ru.php | 1 + apps/files_external/l10n/ca.php | 2 + apps/files_external/l10n/cs_CZ.php | 2 + apps/files_external/l10n/ru.php | 2 + core/l10n/ca.php | 8 +++ core/l10n/cs_CZ.php | 8 +++ core/l10n/eu.php | 8 +++ core/l10n/it.php | 7 +++ core/l10n/pl.php | 4 ++ core/l10n/ru.php | 8 +++ core/l10n/uk.php | 12 ++++- l10n/ca/core.po | 22 ++++---- l10n/ca/files_external.po | 10 ++-- l10n/cs_CZ/core.po | 22 ++++---- l10n/cs_CZ/files_external.po | 10 ++-- l10n/eu/core.po | 23 ++++---- l10n/eu/files.po | 81 +++++++++++++++-------------- l10n/eu/settings.po | 8 +-- l10n/it/core.po | 20 +++---- l10n/pl/core.po | 14 ++--- l10n/ru/core.po | 23 ++++---- l10n/ru/files.po | 81 +++++++++++++++-------------- l10n/ru/files_external.po | 11 ++-- l10n/ru/settings.po | 9 ++-- l10n/templates/core.pot | 2 +- l10n/templates/files.pot | 2 +- l10n/templates/files_encryption.pot | 2 +- l10n/templates/files_external.pot | 2 +- l10n/templates/files_sharing.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/uk/core.po | 26 ++++----- settings/l10n/eu.php | 1 + settings/l10n/ru.php | 1 + 38 files changed, 256 insertions(+), 189 deletions(-) diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index 1f1ea6da50..0b223b93d8 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -1,5 +1,6 @@ "Ez da arazorik izan, fitxategia ongi igo da", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Igotako fitxategiak php.ini fitxategian ezarritako upload_max_filesize muga gainditu du:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Igotako fitxategiaren tamaina HTML inprimakiko MAX_FILESIZE direktiban adierazitakoa baino handiagoa da", "The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat baino gehiago ez da igo", "No file was uploaded" => "Ez da fitxategirik igo", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 5a8f448dc3..4b6d0a8b15 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -1,5 +1,6 @@ "Файл успешно загружен", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Файл превышает размер установленный upload_max_filesize в php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файл превышает размер MAX_FILE_SIZE, указаный в HTML-форме", "The uploaded file was only partially uploaded" => "Файл был загружен не полностью", "No file was uploaded" => "Файл не был загружен", diff --git a/apps/files_external/l10n/ca.php b/apps/files_external/l10n/ca.php index fc6706381b..e8a922ca0f 100644 --- a/apps/files_external/l10n/ca.php +++ b/apps/files_external/l10n/ca.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Ompliu els camps requerits", "Please provide a valid Dropbox app key and secret." => "Proporcioneu una clau d'aplicació i secret vàlids per a Dropbox", "Error configuring Google Drive storage" => "Error en configurar l'emmagatzemament Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Avís: \"smbclient\" no està instal·lat. No es pot muntar la compartició CIFS/SMB. Demaneu a l'administrador del sistema que l'instal·li.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Avís: El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar la compartició FTP. Demaneu a l'administrador del sistema que l'instal·li.", "External Storage" => "Emmagatzemament extern", "Mount point" => "Punt de muntatge", "Backend" => "Dorsal", diff --git a/apps/files_external/l10n/cs_CZ.php b/apps/files_external/l10n/cs_CZ.php index 8006be1a2f..9c647fad93 100644 --- a/apps/files_external/l10n/cs_CZ.php +++ b/apps/files_external/l10n/cs_CZ.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Vyplňte všechna povinná pole", "Please provide a valid Dropbox app key and secret." => "Zadejte, prosím, platný klíč a bezpečnostní frázi aplikace Dropbox.", "Error configuring Google Drive storage" => "Chyba při nastavení úložiště Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Varování: není nainstalován program \"smbclient\". Není možné připojení oddílů CIFS/SMB. Prosím požádejte svého správce systému ať jej nainstaluje.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Varování: není nainstalována, nebo povolena, podpora FTP v PHP. Není možné připojení oddílů FTP. Prosím požádejte svého správce systému ať ji nainstaluje.", "External Storage" => "Externí úložiště", "Mount point" => "Přípojný bod", "Backend" => "Podpůrná vrstva", diff --git a/apps/files_external/l10n/ru.php b/apps/files_external/l10n/ru.php index 34d34a18ed..b8b5f5b1cb 100644 --- a/apps/files_external/l10n/ru.php +++ b/apps/files_external/l10n/ru.php @@ -5,6 +5,8 @@ "Fill out all required fields" => "Заполните все обязательные поля", "Please provide a valid Dropbox app key and secret." => "Пожалуйста, предоставьте действующий ключ Dropbox и пароль.", "Error configuring Google Drive storage" => "Ошибка при настройке хранилища Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Внимание: \"smbclient\" не установлен. Подключение по CIFS/SMB невозможно. Пожалуйста, обратитесь к системному администратору, чтобы установить его.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Внимание: Поддержка FTP не включена в PHP. Подключение по FTP невозможно. Пожалуйста, обратитесь к системному администратору, чтобы включить.", "External Storage" => "Внешний носитель", "Mount point" => "Точка монтирования", "Backend" => "Подсистема", diff --git a/core/l10n/ca.php b/core/l10n/ca.php index 5e5605aa5b..cf7cdfb7c9 100644 --- a/core/l10n/ca.php +++ b/core/l10n/ca.php @@ -1,4 +1,8 @@ "L'usuari %s ha compartit un fitxer amb vós", +"User %s shared a folder with you" => "L'usuari %s ha compartit una carpeta amb vós", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "L'usuari %s ha compartit el fitxer \"%s\" amb vós. Està disponible per a la descàrrega a: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "L'usuari %s ha compartit la carpeta \"%s\" amb vós. Està disponible per a la descàrrega a: %s", "Category type not provided." => "No s'ha especificat el tipus de categoria.", "No category to add?" => "No voleu afegir cap categoria?", "This category already exists: " => "Aquesta categoria ja existeix:", @@ -39,6 +43,8 @@ "Share with link" => "Comparteix amb enllaç", "Password protect" => "Protegir amb contrasenya", "Password" => "Contrasenya", +"Email link to person" => "Enllaç per correu electrónic amb la persona", +"Send" => "Envia", "Set expiration date" => "Estableix la data d'expiració", "Expiration date" => "Data d'expiració", "Share via email:" => "Comparteix per correu electrònic", @@ -55,6 +61,8 @@ "Password protected" => "Protegeix amb contrasenya", "Error unsetting expiration date" => "Error en eliminar la data d'expiració", "Error setting expiration date" => "Error en establir la data d'expiració", +"Sending ..." => "Enviant...", +"Email sent" => "El correu electrónic s'ha enviat", "ownCloud password reset" => "estableix de nou la contrasenya Owncloud", "Use the following link to reset your password: {link}" => "Useu l'enllaç següent per restablir la contrasenya: {link}", "You will receive a link to reset your password via Email." => "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya.", diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php index f0977f060d..96252ea8bb 100644 --- a/core/l10n/cs_CZ.php +++ b/core/l10n/cs_CZ.php @@ -1,4 +1,8 @@ "Uživatel %s s vámi sdílí soubor", +"User %s shared a folder with you" => "Uživatel %s s vámi sdílí složku", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "Uživatel %s s vámi sdílí soubor \"%s\". Můžete jej stáhnout zde: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "Uživatel %s s vámi sdílí složku \"%s\". Můžete ji stáhnout zde: %s", "Category type not provided." => "Nezadán typ kategorie.", "No category to add?" => "Žádná kategorie k přidání?", "This category already exists: " => "Tato kategorie již existuje: ", @@ -39,6 +43,8 @@ "Share with link" => "Sdílet s odkazem", "Password protect" => "Chránit heslem", "Password" => "Heslo", +"Email link to person" => "Odeslat osobě odkaz e-mailem", +"Send" => "Odeslat", "Set expiration date" => "Nastavit datum vypršení platnosti", "Expiration date" => "Datum vypršení platnosti", "Share via email:" => "Sdílet e-mailem:", @@ -55,6 +61,8 @@ "Password protected" => "Chráněno heslem", "Error unsetting expiration date" => "Chyba při odstraňování data vypršení platnosti", "Error setting expiration date" => "Chyba při nastavení data vypršení platnosti", +"Sending ..." => "Odesílám...", +"Email sent" => "E-mail odeslán", "ownCloud password reset" => "Obnovení hesla pro ownCloud", "Use the following link to reset your password: {link}" => "Heslo obnovíte použitím následujícího odkazu: {link}", "You will receive a link to reset your password via Email." => "Bude Vám e-mailem zaslán odkaz pro obnovu hesla.", diff --git a/core/l10n/eu.php b/core/l10n/eu.php index 0dbf3d4169..1a21ca3470 100644 --- a/core/l10n/eu.php +++ b/core/l10n/eu.php @@ -1,4 +1,8 @@ "%s erabiltzaileak zurekin fitxategi bat partekatu du ", +"User %s shared a folder with you" => "%s erabiltzaileak zurekin karpeta bat partekatu du ", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "%s erabiltzaileak \"%s\" fitxategia zurekin partekatu du. Hemen duzu eskuragarri: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "%s erabiltzaileak \"%s\" karpeta zurekin partekatu du. Hemen duzu eskuragarri: %s", "Category type not provided." => "Kategoria mota ez da zehaztu.", "No category to add?" => "Ez dago gehitzeko kategoriarik?", "This category already exists: " => "Kategoria hau dagoeneko existitzen da:", @@ -39,6 +43,8 @@ "Share with link" => "Elkarbanatu lotura batekin", "Password protect" => "Babestu pasahitzarekin", "Password" => "Pasahitza", +"Email link to person" => "Postaz bidali lotura ", +"Send" => "Bidali", "Set expiration date" => "Ezarri muga data", "Expiration date" => "Muga data", "Share via email:" => "Elkarbanatu eposta bidez:", @@ -55,6 +61,8 @@ "Password protected" => "Pasahitzarekin babestuta", "Error unsetting expiration date" => "Errorea izan da muga data kentzean", "Error setting expiration date" => "Errore bat egon da muga data ezartzean", +"Sending ..." => "Bidaltzen ...", +"Email sent" => "Eposta bidalia", "ownCloud password reset" => "ownCloud-en pasahitza berrezarri", "Use the following link to reset your password: {link}" => "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", "You will receive a link to reset your password via Email." => "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez.", diff --git a/core/l10n/it.php b/core/l10n/it.php index 7d82915ed9..0db292df59 100644 --- a/core/l10n/it.php +++ b/core/l10n/it.php @@ -1,4 +1,8 @@ "L'utente %s ha condiviso un file con te", +"User %s shared a folder with you" => "L'utente %s ha condiviso una cartella con te", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "L'utente %s ha condiviso il file \"%s\" con te. È disponibile per lo scaricamento qui: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "L'utente %s ha condiviso la cartella \"%s\" con te. È disponibile per lo scaricamento qui: %s", "Category type not provided." => "Tipo di categoria non fornito.", "No category to add?" => "Nessuna categoria da aggiungere?", "This category already exists: " => "Questa categoria esiste già: ", @@ -39,6 +43,7 @@ "Share with link" => "Condividi con collegamento", "Password protect" => "Proteggi con password", "Password" => "Password", +"Send" => "Invia", "Set expiration date" => "Imposta data di scadenza", "Expiration date" => "Data di scadenza", "Share via email:" => "Condividi tramite email:", @@ -55,6 +60,8 @@ "Password protected" => "Protetta da password", "Error unsetting expiration date" => "Errore durante la rimozione della data di scadenza", "Error setting expiration date" => "Errore durante l'impostazione della data di scadenza", +"Sending ..." => "Invio in corso...", +"Email sent" => "Messaggio inviato", "ownCloud password reset" => "Ripristino password di ownCloud", "Use the following link to reset your password: {link}" => "Usa il collegamento seguente per ripristinare la password: {link}", "You will receive a link to reset your password via Email." => "Riceverai un collegamento per ripristinare la tua password via email", diff --git a/core/l10n/pl.php b/core/l10n/pl.php index 4b8b7fc844..b780e54619 100644 --- a/core/l10n/pl.php +++ b/core/l10n/pl.php @@ -39,6 +39,8 @@ "Share with link" => "Współdziel z link", "Password protect" => "Zabezpieczone hasłem", "Password" => "Hasło", +"Email link to person" => "Email do osoby", +"Send" => "Wyślij", "Set expiration date" => "Ustaw datę wygaśnięcia", "Expiration date" => "Data wygaśnięcia", "Share via email:" => "Współdziel poprzez maila", @@ -55,6 +57,8 @@ "Password protected" => "Zabezpieczone hasłem", "Error unsetting expiration date" => "Błąd niszczenie daty wygaśnięcia", "Error setting expiration date" => "Błąd podczas ustawiania daty wygaśnięcia", +"Sending ..." => "Wysyłanie...", +"Email sent" => "Wyślij Email", "ownCloud password reset" => "restart hasła", "Use the following link to reset your password: {link}" => "Proszę użyć tego odnośnika do zresetowania hasła: {link}", "You will receive a link to reset your password via Email." => "Odnośnik służący do resetowania hasła zostanie wysłany na adres e-mail.", diff --git a/core/l10n/ru.php b/core/l10n/ru.php index 4e11ffd5c1..4db2a2f06f 100644 --- a/core/l10n/ru.php +++ b/core/l10n/ru.php @@ -1,4 +1,8 @@ "Пользователь %s поделился с вами файлом", +"User %s shared a folder with you" => "Пользователь %s открыл вам доступ к папке", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "Пользователь %s открыл вам доступ к файлу \"%s\". Он доступен для загрузки здесь: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "Пользователь %s открыл вам доступ к папке \"%s\". Она доступна для загрузки здесь: %s", "Category type not provided." => "Тип категории не предоставлен", "No category to add?" => "Нет категорий для добавления?", "This category already exists: " => "Эта категория уже существует: ", @@ -39,6 +43,8 @@ "Share with link" => "Поделиться с ссылкой", "Password protect" => "Защитить паролем", "Password" => "Пароль", +"Email link to person" => "Почтовая ссылка на персону", +"Send" => "Отправить", "Set expiration date" => "Установить срок доступа", "Expiration date" => "Дата окончания", "Share via email:" => "Поделится через электронную почту:", @@ -55,6 +61,8 @@ "Password protected" => "Защищено паролем", "Error unsetting expiration date" => "Ошибка при отмене срока доступа", "Error setting expiration date" => "Ошибка при установке срока доступа", +"Sending ..." => "Отправляется ...", +"Email sent" => "Письмо отправлено", "ownCloud password reset" => "Сброс пароля ", "Use the following link to reset your password: {link}" => "Используйте следующую ссылку чтобы сбросить пароль: {link}", "You will receive a link to reset your password via Email." => "На ваш адрес Email выслана ссылка для сброса пароля.", diff --git a/core/l10n/uk.php b/core/l10n/uk.php index 904ab03bf8..180d2a5c6b 100644 --- a/core/l10n/uk.php +++ b/core/l10n/uk.php @@ -1,4 +1,8 @@ "Користувач %s поділився файлом з вами", +"User %s shared a folder with you" => "Користувач %s поділився текою з вами", +"User %s shared the file \"%s\" with you. It is available for download here: %s" => "Користувач %s поділився файлом \"%s\" з вами. Він доступний для завантаження звідси: %s", +"User %s shared the folder \"%s\" with you. It is available for download here: %s" => "Користувач %s поділився текою \"%s\" з вами. Він доступний для завантаження звідси: %s", "Category type not provided." => "Не вказано тип категорії.", "No category to add?" => "Відсутні категорії для додавання?", "This category already exists: " => "Ця категорія вже існує: ", @@ -39,9 +43,11 @@ "Share with link" => "Опублікувати через посилання", "Password protect" => "Захистити паролем", "Password" => "Пароль", +"Email link to person" => "Ел. пошта належить Пану", +"Send" => "Надіслати", "Set expiration date" => "Встановити термін дії", "Expiration date" => "Термін дії", -"Share via email:" => "Опублікувати через електронну пошту:", +"Share via email:" => "Опублікувати через Ел. пошту:", "No people found" => "Жодної людини не знайдено", "Resharing is not allowed" => "Пере-публікація не дозволяється", "Shared in {item} with {user}" => "Опубліковано {item} для {user}", @@ -55,9 +61,11 @@ "Password protected" => "Захищено паролем", "Error unsetting expiration date" => "Помилка при відміні терміна дії", "Error setting expiration date" => "Помилка при встановленні терміна дії", +"Sending ..." => "Надсилання...", +"Email sent" => "Ел. пошта надіслана", "ownCloud password reset" => "скидання пароля ownCloud", "Use the following link to reset your password: {link}" => "Використовуйте наступне посилання для скидання пароля: {link}", -"You will receive a link to reset your password via Email." => "Ви отримаєте посилання для скидання вашого паролю на e-mail.", +"You will receive a link to reset your password via Email." => "Ви отримаєте посилання для скидання вашого паролю на Ел. пошту.", "Reset email send." => "Лист скидання відправлено.", "Request failed!" => "Невдалий запит!", "Username" => "Ім'я користувача", diff --git a/l10n/ca/core.po b/l10n/ca/core.po index 16f02963fd..0ce863841d 100644 --- a/l10n/ca/core.po +++ b/l10n/ca/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 09:48+0000\n" +"Last-Translator: rogerc \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,26 +22,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "L'usuari %s ha compartit un fitxer amb vós" #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "L'usuari %s ha compartit una carpeta amb vós" #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "L'usuari %s ha compartit el fitxer \"%s\" amb vós. Està disponible per a la descàrrega a: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "L'usuari %s ha compartit la carpeta \"%s\" amb vós. Està disponible per a la descàrrega a: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -215,11 +215,11 @@ msgstr "Contrasenya" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Enllaç per correu electrónic amb la persona" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Envia" #: js/share.js:177 msgid "Set expiration date" @@ -287,11 +287,11 @@ msgstr "Error en establir la data d'expiració" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Enviant..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "El correu electrónic s'ha enviat" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/ca/files_external.po b/l10n/ca/files_external.po index 3a881bba47..6d1515e0ba 100644 --- a/l10n/ca/files_external.po +++ b/l10n/ca/files_external.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-11 23:22+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 09:50+0000\n" +"Last-Translator: rogerc \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -46,14 +46,14 @@ msgstr "Error en configurar l'emmagatzemament Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Avís: \"smbclient\" no està instal·lat. No es pot muntar la compartició CIFS/SMB. Demaneu a l'administrador del sistema que l'instal·li." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Avís: El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar la compartició FTP. Demaneu a l'administrador del sistema que l'instal·li." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po index 4d68bbb03c..e00aa1d03f 100644 --- a/l10n/cs_CZ/core.po +++ b/l10n/cs_CZ/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 09:04+0000\n" +"Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,26 +24,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "Uživatel %s s vámi sdílí soubor" #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "Uživatel %s s vámi sdílí složku" #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "Uživatel %s s vámi sdílí soubor \"%s\". Můžete jej stáhnout zde: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "Uživatel %s s vámi sdílí složku \"%s\". Můžete ji stáhnout zde: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -217,11 +217,11 @@ msgstr "Heslo" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Odeslat osobě odkaz e-mailem" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Odeslat" #: js/share.js:177 msgid "Set expiration date" @@ -289,11 +289,11 @@ msgstr "Chyba při nastavení data vypršení platnosti" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Odesílám..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "E-mail odeslán" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/cs_CZ/files_external.po b/l10n/cs_CZ/files_external.po index 92aafaa297..240ba178d3 100644 --- a/l10n/cs_CZ/files_external.po +++ b/l10n/cs_CZ/files_external.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-11 23:22+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 08:56+0000\n" +"Last-Translator: Tomáš Chvátal \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -49,14 +49,14 @@ msgstr "Chyba při nastavení úložiště Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Varování: není nainstalován program \"smbclient\". Není možné připojení oddílů CIFS/SMB. Prosím požádejte svého správce systému ať jej nainstaluje." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Varování: není nainstalována, nebo povolena, podpora FTP v PHP. Není možné připojení oddílů FTP. Prosím požádejte svého správce systému ať ji nainstaluje." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/eu/core.po b/l10n/eu/core.po index d163c81b50..20402a0498 100644 --- a/l10n/eu/core.po +++ b/l10n/eu/core.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # Asier Urio Larrea , 2011. +# Piarres Beobide , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 11:46+0000\n" +"Last-Translator: Piarres Beobide \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,26 +23,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "%s erabiltzaileak zurekin fitxategi bat partekatu du " #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "%s erabiltzaileak zurekin karpeta bat partekatu du " #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "%s erabiltzaileak \"%s\" fitxategia zurekin partekatu du. Hemen duzu eskuragarri: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "%s erabiltzaileak \"%s\" karpeta zurekin partekatu du. Hemen duzu eskuragarri: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -215,11 +216,11 @@ msgstr "Pasahitza" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Postaz bidali lotura " #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Bidali" #: js/share.js:177 msgid "Set expiration date" @@ -287,11 +288,11 @@ msgstr "Errore bat egon da muga data ezartzean" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Bidaltzen ..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "Eposta bidalia" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/eu/files.po b/l10n/eu/files.po index 31ff303707..fc884c532e 100644 --- a/l10n/eu/files.po +++ b/l10n/eu/files.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # Asier Urio Larrea , 2011. +# Piarres Beobide , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 11:48+0000\n" +"Last-Translator: Piarres Beobide \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +27,7 @@ msgstr "Ez da arazorik izan, fitxategia ongi igo da" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Igotako fitxategiak php.ini fitxategian ezarritako upload_max_filesize muga gainditu du:" #: ajax/upload.php:23 msgid "" @@ -54,11 +55,11 @@ msgstr "Errore bat izan da diskoan idazterakoan" msgid "Files" msgstr "Fitxategiak" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "Ez elkarbanatu" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "Ezabatu" @@ -66,39 +67,39 @@ msgstr "Ezabatu" msgid "Rename" msgstr "Berrizendatu" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "{new_name} dagoeneko existitzen da" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "ordeztu" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "aholkatu izena" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "ezeztatu" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "ordezkatua {new_name}" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "desegin" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr " {new_name}-k {old_name} ordezkatu du" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "elkarbanaketa utzita {files}" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "ezabatuta {files}" @@ -108,80 +109,80 @@ msgid "" "allowed." msgstr "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta." -#: js/files.js:183 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-fitxategia sortzen ari da, denbora har dezake" -#: js/files.js:218 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu" -#: js/files.js:218 +#: js/files.js:209 msgid "Upload Error" msgstr "Igotzean errore bat suertatu da" -#: js/files.js:235 +#: js/files.js:226 msgid "Close" msgstr "Itxi" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "Zain" -#: js/files.js:274 +#: js/files.js:265 msgid "1 file uploading" msgstr "fitxategi 1 igotzen" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "{count} fitxategi igotzen" -#: js/files.js:349 js/files.js:382 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "Igoera ezeztatuta" -#: js/files.js:451 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du." -#: js/files.js:523 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Karpeta izen baliogabea. \"Shared\" karpetaren erabilera Owncloudek erreserbatuta dauka" -#: js/files.js:704 +#: js/files.js:693 msgid "{count} files scanned" msgstr "{count} fitxategi eskaneatuta" -#: js/files.js:712 +#: js/files.js:701 msgid "error while scanning" msgstr "errore bat egon da eskaneatzen zen bitartean" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "Izena" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "Tamaina" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "Aldatuta" -#: js/files.js:814 +#: js/files.js:803 msgid "1 folder" msgstr "karpeta bat" -#: js/files.js:816 +#: js/files.js:805 msgid "{count} folders" msgstr "{count} karpeta" -#: js/files.js:824 +#: js/files.js:813 msgid "1 file" msgstr "fitxategi bat" -#: js/files.js:826 +#: js/files.js:815 msgid "{count} files" msgstr "{count} fitxategi" @@ -241,28 +242,28 @@ msgstr "Igo" msgid "Cancel upload" msgstr "Ezeztatu igoera" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "Ez dago ezer. Igo zerbait!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "Deskargatu" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "Igotakoa handiegia da" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira." -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "Fitxategiak eskaneatzen ari da, itxoin mezedez." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "Orain eskaneatzen ari da" diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po index 58ef06e8a6..56ad7508ef 100644 --- a/l10n/eu/settings.po +++ b/l10n/eu/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:17+0100\n" +"PO-Revision-Date: 2012-12-13 11:48+0000\n" +"Last-Translator: Piarres Beobide \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +70,7 @@ msgstr "Hizkuntza aldatuta" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/it/core.po b/l10n/it/core.po index b77481c589..7dedc7efb1 100644 --- a/l10n/it/core.po +++ b/l10n/it/core.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 09:09+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,26 +25,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "L'utente %s ha condiviso un file con te" #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "L'utente %s ha condiviso una cartella con te" #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "L'utente %s ha condiviso il file \"%s\" con te. È disponibile per lo scaricamento qui: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "L'utente %s ha condiviso la cartella \"%s\" con te. È disponibile per lo scaricamento qui: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -222,7 +222,7 @@ msgstr "" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Invia" #: js/share.js:177 msgid "Set expiration date" @@ -290,11 +290,11 @@ msgstr "Errore durante l'impostazione della data di scadenza" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Invio in corso..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "Messaggio inviato" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/pl/core.po b/l10n/pl/core.po index 4c8fee0e91..bfca95f397 100644 --- a/l10n/pl/core.po +++ b/l10n/pl/core.po @@ -17,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 07:16+0000\n" +"Last-Translator: Cyryl Sochacki \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -223,11 +223,11 @@ msgstr "Hasło" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Email do osoby" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Wyślij" #: js/share.js:177 msgid "Set expiration date" @@ -295,11 +295,11 @@ msgstr "Błąd podczas ustawiania daty wygaśnięcia" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Wysyłanie..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "Wyślij Email" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/ru/core.po b/l10n/ru/core.po index 1575b0d931..6d05bc9e9d 100644 --- a/l10n/ru/core.po +++ b/l10n/ru/core.po @@ -7,6 +7,7 @@ # , 2011, 2012. # , 2012. # Mihail Vasiliev , 2012. +# , 2012. # , 2012. # , 2011. # Victor Bravo <>, 2012. @@ -15,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 18:19+0000\n" +"Last-Translator: sam002 \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,26 +29,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "Пользователь %s поделился с вами файлом" #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "Пользователь %s открыл вам доступ к папке" #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "Пользователь %s открыл вам доступ к файлу \"%s\". Он доступен для загрузки здесь: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "Пользователь %s открыл вам доступ к папке \"%s\". Она доступна для загрузки здесь: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -221,11 +222,11 @@ msgstr "Пароль" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Почтовая ссылка на персону" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Отправить" #: js/share.js:177 msgid "Set expiration date" @@ -293,11 +294,11 @@ msgstr "Ошибка при установке срока доступа" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Отправляется ..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "Письмо отправлено" #: lostpassword/controller.php:47 msgid "ownCloud password reset" diff --git a/l10n/ru/files.po b/l10n/ru/files.po index e15399b83d..100c8901c6 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -8,6 +8,7 @@ # , 2012. # , 2012. # Nick Remeslennikov , 2012. +# , 2012. # , 2012. # , 2011. # Victor Bravo <>, 2012. @@ -16,9 +17,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-01 00:01+0100\n" -"PO-Revision-Date: 2012-11-30 23:02+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 15:47+0000\n" +"Last-Translator: sam002 \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,7 +34,7 @@ msgstr "Файл успешно загружен" #: ajax/upload.php:21 msgid "" "The uploaded file exceeds the upload_max_filesize directive in php.ini: " -msgstr "" +msgstr "Файл превышает размер установленный upload_max_filesize в php.ini:" #: ajax/upload.php:23 msgid "" @@ -61,11 +62,11 @@ msgstr "Ошибка записи на диск" msgid "Files" msgstr "Файлы" -#: js/fileactions.js:117 templates/index.php:83 templates/index.php:84 +#: js/fileactions.js:117 templates/index.php:84 templates/index.php:85 msgid "Unshare" msgstr "Отменить публикацию" -#: js/fileactions.js:119 templates/index.php:89 templates/index.php:90 +#: js/fileactions.js:119 templates/index.php:90 templates/index.php:91 msgid "Delete" msgstr "Удалить" @@ -73,39 +74,39 @@ msgstr "Удалить" msgid "Rename" msgstr "Переименовать" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "{new_name} already exists" msgstr "{new_name} уже существует" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "replace" msgstr "заменить" -#: js/filelist.js:201 +#: js/filelist.js:199 msgid "suggest name" msgstr "предложить название" -#: js/filelist.js:201 js/filelist.js:203 +#: js/filelist.js:199 js/filelist.js:201 msgid "cancel" msgstr "отмена" -#: js/filelist.js:250 +#: js/filelist.js:248 msgid "replaced {new_name}" msgstr "заменено {new_name}" -#: js/filelist.js:250 js/filelist.js:252 js/filelist.js:284 js/filelist.js:286 +#: js/filelist.js:248 js/filelist.js:250 js/filelist.js:282 js/filelist.js:284 msgid "undo" msgstr "отмена" -#: js/filelist.js:252 +#: js/filelist.js:250 msgid "replaced {new_name} with {old_name}" msgstr "заменено {new_name} на {old_name}" -#: js/filelist.js:284 +#: js/filelist.js:282 msgid "unshared {files}" msgstr "не опубликованные {files}" -#: js/filelist.js:286 +#: js/filelist.js:284 msgid "deleted {files}" msgstr "удаленные {files}" @@ -115,80 +116,80 @@ msgid "" "allowed." msgstr "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы." -#: js/files.js:183 +#: js/files.js:174 msgid "generating ZIP-file, it may take some time." msgstr "создание ZIP-файла, это может занять некоторое время." -#: js/files.js:218 +#: js/files.js:209 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Не удается загрузить файл размером 0 байт в каталог" -#: js/files.js:218 +#: js/files.js:209 msgid "Upload Error" msgstr "Ошибка загрузки" -#: js/files.js:235 +#: js/files.js:226 msgid "Close" msgstr "Закрыть" -#: js/files.js:254 js/files.js:368 js/files.js:398 +#: js/files.js:245 js/files.js:359 js/files.js:389 msgid "Pending" msgstr "Ожидание" -#: js/files.js:274 +#: js/files.js:265 msgid "1 file uploading" msgstr "загружается 1 файл" -#: js/files.js:277 js/files.js:331 js/files.js:346 +#: js/files.js:268 js/files.js:322 js/files.js:337 msgid "{count} files uploading" msgstr "{count} файлов загружается" -#: js/files.js:349 js/files.js:382 +#: js/files.js:340 js/files.js:373 msgid "Upload cancelled." msgstr "Загрузка отменена." -#: js/files.js:451 +#: js/files.js:442 msgid "" "File upload is in progress. Leaving the page now will cancel the upload." msgstr "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку." -#: js/files.js:523 +#: js/files.js:512 msgid "Invalid folder name. Usage of \"Shared\" is reserved by Owncloud" msgstr "Не правильное имя папки. Имя \"Shared\" резервировано в Owncloud" -#: js/files.js:704 +#: js/files.js:693 msgid "{count} files scanned" msgstr "{count} файлов просканировано" -#: js/files.js:712 +#: js/files.js:701 msgid "error while scanning" msgstr "ошибка во время санирования" -#: js/files.js:785 templates/index.php:65 +#: js/files.js:774 templates/index.php:66 msgid "Name" msgstr "Название" -#: js/files.js:786 templates/index.php:76 +#: js/files.js:775 templates/index.php:77 msgid "Size" msgstr "Размер" -#: js/files.js:787 templates/index.php:78 +#: js/files.js:776 templates/index.php:79 msgid "Modified" msgstr "Изменён" -#: js/files.js:814 +#: js/files.js:803 msgid "1 folder" msgstr "1 папка" -#: js/files.js:816 +#: js/files.js:805 msgid "{count} folders" msgstr "{count} папок" -#: js/files.js:824 +#: js/files.js:813 msgid "1 file" msgstr "1 файл" -#: js/files.js:826 +#: js/files.js:815 msgid "{count} files" msgstr "{count} файлов" @@ -248,28 +249,28 @@ msgstr "Загрузить" msgid "Cancel upload" msgstr "Отмена загрузки" -#: templates/index.php:57 +#: templates/index.php:58 msgid "Nothing in here. Upload something!" msgstr "Здесь ничего нет. Загрузите что-нибудь!" -#: templates/index.php:71 +#: templates/index.php:72 msgid "Download" msgstr "Скачать" -#: templates/index.php:103 +#: templates/index.php:104 msgid "Upload too large" msgstr "Файл слишком большой" -#: templates/index.php:105 +#: templates/index.php:106 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Файлы, которые Вы пытаетесь загрузить, превышают лимит для файлов на этом сервере." -#: templates/index.php:110 +#: templates/index.php:111 msgid "Files are being scanned, please wait." msgstr "Подождите, файлы сканируются." -#: templates/index.php:113 +#: templates/index.php:114 msgid "Current scanning" msgstr "Текущее сканирование" diff --git a/l10n/ru/files_external.po b/l10n/ru/files_external.po index 5873f93dc6..e6f36547a0 100644 --- a/l10n/ru/files_external.po +++ b/l10n/ru/files_external.po @@ -4,14 +4,15 @@ # # Translators: # Denis , 2012. +# , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-11 23:22+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 17:02+0000\n" +"Last-Translator: sam002 \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,14 +48,14 @@ msgstr "Ошибка при настройке хранилища Google Drive" msgid "" "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares " "is not possible. Please ask your system administrator to install it." -msgstr "" +msgstr "Внимание: \"smbclient\" не установлен. Подключение по CIFS/SMB невозможно. Пожалуйста, обратитесь к системному администратору, чтобы установить его." #: lib/config.php:435 msgid "" "Warning: The FTP support in PHP is not enabled or installed. Mounting" " of FTP shares is not possible. Please ask your system administrator to " "install it." -msgstr "" +msgstr "Внимание: Поддержка FTP не включена в PHP. Подключение по FTP невозможно. Пожалуйста, обратитесь к системному администратору, чтобы включить." #: templates/settings.php:3 msgid "External Storage" diff --git a/l10n/ru/settings.po b/l10n/ru/settings.po index 8c3270fb08..9d3b781913 100644 --- a/l10n/ru/settings.po +++ b/l10n/ru/settings.po @@ -9,6 +9,7 @@ # , 2012. # Nick Remeslennikov , 2012. # , 2012. +# , 2012. # , 2012. # , 2011. # Victor Bravo <>, 2012. @@ -17,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-03 00:04+0100\n" -"PO-Revision-Date: 2012-12-02 03:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:17+0100\n" +"PO-Revision-Date: 2012-12-13 15:49+0000\n" +"Last-Translator: sam002 \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -77,7 +78,7 @@ msgstr "Язык изменён" #: ajax/togglegroups.php:12 msgid "Admins can't remove themself from the admin group" -msgstr "" +msgstr "Администратор не может удалить сам себя из группы admin" #: ajax/togglegroups.php:28 #, php-format diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index b804e0b90f..74a33fc3dd 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index fc7d3c606b..8c56249c2d 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 7eefeaead5..15063c507e 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 409cef6405..5ae592eab3 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 96202f6876..c43a5b9793 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 8fc23dcb84..89da014ec6 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 35957a41cf..1a2475ddde 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index cc3f110a8e..4606b3de7e 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 2e67007735..f6c93d44d7 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index 352ed49cac..edd944b069 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/uk/core.po b/l10n/uk/core.po index 004b502564..6fa7d5e24e 100644 --- a/l10n/uk/core.po +++ b/l10n/uk/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-12-13 00:17+0100\n" -"PO-Revision-Date: 2012-12-12 23:17+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-12-14 00:16+0100\n" +"PO-Revision-Date: 2012-12-13 15:49+0000\n" +"Last-Translator: volodya327 \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,26 +24,26 @@ msgstr "" #: ajax/share.php:84 #, php-format msgid "User %s shared a file with you" -msgstr "" +msgstr "Користувач %s поділився файлом з вами" #: ajax/share.php:86 #, php-format msgid "User %s shared a folder with you" -msgstr "" +msgstr "Користувач %s поділився текою з вами" #: ajax/share.php:88 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" -msgstr "" +msgstr "Користувач %s поділився файлом \"%s\" з вами. Він доступний для завантаження звідси: %s" #: ajax/share.php:90 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " "here: %s" -msgstr "" +msgstr "Користувач %s поділився текою \"%s\" з вами. Він доступний для завантаження звідси: %s" #: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25 msgid "Category type not provided." @@ -217,11 +217,11 @@ msgstr "Пароль" #: js/share.js:172 msgid "Email link to person" -msgstr "" +msgstr "Ел. пошта належить Пану" #: js/share.js:173 msgid "Send" -msgstr "" +msgstr "Надіслати" #: js/share.js:177 msgid "Set expiration date" @@ -233,7 +233,7 @@ msgstr "Термін дії" #: js/share.js:210 msgid "Share via email:" -msgstr "Опублікувати через електронну пошту:" +msgstr "Опублікувати через Ел. пошту:" #: js/share.js:212 msgid "No people found" @@ -289,11 +289,11 @@ msgstr "Помилка при встановленні терміна дії" #: js/share.js:568 msgid "Sending ..." -msgstr "" +msgstr "Надсилання..." #: js/share.js:579 msgid "Email sent" -msgstr "" +msgstr "Ел. пошта надіслана" #: lostpassword/controller.php:47 msgid "ownCloud password reset" @@ -305,7 +305,7 @@ msgstr "Використовуйте наступне посилання для #: lostpassword/templates/lostpassword.php:3 msgid "You will receive a link to reset your password via Email." -msgstr "Ви отримаєте посилання для скидання вашого паролю на e-mail." +msgstr "Ви отримаєте посилання для скидання вашого паролю на Ел. пошту." #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." diff --git a/settings/l10n/eu.php b/settings/l10n/eu.php index d6c87e0928..7d79c79ced 100644 --- a/settings/l10n/eu.php +++ b/settings/l10n/eu.php @@ -11,6 +11,7 @@ "Authentication error" => "Autentifikazio errorea", "Unable to delete user" => "Ezin izan da erabiltzailea ezabatu", "Language changed" => "Hizkuntza aldatuta", +"Admins can't remove themself from the admin group" => "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", "Unable to add user to group %s" => "Ezin izan da erabiltzailea %s taldera gehitu", "Unable to remove user from group %s" => "Ezin izan da erabiltzailea %s taldetik ezabatu", "Disable" => "Ez-gaitu", diff --git a/settings/l10n/ru.php b/settings/l10n/ru.php index 126cc3fcd0..4853f6fc2d 100644 --- a/settings/l10n/ru.php +++ b/settings/l10n/ru.php @@ -11,6 +11,7 @@ "Authentication error" => "Ошибка авторизации", "Unable to delete user" => "Невозможно удалить пользователя", "Language changed" => "Язык изменён", +"Admins can't remove themself from the admin group" => "Администратор не может удалить сам себя из группы admin", "Unable to add user to group %s" => "Невозможно добавить пользователя в группу %s", "Unable to remove user from group %s" => "Невозможно удалить пользователя из группы %s", "Disable" => "Выключить", From 4466e06e7d9413a27d462570066254e2d33d76ef Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 13 Dec 2012 01:30:25 +0100 Subject: [PATCH 476/481] use username, not passed loginname, might differ --- lib/connector/sabre/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/connector/sabre/auth.php b/lib/connector/sabre/auth.php index db8f005745..4224dbbb14 100644 --- a/lib/connector/sabre/auth.php +++ b/lib/connector/sabre/auth.php @@ -32,7 +32,7 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { */ protected function validateUserPass($username, $password) { if (OC_User::isLoggedIn()) { - OC_Util::setupFS($username); + OC_Util::setupFS(OC_User::getUser()); return true; } else { OC_Util::setUpFS();//login hooks may need early access to the filesystem From 627da205b32f0733e73e92c3c9702ed5b4f863f7 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 13 Dec 2012 01:30:34 +0100 Subject: [PATCH 477/481] implement getCurrentUser in Sabre Auth Connector, fixes #508 --- lib/connector/sabre/auth.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/connector/sabre/auth.php b/lib/connector/sabre/auth.php index 4224dbbb14..6990d928cf 100644 --- a/lib/connector/sabre/auth.php +++ b/lib/connector/sabre/auth.php @@ -45,4 +45,19 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { } } } + + /** + * Returns information about the currently logged in username. + * + * If nobody is currently logged in, this method should return null. + * + * @return string|null + */ + public function getCurrentUser() { + $user = OC_User::getUser(); + if(!$user) { + return null; + } + return $user; + } } From 5cbe8d637b14995a66f829caad054132c7745701 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 14 Dec 2012 00:29:15 +0100 Subject: [PATCH 478/481] Show conflict warning when user_ldap and user_webdavauth are enabled --- apps/user_ldap/appinfo/app.php | 3 +++ apps/user_ldap/appinfo/info.xml | 4 +++- apps/user_ldap/css/settings.css | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index 0eec7829a4..ce3079da0b 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -42,3 +42,6 @@ $entry = array( ); OCP\Backgroundjob::addRegularTask('OCA\user_ldap\lib\Jobs', 'updateGroups'); +if(OCP\App::isEnabled('user_webdavauth')) { + OCP\Util::writeLog('user_ldap', 'user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour', OCP\Util::WARN); +} diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml index 30fbf687db..a760577527 100644 --- a/apps/user_ldap/appinfo/info.xml +++ b/apps/user_ldap/appinfo/info.xml @@ -2,7 +2,9 @@ user_ldap LDAP user and group backend - Authenticate Users by LDAP + Authenticate users and groups by LDAP resp. Active Directoy. + + This app is not compatible to the WebDAV user backend. AGPL Dominik Schmidt and Arthur Schiwon 4.9 diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 30c5c175c9..f3f41fb2d8 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -7,4 +7,9 @@ #ldap fieldset input { width: 70%; display: inline-block; +} + +.ldapwarning { + margin-left: 1.4em; + color: #FF3B3B; } \ No newline at end of file From b54390f432047dd13b24159107e5bd0351859d55 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 14 Dec 2012 00:29:48 +0100 Subject: [PATCH 479/481] Show conflict warning when user_ldap and user_webdavauth are enabled --- apps/user_ldap/templates/settings.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index d10062c1d9..470f068484 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -4,6 +4,10 @@
  • LDAP Basic
  • Advanced
  • + '.$l->t('Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour. Please ask your system administrator to disable one of them.').'

    '; + } + ?>

    From 414b7e8e036873183a8a21a603121bbe39a8c901 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 14 Dec 2012 00:58:29 +0100 Subject: [PATCH 480/481] Also show a more prominent warning when php_ldap is not installed --- apps/user_ldap/templates/settings.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index 470f068484..8522d2f835 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -7,6 +7,9 @@ '.$l->t('Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour. Please ask your system administrator to disable one of them.').'

    '; } + if(!function_exists('ldap_connect')) { + echo '

    '.$l->t('Warning: The PHP LDAP module needs is not installed, the backend will not work. Please ask your system administrator to install it.').'

    '; + } ?>

    From f0893fb8fe7f0642ae30de2e1168472377c127e2 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 14 Dec 2012 00:59:23 +0100 Subject: [PATCH 481/481] Give also hint about possible conflicts in the user_webdavauth description --- apps/user_webdavauth/appinfo/info.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/user_webdavauth/appinfo/info.xml b/apps/user_webdavauth/appinfo/info.xml index 0d9f529ed1..e51f2e9ec4 100755 --- a/apps/user_webdavauth/appinfo/info.xml +++ b/apps/user_webdavauth/appinfo/info.xml @@ -2,7 +2,9 @@ user_webdavauth WebDAV user backend - Authenticate users by a WebDAV call. You can use any WebDAV server, ownCloud server or other webserver to authenticate. It should return http 200 for right credentials and http 401 for wrong ones. + Authenticate users by a WebDAV call. You can use any WebDAV server, ownCloud server or other webserver to authenticate. It should return http 200 for right credentials and http 401 for wrong ones. + + This app is not compatible to the LDAP user and group backend. AGPL Frank Karlitschek 4.9

    J{fW+SfXRq-eaET&qYo^DAbnH>1R3g` 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 literal 0 HcmV?d00001 From 0c40a061e4925181101196d379137fb020924980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 27 Oct 2012 12:59:28 +0200 Subject: [PATCH 066/481] fix paths in preeseed-config.php --- tests/preseed-config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/preseed-config.php b/tests/preseed-config.php index fbf60ad2e2..7eadccbe76 100644 --- a/tests/preseed-config.php +++ b/tests/preseed-config.php @@ -5,13 +5,13 @@ $CONFIG = array ( array ( 0 => array ( - 'path' => '/home/thomas/Development/owncloud/core/apps', + 'path' => OC::$SERVERROOT.'/apps', 'url' => '/apps', 'writable' => false, ), 1 => array ( - 'path' => '/home/thomas/Development/owncloud/core/apps2', + 'path' => OC::$SERVERROOT.'/apps2', 'url' => '/apps2', 'writable' => false, ) From 939b51e46f23fe6f5991a05862da94bb3adff1ab Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 15:10:21 +0200 Subject: [PATCH 067/481] Fix download url generation --- apps/files/js/fileactions.js | 2 +- core/js/js.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 0cf4a05222..1cf80352be 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -157,7 +157,7 @@ $(document).ready(function(){ var downloadScope = 'file'; } FileActions.register(downloadScope,'Download', OC.PERMISSION_READ, function(){return OC.imagePath('core','actions/download');},function(filename){ - window.location=OC.filePath('files', 'ajax', 'download.php') + '&files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent($('#dir').val()); + window.location=OC.filePath('files', 'ajax', 'download.php') + '?files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent($('#dir').val()); }); }); diff --git a/core/js/js.js b/core/js/js.js index 130d413296..6ed50b42bd 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -62,7 +62,7 @@ function escapeHTML(s) { * @return string */ function fileDownloadPath(dir, file) { - return OC.filePath('files', 'ajax', 'download.php')+'&files='+encodeURIComponent(file)+'&dir='+encodeURIComponent(dir); + return OC.filePath('files', 'ajax', 'download.php')+'?files='+encodeURIComponent(file)+'&dir='+encodeURIComponent(dir); } var OC={ From c1a0e809bf865190f669399d9b4a1b51e35c08d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Sat, 27 Oct 2012 15:26:28 +0200 Subject: [PATCH 068/481] don't call $('#found_versions').chosen(); after opening the history drop-down since no version is selected at the beginning --- apps/files_versions/js/versions.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js index 426d521df8..b9c5468981 100644 --- a/apps/files_versions/js/versions.js +++ b/apps/files_versions/js/versions.js @@ -73,7 +73,6 @@ function createVersionsDropdown(filename, files) { $.each( versions, function(index, row ) { addVersion( row ); }); - $('#found_versions').chosen(); } else { $('#found_versions').hide(); $('#makelink').hide(); From a93660d37a49128151c359b435c5d108160e8d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Sat, 27 Oct 2012 15:24:01 +0200 Subject: [PATCH 069/481] fix broken paths in versions app --- apps/files_versions/lib/versions.php | 559 +++++++++++++-------------- 1 file changed, 279 insertions(+), 280 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 56878b470d..56664427fb 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -1,280 +1,279 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -/** - * Versions - * - * A class to handle the versioning of files. - */ - -namespace OCA_Versions; - -class Storage { - - - // config.php configuration: - // - files_versions - // - files_versionsfolder - // - files_versionsblacklist - // - files_versionsmaxfilesize - // - files_versionsinterval - // - files_versionmaxversions - // - // todo: - // - finish porting to OC_FilesystemView to enable network transparency - // - add transparent compression. first test if it´s worth it. - - const DEFAULTENABLED=true; - const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; - const DEFAULTMAXFILESIZE=1048576; // 10MB - const DEFAULTMININTERVAL=60; // 1 min - const DEFAULTMAXVERSIONS=50; - - private static function getUidAndFilename($filename) - { - if (\OCP\App::isEnabled('files_sharing') - && substr($filename, 0, 7) == '/Shared' - && $source = \OCP\Share::getItemSharedWith('file', - substr($filename, 7), - \OC_Share_Backend_File::FORMAT_SHARED_STORAGE)) { - $filename = $source['path']; - $pos = strpos($filename, '/files', 1); - $uid = substr($filename, 1, $pos - 1); - $filename = substr($filename, $pos + 6); - } else { - $uid = \OCP\User::getUser(); - } - return array($uid, $filename); - } - - /** - * store a new version of a file. - */ - public function store($filename) { - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { - list($uid, $filename) = self::getUidAndFilename($filename); - $userHome = \OC_User::getHome($uid); - $files_view = new \OC_FilesystemView($userHome.'/files'); - $users_view = new \OC_FilesystemView($userHome); - - //check if source file already exist as version to avoid recursions. - // todo does this check work? - if ($users_view->file_exists($filename)) { - return false; - } - - // check if filename is a directory - if($files_view->is_dir($filename)) { - return false; - } - - // check filetype blacklist - $blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST)); - foreach($blacklist as $bl) { - $parts=explode('.', $filename); - $ext=end($parts); - if(strtolower($ext)==$bl) { - return false; - } - } - // we should have a source file to work with - if (!$files_view->file_exists($filename)) { - return false; - } - - // check filesize - if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)) { - return false; - } - - - // check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval) - if ($uid == \OCP\User::getUser()) { - $versions_fileview = new \OC_FilesystemView($userHome.'/files_versions'); - $versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath(''); - $matches=glob($versionsFolderName.'/'.$filename.'.v*'); - sort($matches); - $parts=explode('.v', end($matches)); - if((end($parts)+Storage::DEFAULTMININTERVAL)>time()) { - return false; - } - } - - - // create all parent folders - $info=pathinfo($filename); - if(!file_exists($versionsFolderName.'/'.$info['dirname'])) { - mkdir($versionsFolderName.'/'.$info['dirname'],0750, true); - } - - // store a new version of a file - $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.time()); - - // expire old revisions if necessary - Storage::expire($filename); - } - } - - - /** - * rollback to an old version of a file. - */ - public static function rollback($filename,$revision) { - - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { - list($uid, $filename) = self::getUidAndFilename($filename); - $users_view = new \OC_FilesystemView(\OC_User::getHome($uid)); - - // rollback - if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) { - - return true; - - }else{ - - return false; - - } - - } - - } - - /** - * check if old versions of a file exist. - */ - public static function isversioned($filename) { - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { - list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView(\OC_User::getHome($uid).'/files_versions'); - - $versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath(''); - - // check for old versions - $matches=glob($versionsFolderName.$filename.'.v*'); - if(count($matches)>0) { - return true; - }else{ - return false; - } - }else{ - return(false); - } - } - - - - /** - * @brief get a list of all available versions of a file in descending chronological order - * @param $filename file to find versions of, relative to the user files dir - * @param $count number of versions to return - * @returns array - */ - public static function getVersions( $filename, $count = 0 ) { - - if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { - list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView(\OC_User::getHome($uid).'/files_versions'); - - $versionsFolderName = \OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath(''); - $versions = array(); - - // fetch for old versions - $matches = glob( $versionsFolderName.'/'.$filename.'.v*' ); - - sort( $matches ); - - $i = 0; - - $files_view = new \OC_FilesystemView(\OC_User::getHome($uid).'/files'); - $local_file = $files_view->getLocalFile($filename); - foreach( $matches as $ma ) { - - $i++; - $versions[$i]['cur'] = 0; - $parts = explode( '.v', $ma ); - $versions[$i]['version'] = ( end( $parts ) ); - - // if file with modified date exists, flag it in array as currently enabled version - ( \md5_file( $ma ) == \md5_file( $local_file ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 ); - - } - - $versions = array_reverse( $versions ); - - foreach( $versions as $key => $value ) { - - // flag the first matched file in array (which will have latest modification date) as current version - if ( $value['fileMatch'] ) { - - $value['cur'] = 1; - break; - - } - - } - - $versions = array_reverse( $versions ); - - // only show the newest commits - if( $count != 0 and ( count( $versions )>$count ) ) { - - $versions = array_slice( $versions, count( $versions ) - $count ); - - } - - return( $versions ); - - - } else { - - // if versioning isn't enabled then return an empty array - return( array() ); - - } - - } - - /** - * @brief Erase a file's versions which exceed the set quota - */ - public static function expire($filename) { - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { - list($uid, $filename) = self::getUidAndFilename($filename); - $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); - - $versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath(''); - - // check for old versions - $matches = glob( $versionsFolderName.'/'.$filename.'.v*' ); - - if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) { - - $numberToDelete = count($matches) - \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ); - - // delete old versions of a file - $deleteItems = array_slice( $matches, 0, $numberToDelete ); - - foreach( $deleteItems as $de ) { - - unlink( $versionsFolderName.'/'.$filename.'.v'.$de ); - - } - } - } - } - - /** - * @brief Erase all old versions of all user files - * @return true/false - */ - public function expireAll() { - $view = \OCP\Files::getStorage('files_versions'); - return $view->deleteAll('', true); - } -} + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/** + * Versions + * + * A class to handle the versioning of files. + */ + +namespace OCA_Versions; + +class Storage { + + + // config.php configuration: + // - files_versions + // - files_versionsfolder + // - files_versionsblacklist + // - files_versionsmaxfilesize + // - files_versionsinterval + // - files_versionmaxversions + // + // todo: + // - finish porting to OC_FilesystemView to enable network transparency + // - add transparent compression. first test if it´s worth it. + + const DEFAULTENABLED=true; + const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; + const DEFAULTMAXFILESIZE=1048576; // 10MB + const DEFAULTMININTERVAL=60; // 1 min + const DEFAULTMAXVERSIONS=50; + + private static function getUidAndFilename($filename) + { + if (\OCP\App::isEnabled('files_sharing') + && substr($filename, 0, 7) == '/Shared' + && $source = \OCP\Share::getItemSharedWith('file', + substr($filename, 7), + \OC_Share_Backend_File::FORMAT_SHARED_STORAGE)) { + $filename = $source['path']; + $pos = strpos($filename, '/files', 1); + $uid = substr($filename, 1, $pos - 1); + $filename = substr($filename, $pos + 6); + } else { + $uid = \OCP\User::getUser(); + } + return array($uid, $filename); + } + + /** + * store a new version of a file. + */ + public function store($filename) { + if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + list($uid, $filename) = self::getUidAndFilename($filename); + $files_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/files'); + $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + + //check if source file already exist as version to avoid recursions. + // todo does this check work? + if ($users_view->file_exists($filename)) { + return false; + } + + // check if filename is a directory + if($files_view->is_dir($filename)) { + return false; + } + + // check filetype blacklist + $blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST)); + foreach($blacklist as $bl) { + $parts=explode('.', $filename); + $ext=end($parts); + if(strtolower($ext)==$bl) { + return false; + } + } + // we should have a source file to work with + if (!$files_view->file_exists($filename)) { + return false; + } + + // check filesize + if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)) { + return false; + } + + + // check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval) + if ($uid == \OCP\User::getUser()) { + $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); + $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); + $matches=glob($versionsName.'.v*'); + sort($matches); + $parts=explode('.v',end($matches)); + if((end($parts)+Storage::DEFAULTMININTERVAL)>time()) { + return false; + } + } + + + // create all parent folders + $info=pathinfo($filename); + if(!file_exists($versionsFolderName.'/'.$info['dirname'])) { + mkdir($versionsFolderName.'/'.$info['dirname'],0750,true); + } + + // store a new version of a file + $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.time()); + + // expire old revisions if necessary + Storage::expire($filename); + } + } + + + /** + * rollback to an old version of a file. + */ + public static function rollback($filename,$revision) { + + if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + list($uid, $filename) = self::getUidAndFilename($filename); + $users_view = new \OC_FilesystemView('/'.\OCP\User::getUser()); + + // rollback + if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) { + + return true; + + }else{ + + return false; + + } + + } + + } + + /** + * check if old versions of a file exist. + */ + public static function isversioned($filename) { + if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + list($uid, $filename) = self::getUidAndFilename($filename); + $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + + $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); + + // check for old versions + $matches=glob($versionsName.'.v*'); + if(count($matches)>0) { + return true; + }else{ + return false; + } + }else{ + return(false); + } + } + + + + /** + * @brief get a list of all available versions of a file in descending chronological order + * @param $filename file to find versions of, relative to the user files dir + * @param $count number of versions to return + * @returns array + */ + public static function getVersions( $filename, $count = 0 ) { + if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { + list($uid, $filename) = self::getUidAndFilename($filename); + $versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions'); + + $versionsName = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); + $versions = array(); + // fetch for old versions + $matches = glob( $versionsName.'.v*' ); + + sort( $matches ); + + $i = 0; + + $files_view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files'); + $local_file = $files_view->getLocalFile($filename); + foreach( $matches as $ma ) { + + $i++; + $versions[$i]['cur'] = 0; + $parts = explode( '.v', $ma ); + $versions[$i]['version'] = ( end( $parts ) ); + + // if file with modified date exists, flag it in array as currently enabled version + ( \md5_file( $ma ) == \md5_file( $local_file ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 ); + + } + + $versions = array_reverse( $versions ); + + foreach( $versions as $key => $value ) { + + // flag the first matched file in array (which will have latest modification date) as current version + if ( $value['fileMatch'] ) { + + $value['cur'] = 1; + break; + + } + + } + + $versions = array_reverse( $versions ); + + // only show the newest commits + if( $count != 0 and ( count( $versions )>$count ) ) { + + $versions = array_slice( $versions, count( $versions ) - $count ); + + } + + return( $versions ); + + + } else { + + // if versioning isn't enabled then return an empty array + return( array() ); + + } + + } + + /** + * @brief Erase a file's versions which exceed the set quota + */ + public static function expire($filename) { + if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + list($uid, $filename) = self::getUidAndFilename($filename); + $versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); + + $versionsName=\OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); + + // check for old versions + $matches = glob( $versionsName.'.v*' ); + + if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) { + + $numberToDelete = count($matches) - \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ); + + // delete old versions of a file + $deleteItems = array_slice( $matches, 0, $numberToDelete ); + + foreach( $deleteItems as $de ) { + + unlink( $versionsName.'.v'.$de ); + + } + } + } + } + + /** + * @brief Erase all old versions of all user files + * @return true/false + */ + public function expireAll() { + $view = \OCP\Files::getStorage('files_versions'); + return $view->deleteAll('', true); + } +} +>>>>>>> 12ea922... fix broken paths in versions app From 8a3eda16f2b134477db5023095ca8744f7e9c4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Sat, 27 Oct 2012 15:23:35 +0200 Subject: [PATCH 070/481] fix function documentation --- lib/user.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/user.php b/lib/user.php index 064fcbad96..869984a16e 100644 --- a/lib/user.php +++ b/lib/user.php @@ -369,8 +369,7 @@ class OC_User { * @param $password The password * @returns string * - * Check if the password is correct without logging in the user - * returns the user id or false + * returns the path to the users home directory */ public static function getHome($uid) { foreach(self::$_usedBackends as $backend) { From c1c76539cc2878c058de15892dd05d6dd8b4b9a5 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 27 Oct 2012 16:24:24 +0200 Subject: [PATCH 071/481] Include copy of Symfony routing component, and don't use composer --- .gitignore | 4 - 3rdparty/bin/composer | Bin 631359 -> 0 bytes .../Component/Routing/Annotation/Route.php | 103 ++++++ .../Component/Routing/CompiledRoute.php | 134 ++++++++ .../Routing/Exception/ExceptionInterface.php | 23 ++ .../Exception/InvalidParameterException.php | 23 ++ .../Exception/MethodNotAllowedException.php | 38 +++ .../MissingMandatoryParametersException.php | 24 ++ .../Exception/ResourceNotFoundException.php | 25 ++ .../Exception/RouteNotFoundException.php | 23 ++ .../Generator/Dumper/GeneratorDumper.php | 39 +++ .../Dumper/GeneratorDumperInterface.php | 45 +++ .../Generator/Dumper/PhpGeneratorDumper.php | 150 +++++++++ .../Routing/Generator/UrlGenerator.php | 176 ++++++++++ .../Generator/UrlGeneratorInterface.php | 37 +++ .../routing/Symfony/Component/Routing/LICENSE | 19 ++ .../Routing/Loader/AnnotationClassLoader.php | 213 ++++++++++++ .../Loader/AnnotationDirectoryLoader.php | 77 +++++ .../Routing/Loader/AnnotationFileLoader.php | 125 +++++++ .../Routing/Loader/ClosureLoader.php | 54 +++ .../Routing/Loader/PhpFileLoader.php | 64 ++++ .../Routing/Loader/XmlFileLoader.php | 224 +++++++++++++ .../Routing/Loader/YamlFileLoader.php | 142 ++++++++ .../Loader/schema/routing/routing-1.0.xsd | 38 +++ .../Routing/Matcher/ApacheUrlMatcher.php | 76 +++++ .../Matcher/Dumper/ApacheMatcherDumper.php | 155 +++++++++ .../Routing/Matcher/Dumper/MatcherDumper.php | 44 +++ .../Matcher/Dumper/MatcherDumperInterface.php | 41 +++ .../Matcher/Dumper/PhpMatcherDumper.php | 293 ++++++++++++++++ .../Matcher/RedirectableUrlMatcher.php | 53 +++ .../RedirectableUrlMatcherInterface.php | 35 ++ .../Component/Routing/Matcher/UrlMatcher.php | 151 +++++++++ .../Routing/Matcher/UrlMatcherInterface.php | 38 +++ .../Symfony/Component/Routing/README.md | 32 ++ .../Component/Routing/RequestContext.php | 250 ++++++++++++++ .../Routing/RequestContextAwareInterface.php | 27 ++ .../Symfony/Component/Routing/Route.php | 312 ++++++++++++++++++ .../Component/Routing/RouteCollection.php | 259 +++++++++++++++ .../Component/Routing/RouteCompiler.php | 128 +++++++ .../Routing/RouteCompilerInterface.php | 29 ++ .../Symfony/Component/Routing/Router.php | 263 +++++++++++++++ .../Component/Routing/RouterInterface.php | 26 ++ .../Symfony/Component/Routing/composer.json | 29 ++ composer.json | 18 - 44 files changed, 4037 insertions(+), 22 deletions(-) delete mode 100755 3rdparty/bin/composer create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Annotation/Route.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/CompiledRoute.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/LICENSE create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/README.md create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RequestContext.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Route.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCollection.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompiler.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/Router.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/RouterInterface.php create mode 100644 3rdparty/symfony/routing/Symfony/Component/Routing/composer.json delete mode 100644 composer.json diff --git a/.gitignore b/.gitignore index 4ae39ed7fa..4749dea19d 100644 --- a/.gitignore +++ b/.gitignore @@ -54,7 +54,3 @@ nbproject # WebFinger .well-known /.buildpath -3rdparty/autoload.php -3rdparty/composer/ -3rdparty/symfony/ -composer.lock diff --git a/3rdparty/bin/composer b/3rdparty/bin/composer deleted file mode 100755 index 7999bd4ff6875d721d50c01d28e4b371c78d21d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631359 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≧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